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