|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
源代码如下,求各位大佬改错,我真的找不出来啦
assume cs:code
data segment
db'1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
db'1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,94794,140417,1957514,345980
dd 590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226,11542,14430,15257,17800
data ends
table segment
db 21 dup('year summ ne ??',0)
table ends
stack segment
db 30 dup(0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov sp,30
mov bx,0
mov si,0
mov di,0
mov cx,21
s: mov ax,[bx]
mov es:[di],ax
mov ax,[bx+2]
mov es:[di+2],ax ;存放年份
mov ax,54h[bx]
mov dx,56h[bx]
add di,5
call dtoc ;调用dtoc子程序将总收入转变为十进制数的字符串并存放在表格相应位置
add di,5
mov ax,0a8h[si]
mov dx,0 ;原数据为16位
call dtoc ;调用dtoc子程序将雇员数转变为十进制数的字符串并存放在表格相应位置
mov ax,54h[bx]
mov dx,56h[bx]
push cx
mov cx,0a8h[si]
call divdw ;得到人均收入,(dx)=高16位,(ax)=低16位
add di,3
call dtoc ;调用dtoc子程序将人均收入转变为十进制数的字符串并存放在表格相应位置
pop cx
add bx,4
add si,2
add di,16 ;改变table表中下一条记录的起始位置,每条记录长度16字节
loop s
call show_str
mov ax,4c00h
int 21h
dtoc:
;将给定的数字以十进制字符串的形式存放在table表中
push dx
push cx
push ax
push di
mov bx,0 ;bx用来存放取余的次数即字符串的位数
s1:
mov cx,10
call divdw ;为避免除法运算中出现除法溢出
add cx,30h
push cx ;余数入栈
inc bx
push ax
or ax,dx ;因子程序返回的商为32位,为证明商是否为0,不能单纯判断低16位的值 是否为0,dx中高16位的数也要做为判断依剧
mov cx,ax ;上步运算结果若为0,表示得到的商为0,取余过程结束
pop ax ;若执行or ax,dx之后,ax中的值不为0就要继续取余,所以还原ax
jcxz s2
jmp short s1
s2:
mov cx,bx
s3:
pop ax ;将1前面取余的数出栈
mov es:[di],al
inc di
loop s3
okay:
pop bx
pop di
pop ax
pop cx
pop dx
ret
divdw: ;参数:被除数ax存放低16位,cx存放高16位,cx存放除数
;返回:结果ax存放低16位,dx存放高16位,cx存放余数
push bx
push ax ;低16位入栈
mov ax,dx
mov dx,0
div cx ;16位除法,ax存放商,dx放余数
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
show_str:
mov bh,0
mov bl,00000010b
mov cx,21
mov dh,3
show_s1:
push cx
mov cx,16
mov dl,6
show_s2:
push cx
mov ah,2;置光标
int 10h
mov ah,9
mov ax,table
mov ds,ax
mov si,0
mov al,[si]
mov cx,1
int 10h
inc si
pop cx
loop show_s2
pop cx
inc dh
loop show_s1
ret
code ends
end start |
|