如何在emu8086中绘制平方根

时间:2013-12-31 16:37:57

标签: assembly x86-16

我正在尝试在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

为什么会出现这两个错误?

1 个答案:

答案 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。由于DXDX的副本开头,而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,就会发生溢出。