在进行除法运算时,会遇到溢出的问题,在16位寄存器中用多加寄存器的方法来解决这个问题
对于除法运算的溢出有如下公式:
将溢出除法转换为多个不溢出的除法的计算公式
先将一个32位的数放在两个寄存器中,假设高位在dx中,低位在ax中,除数放在cx中得到的结果的 商的高位= dx/cx结果的商
商的低位= ax/cx结果的商
余数= ax/cx结果的余数
下面展示一下代码:
assume cs:code
;将溢出除法转换为多个不溢出的除法的计算公式
;先将一个32位的数放在两个寄存器中,假设高位在dx中,低位在ax中,除数放在cx中
;得到的结果的 商的高位= dx/cx结果的商
; 商的低位= ax/cx结果的商
; 余数= ax/cx结果的余数
code segment
start: mov ax, 0A120H ;输入数的低位存放在ax中,这里的数字的十进制是500000
mov dx, 0007H ;输入数的高位存放在dx中
mov cx, 10 ;除数存放在cx中
call divdw ;调用子函数
mov ax, 4C00H
int 21H
divdw: push si ;将子函数用到的寄存器都入栈
push di
push ax
push dx
push cx
mov bp, sp ;[bp]是cx,[bp+2]是dx,[bp+4]是ax
mov ax, [bp + 2] ;ax存放16位除法的低位
mov dx, 0
mov bx, [bp]
div bx ;计算 商的高位= dx/cx结果的商
mov si, ax ;si存放商
mov ax, [bp + 4]
mov bx, [bp]
div bx ;计算 商的低位= ax/cx结果的商
; 余数= ax/cx结果的余数
mov cx, dx ;将结果的余数保存在cx中
mov dx, si ;将结果的高位保存在dx中,同时结果的低位存在ax中
pop di
pop di
pop di
pop di
pop si
ret
code ends
end start
这里的C350H是50000,500000/10的低位就是50000,结果正确
本文探讨了在16位汇编语言中如何处理除法运算时可能出现的溢出问题。通过使用多加寄存器的方法,可以将溢出的除法转换为一系列不溢出的除法。文中给出了具体的计算公式和示例代码,以500000/10为例,展示了如何正确得到50000的结果。

561

被折叠的 条评论
为什么被折叠?



