完成了目前对自己来说最难的一个,可中间也发现了一些问题 请路过的朋友帮忙解惑,谢谢了
assume cs:code,es:data,ds:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
dw 260,304,333
data ends
table segment
db 32 dup (0)
table ends
code segment
start: mov ax,data
mov es,ax
mov bx,0 ;设置es:bx首地址
mov ax,table
mov ds,ax
mov si,0 ;设置ds:si首地址
mov di,0 ;设置ds:di首地址
mov dh,3 ;
mov dl,6
mov cx,21 ;设置循环次数
a: push cx
push dx
mov ax,es:[bx]
mov [si],ax
mov ax,es:2[bx]
mov 2[si],ax ;输入年份字符串
add si,6
mov ax,es:[bx].84
mov dx,es:[bx].86
call string ;收入转换成字符串
add si,10
mov ax,es:[di].168
mov dx,0
call string ;人员转换成字符串
add si,6
mov ax,es:[di].210 ;人均收入转换成字符串
mov dx,0
call string
mov cx,26
mov si,0
b: push cx
mov cl,[si]
jcxz c
d: inc si
pop cx
loop b
mov al,0
mov [si],al
mov si,0
mov cl,2
pop dx
call show_str
inc dh
add bx,4
add di,2
pop cx
loop a
mov ax,4c00h
int 21h
c: mov al,20h
mov [si],al
jmp d
string: push si ;进入前ds:si所指向的当前位置
push di
push dx
push cx
push ax
mov di,0
f: mov cx,10
call divdw
add cx,30h
push cx
inc di
mov cx,ax
jcxz e
jmp f
e: mov cx,dx
jcxz g
jmp f
g: mov cx,di
h: pop ax
mov [si],al
inc si
loop h
mov al,0
mov [si],al
pop ax
pop cx
pop dx
pop di
pop si
ret
divdw: push bx
push dx ;问题在这:多了一个寄存器出现了麻烦,压入两个还可以,再压入第三个为什么就出现选择关闭终止应用程序的对话框?帮忙解释一下 谢谢
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop dx ;多了一个寄存器出现了麻烦
pop bx
ret
show_str: push ax
push bx
push cx
push dx
push si
push es
mov ax,0b800h
mov es,ax
mov ax,160
mul dh
mov bx,ax
mov ax,2
mul dl
add bx,ax
mov al,cl
mov ch,0
s: mov cl,[si]
jcxz ok
mov es:[bx],cl
mov es:1[bx],al
inc si
add bx,2
jmp s
ok: pop es
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start