|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code,ds:data
data segment
dw 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 cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:
mov bx,10
mov cx,1
s:
jcxz s1
div bx
add dx,30h ;第二次循环div bx后指令位置不知道跳哪了,第一次也没什么问题呀。
mov ds:[si],dl
mov cx,ax
inc si
jmp short s
s1:
ret
本帖最后由 jackz007 于 2020-11-20 01:13 编辑
这是 16 位的除法,被除数是 dx : ax,除数是 bx,操作的结果,ax 是商,dx 是余数,在第一轮的操作中,余数 dx 被增加了 30h,这个 dx 值作为被除数的高16位被直接带入了下一轮的除法运算,由于被除数高16位 (dx )的值大于30h,而除数的值却只有 0ah,二者的值相差悬殊,结果,商的数值必然超出 16 位而导致除法溢出,这就是楼主所描述问题的根本原因。
由于本例的除法运算根本就不使用 dx 寄存器,所以,解决问题的办法,就是每次在除法运算前,专门对 dx 寄存器进行清零。
楼主的这个代码
- dtoc:
- mov bx,10
- mov cx,1
- s:
- jcxz s1
- div bx
- add dx,30h
- mov ds:[si],dl
- mov cx,ax
- inc si
- jmp short s
- s1:
- ret
复制代码
修改为下面这样试试
- dtoc:
- mov bx,10
- s:
- xor dx,dx
- div bx
- add dl , 30h
- mov ds:[si] , dl
- inc si
- or ax,ax
- jnz s
- ret
复制代码
|
|