装配中的高数量划分

时间:2013-07-31 12:44:40

标签: optimization assembly x86

我试图找到一个1896阵列的crusor位置(在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

我收到溢出错误。你能告诉我,我做错了吗?也许建议一个解决方案?

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

正如迈克尔所说,你需要在分裂前清除DX寄存器。

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

这是有效的,因为1/79th大约等于53093 / (2**22)