装配中的高数字划分



我试图找到一个数组为1896的cruser的位置(在2D中成为整个控制台,79*24)。为此,我确定了位置,并将其除以79。

MOV AX, [Y-16H]
 DEC AX
 MOV BX, 79
 DIV BX   
 MOV Z, DL
 ADD Z, DH
 MOV DL, Z
 MOV Z, AL
 ADD Z, AH
 MOV DH, Z

我得到一个溢出错误。你能告诉我我做错了什么吗?也许可以提出一个解决方案?

DIV BXDX(高位字)和AX(低位字)形成的32位数字除以BX。因此,您需要在除法之前清除DX(例如XOR DX,DX),以避免溢出。

顺便问一下,你确定不想除以80吗?我从来没有听说过79列控制台,尽管我不是这方面的专家

正如Michael提到的,您需要在除法之前清除DX寄存器。

也就是说,如果你对速度感兴趣(这是汇编编码的常见原因),那么使用乘法和右移将79的除法转换为等效运算会快得多:(x * 53093) >> 22

这是因为1/79th近似等于53093 / (2**22)

最新更新