我正在学习汇编语言的划分。根据我正在学习的书,idiv操作的结果放在eax中,其余部分放在edx中。

本书中的一个练习是在汇编中实现number = result % divisor

我会以为这将与正常的除法运算等效,只不过edx是结果。

但是,这不起作用,edx似乎返回了垃圾。

为什么?您如何在汇编中实现上述伪代码?

最佳答案

整数模可以通过两种方式实现:

首先,通过使用DIVIDIV,将其余部分放入EDX,但是您需要先将EDX设置为零,或者引用intel:

Operand Size -----------| Dividend | Divisor | Quotient | Remainder
Quadword/doubleword     | EDX:EAX  |  r/m32  |   EAX    |   EDX.

例如:
eax = eax % 9

当unsigned变为:
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比2的幂小1,例如:eax = eax % 8变为AND EAX,7

关于assembly - 如何在汇编中实现mod运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8231882/

10-15 16:22