我正在尝试在emu8086中进行计算,但似乎没有可用的根函数,我一直在尝试自己做,我想我得到了它,但是我得到了两个错误行:
;si is the number that I need the square root of.
mov bx, 0 ;sets the cycle to start at 0
mov dx, si ;moves the number into dx for processing
sqrt: ;the loop, it continues as long as bx < si/2
mov ax, si ;from here starts this formula: x = (x + n / x) / 2
div dx ;I am getting a divide error -overflow here
add ax, dx
mov ch, 2
div ch ;the same divide error -overflow here
mov dx, ax
mov ax, si
mov ch, 2
div ch
cmp bx, ax ;the formula repeats until bx = si/2
jl sqrt
cmp bx, ax ; if bx = si/2, exit the loop.
jge cnt:
;sqrt si
cnt:
mov si, dx
为什么会出现这两个错误?
答案 0 :(得分:2)
8086
中的16位除法运算使用由寄存器DX:AX
的内容形成的32位值作为被除数,商在AX
中返回,余数在{{1}中返回}}。如果商数太大而不适合16位,则会发生DX
。
所以当你这样做时:
INT 0
您要将mov ax, si ;from here starts this formula: x = (x + n / x) / 2
div dx ;I am getting a divide error -overflow here
的值除以AX
,而将DX
的值除以DX:AX
。由于DX
以DX
的副本开头,而SI
的副本开头,您的红利为AX
。
SI*65536+SI
除以SI*65536+SI
会产生SI
,大于65537
可以容纳,因此,除法错误。
关于这一个:
AX
8位除法使用mov ch, 2
div ch ;the same divide error -overflow here
作为被除数,返回AX
中的商和AL
中的余数。再一次,如果AH
的商太大,就会发生溢出。在您的情况下,只要AL
的值等于或大于AX
,就会发生溢出。