汇编语言实验10第三题,代码问题.求大神指导!!!
本帖最后由 chunhuaqiuyue 于 2021-12-26 22:33 编辑assume cs:code,ds:data
data segment
db 10 dup (0)
data ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov ch,2
call show_str
mov ax,4c00h
int 21h
dtoc:
mov di,10
s0:
mov dx,0
div di ;商存放在ax中,余数存放在dx中
mov cx,ax ;商存放在cx中,用来判断除法结束
add dx,30h
mov ,dl ;将ASCII码保存,注意与数据对应位置是逆序排放
inc si
jcxz ok
jmp short s0
show_str:
mov ax,0b800h ; set to screen start position
mov es,ax
mov bl,dl; 解决 后面 30行 mul 后 ,bx会因为保存乘法高位而被置0的问题; 所以先把值存入bl
mov bh,0
mov dl,0
mov dl,dh
mov dh,0
mov ax,160 ; 160 bytes per row; 因为一行80个列,每一列 是 16位组成,低8位代表字符 高8位代表颜色属性
mul dx
add bx,bx ; mul 2 ; 原因和29行一样
add ax,bx
mov bx,ax
mov ax,cx
mov cx,0
show_str_s:
mov al,ds:
mov cx,si
mov es:,ax
jcxz ok
sub si,1
add bx,2
jmp short show_str_s
ok: ret
code ends
end start 本帖最后由 jackz007 于 2021-12-26 22:02 编辑
那还用说,一定是溢出了,就是说商的数值太大,以至于 ax 寄存器无法进行保存。
十六位的除法是一定会用到 dx 寄存器的,如果你没有用到,在做除法运算前,必须专门将 dx 寄存器的值清零。
dtoc_s1:
push cx
mov cx,10
xor dx,dx ; 添加此指令
div cx
add dl,30h
mov ds:,dl
sub bx,1
pop cx
loop dtoc_s1 jackz007 发表于 2021-12-26 22:00
那还用说,一定是溢出了,就是说商的数值太大,以至于 ax 寄存器无法进行保存。
十六位的 ...
感谢!!
发现了 jackz007 发表于 2021-12-26 22:00
那还用说,一定是溢出了,就是说商的数值太大,以至于 ax 寄存器无法进行保存。
十六位的 ...
ok,学到了.感谢
页:
[1]