我正在学习汇编语言的分工。根据我所学的书,idiv操作的结果放在eax中,其余部分放在edx中。
本书中的练习是在汇编中实现number = result % divisor
。
我原本认为这相当于正常的除法运算,除了edx就是结果。
然而这并没有奏效,而edx似乎又回来了。
为什么呢?你如何在汇编中实现上面的伪代码?
答案 0 :(得分:17)
整数模数可以通过两种方式实现:
首先使用DIV
或IDIV
,其余部分将放入EDX
,但您需要先将EDX
归零,或引用intel:
Operand Size -----------| Dividend | Divisor | Quotient | Remainder
Quadword/doubleword | EDX:EAX | r/m32 | EAX | EDX.
例如:
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
比2的幂小1,例如:eax = eax % 8
变为AND EAX,7