关于课程设计1的问题求大神来解答下
assume cs:codedata 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' ;以上是表示21年的21个字符串。0~53h
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司总收入的21个dword型数据54h~a7h
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800 ;以上是表示21年公司雇员人数的21个word型数据。a8~d1h
data ends
table segment
db 8 dup(0)
table ends
code segment
start:mov ax,0b800h
mov es,ax
mov di,0
mov cx,80*24
a:mov byte ptr es:,' '
mov byte ptr es:1,0
add di,2
loop a
mov ax,table
mov ds,ax
mov ax,data
mov es,ax
mov si,0 ;ds:si指向字符串
mov bx,0 ;bx控制年份和总收入
mov di,0 ;di控制雇员数和平均收入
mov dh,4 ;dh控制行数
mov cx,21 ;循环次数
s:push cx ;保护CX
mov ax,es: ;BX控制年份和总收入
mov ,ax ;年份字符串传送和显示
mov ax,es:2
mov 2,ax
mov byte ptr 4,0 ;防止下面的字符串占到这里
mov cl,2
mov dl,0
call show_str
mov ax,es:54h
push dx ;保护dx的行数接下来的高16为要用到dx
mov dx,es:56h;总收入数据变成字符串和传送
call dtoc_dword
pop dx
mov cl,2
mov dl,20
call show_str
mov ax,es:0a8h ;雇员数数据变成字符串和传送
call dtoc_word
mov cl,2
mov dl,40
call show_str
mov ax,es:54h
push dx
mov dx,es:56h
div word ptr es:0a8h;计算人均收入并显示
call dtoc_word
pop dx
mov cl,2
mov dl,60
call show_str
add bx,4
add di,2
add dh,1
pop cx
loop s
mov ax,4c00h
int 21h
;名称:show_str
;功能:在屏幕的指定位置,用指定颜色,显示一个用0结尾的字符串
;参数:(dh)=行号,(dl)=列号(取值范围0~80),(cl)=颜色,ds:si该字符串的首地址
;返回:显示在显示屏幕上
show_str:
push ax
push bx
push cx
push dx
push di
push si
push es
mov ax,0b800h
mov es,ax
mov ax,160
mul dh ;计算显示地址
add dl,dl
mov dh,0
add ax,dx
mov bx,ax
mov ah,cl ;颜色准备
d:mov cl,
mov ch,0
jcxz ok
mov al,cl
mov es:,ax ;字符串和颜色一起传送
inc si
add bx,2
jmp short d
ok:pop es
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
;名称:dtoc_dword
;功能:将一个double word型数转化为字符串
;参数:(dx)=数的高八位,(ax)=数的低八位
;返回:ds:放此字符串,以0结尾
;备注:会用到divdw函数
dtoc_dword:
push ax
push bx
push cx
push dx
push di
push si
mov bx,0 ;BX计算字符串的长度
f:mov cx,10
call divdw
push cx
inc bx
cmp ax,0
jne f
cmp dx,0
jne f
mov cx,bx ;将栈里面的字符串送入ds:si处
h:pop
add byte ptr ,30h
inc si
loop h
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
;名称:dtoc_word
;功能:将一个word数据转化为字符串
;参数:(ax)=word型数据,ds:si指向字符串的首地址
;返回:ds:si放此字符串,以0结尾
dtoc_word:
push ax
push bx
push cx
push dx
push si
push di
mov bx,0;BX计算字符串的长度
g:mov dx,0
mov cx,10
div cx
mov cx,ax;将商给cx看是不是为0是0就跳
add dx,30h
push dx ;保存商位0余数为N (N)余数为最后一次
inc bx
jcxz ok2
jmp short g
ok2:mov cx,bx
s2:pop
inc si
loop s2
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
;名称:divdw
;功能:除法 被除数32位,除数16位,商32位,余数16位,不会溢出
;参数(dx)=被除数的高16位,(ax)=被除数低16位,(cx)=除数
;返回:(dx)=商高16位,(ax)=商低16位,(cx)=余数
divdw:
push bx
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
code ends
end start
问题是 cmp我是从网上复制过来的我也还没学到cmp和jne指令我就想说下为什么我用这样的子程序会出错dtoc_dword:
push ax
push bx
push cx
push dx
push di
push si
mov bx,0 ;BX计算字符串的长度
f:mov cx,10
call divdw
jcxz ok
push cx
inc bx
ok:mov cx,bx ;将栈里面的字符串送入ds:si处
h:pop
add byte ptr ,30h
inc si
loop h
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
这个子程序单独运行没问题但替换上面的子程序就会出错求大神解答。 qw58460 发表于 2015-10-29 22:38
问题是 cmp我是从网上复制过来的我也还没学到cmp和jne指令我就想说下为什么我用这样的子程序会出错dtoc_dwo ...
inc bx 忘写jmp short f kanyixia我也不懂
页:
[1]