我正在学习汇编语言中的除法。根据我正在学习的书,idiv运算的结果放在eax中,余数放在edx中。
书中的一个练习是实现number = result % divisor
在装配中。
我本以为这相当于正常的除法运算,除了 edx 是结果。
然而这并没有起作用,edx 返回了看似垃圾的结果。
为什么?如何用汇编实现上述伪代码?
整数模可以通过两种方式实现:
首先通过使用DIV
or IDIV
,其中余数将被放入EDX
,但你需要归零EDX
首先,或者引用英特尔:
Operand Size -----------| Dividend | Divisor | Quotient | Remainder
Quadword/doubleword | EDX:EAX | r/m32 | EAX | EDX.
eg:
eax = eax % 9
当无符号变为:
XOR EDX,EDX ;clear the destinations for outputs. this stops the garbage remainder
MOV ECX,9
DIV ECX
MOV EAX,EDX
签署后的内容是:
MOV ECX,9
CDQ ;this will clear EDX due to the sign extension
IDIV ECX
MOV EAX,EDX
第二种方法是在使用 2 的幂取模时使用的优化,在这种情况下,您AND
比二的幂小一,例如:eax = eax % 8
变成AND EAX,7
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)