|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 purplenight 于 2016-1-12 20:43 编辑
- assume cs:code,ds:data,es:table
- data segment
- db '1975', '1976', '1977', '1978', '1979', '1980', '1981'
- db '1982', '1983', '1984', '1985', '1986', '1987', '1988'
- db '1989', '1990', '1991', '1992', '1993', '1994', '1995'
-
- dd 16, 22, 382, 1356, 2390, 8000, 16000
- dd 24486, 50065, 97479, 140417, 197514, 345980, 590827
- dd 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5837000
-
- dw 3, 7, 9, 13, 28, 38, 130
- dw 220, 476, 778, 1001, 1442, 2258, 2793
- dw 4037, 5635, 8226, 11542, 14430, 15257, 17800
- data ends
- table segment
- db 21 dup ('year summ ne ?? ')
- table ends
- new segment
- ; db 672 dup(0)
- db 21 dup('year 7 5 ', 0)
- new ends
- code segment
- start: mov ax, data
- mov ds, ax
- mov ax, table
- mov es, ax
- mov bx, 0
- mov si, 0
- mov di, 0
-
- push dx ;S1循环中会被使用
- push di
- push si
- push bx
- push ax
- mov cx, 21
- S1: mov ax, [bx].0h
- mov dx, [bx].2h
- mov es:[si].0h, ax
- mov es:[si].2h, dx
-
- mov ax, [bx].54h
- mov dx, [bx].56h
- mov es:[si].5h, ax
- mov es:[si].7h, dx
- div word ptr [di].0A8h ;ds:0A8h[di]
- mov es:[si].0dh, ax
-
- mov ax, [di].0A8h
- mov es:[si].0Ah, ax
-
- add di, 2
- add bx, 4
- add si, 16
- loop S1
-
- pop ax ;table偏移首地址
- pop bx ;0
- pop si ;0
- pop di ;0
- pop dx ;循环中dx值被修改了
-
- ;这一部分主要作用将table16*21内存区间的数据按照如下格式转换
- ; table 16*21
- ; 1466:0000 31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20 1975 .... .. ..
- ; 1466:0010 31 39 37 36 20 16 00 00-00 20 07 00 20 03 00 20 1976 .... .. ..
- ; __ __ __ __ 转换为10进制
- ; new 32*21 dx=h ax=L
- ; 1466:00xx 31 39 37 35 00 00 00 00 00 00 __ __ __ __
- ;
- mov ax, new
- mov ds, ax
-
- push dx
- push di
- push si
- push bx
- push ax
-
- mov si, 0
- mov bx, 0
- call dtoc
- ;数据复制完成后执行over处代码
- over: pop ax
- pop bx
- pop si
- pop di
- pop dx
- ;屏幕输出
- mov ax, 0b800h
- mov es, ax
-
- mov si, 0
- mov di, 0
- mov bx, 0280h;01e0h
- mov al, 02h
- mov cx, 21
- s: push cx
- sss: mov cl, ds:[si]
- jcxz ookk
-
- mov es:[bx+di], cl
- mov es:[bx+di].01h, al
-
- add di, 2
- inc si
- jmp short sss ;s1重复吗 确实 标签名不能重复
- ookk:
- inc si
- mov di, 0
- add bx, 160
- pop cx
- loop s
- ;成功运行2015 9-10 18:07
- ;09-08: 20:10-22-25
- ;09-10: 09:00-13:30 14:00-18:07
- ;共计耗时: 10:52半天时间
-
- mov ax, 4c00h
- int 21h
- dtoc: mov cx, 21
- copy9x: mov ax, es:[si]
- mov ds:[bx+si], ax
- mov ax, es:[si+2]
- mov ds:[bx+si+2], ax
- add bx, 16
- add si, 16
- loop copy9x
-
- ;循环结束后cx=0, si=16*20, bx=16*20, ax= 3935
- mov ax, 0 ; ???要不要ax=0
- mov si, 0 ;控制数据复制来源
- mov bx, 0
- mov di, 6 ;完成向new写字符串
- ; 设计将dword型数据转变为十进制的字符串
- mov cx, 21 ;控制数据复制次数
- copysum:push cx
- mov cx, 0ah
- mov ax, es:[si].5h
- mov dx, es:[si].7h
- ;push si
- ;push bx ;divdw中需要使用与修改bx, 所以要安全的保存
- mov di, 6 ;push di ;divdw中需要使用与修改bx, 所以要安全的保存
- call divdw
-
- ;pop bx ;还原被divdw修改的bx值
- ;push si
- add bx, 32 ; 显示错误是这个原因吗30 ;指向下一个保存字符串首地址
- add si, 16
- pop cx
- loop copysum
- ; ret
- mov ax, 0 ; ???要不要ax=0
- mov si, 0 ;控制数据复制来源
- mov bx, 0
- mov di, 4 ;完成向new写字符串
- ;将dword型数据转变为十进制的字符串
- mov cx, 21 ;控制数据复制次数
- call copyne
-
- mov ax, 0 ; ???要不要ax=0
- mov si, 0 ;控制数据复制来源
- mov bx, 0
- mov di, 2 ;完成向new写字符串
- ;将dword型数据转变为十进制的字符串
- mov cx, 21 ;控制数据复制次数
- call copyend
-
- ret
- divdw: push si
- push bx
- push ax
- mov cx, 0ah
- mov ax, dx
- mov dx, 0
- div cx
- mov bx, ax
-
- pop ax ;出栈ax
- div cx
- add dx, 30h ; 要注意0ah=10 10h=16
- mov si, bx ;将原来的值保存
- pop bx
- mov ds:[bx+di].0ah, dl ; mov cx, dx ; 保存余数
- push bx
- mov bx, si
- mov dx, bx ;dx 高16位 ax=低16位
- ;因为bx取代dx原来的值包括dx+30h
- ;无须push dx
- push cx ;将cx=10
- mov cx, ax ;将ax是否商为0赋给cx, 判断是否跳出循环
- jcxz savesum; cx=0跳到savsum
-
- pop cx;当ax=/= 0, 恢复原来cx值
- dec di
- pop bx;push bx错了
- pop si;push si
- loop divdw
- savesum:pop cx ;一定要注意push与pop是如何对应
- pop bx
- pop si
- ret;
- copyne: push cx
- mov cx, 0ah
- mov ax, es:[si].0ah
- nene: mov dx, 0
- div cx
- add dx, 30h
- mov ds:[bx+di].014h, dl
- dec di
- mov cx, ax
- jcxz ok ;在这里如果不加上下边语句会错误
- mov cx, 0ah
- jmp short nene;loop nene
- ok: ;
- mov di, 4 ; mov di, 0
- add si, 16
- add bx, 32
- pop cx
- loop copyne
- ret
-
- copyend:push cx
- mov cx, 0ah
- mov ax, es:[si].0dh
- nenene: mov dx, 0
- div cx
- add dx, 30h
- mov ds:[bx+di].01ch, dl
- dec di
- mov cx, ax
- jcxz ok1 ;在这里如果不加上下边语句会错误
- mov cx, 0ah
- jmp short nenene;loop nene
- ok1: ;
- mov di, 2 ;mov di, 0
- add si, 16
- add bx, 32
- pop cx
- loop copyend
- ret
-
- code ends
- end start
复制代码 |
|