首页 文章

如何在程序集中实现mod运算符

提问于
浏览
6

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

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

我原以为这相当于正常的除法运算,除了edx就是结果 .

然而这并没有起作用,而edx似乎又回来了垃圾 .

为什么?你如何在汇编中实现上面的伪代码?

1 回答

  • 17

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

    首先使用 DIVIDIV ,其余部分将放入 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的幂模数时使用的优化,在这种情况下,你比一个2的幂小一个,例如: eax = eax % 8 变为 AND EAX,7 .

相关问题