如何用汇编语言编写模数(C ++中的%)

时间:2013-11-22 16:24:56

标签: c++ assembly

我不知道为了翻译%2我必须使用什么指令

#include <iostream>
using namespace std;

int main () {
     int number;
     cin >> number;
     if (number % 2 == 0) {    // I cannot translate this part.
       cout << "Even\n";
    }
    else {
       cout << "Odd\n";
    }
    return 0;
 }

3 个答案:

答案 0 :(得分:6)

在典型的汇编语言中,整数除法指令也会给出余数。在余数除以2的情况下,使用位0转换为逐位AND要容易得多。例如,关于x86:

    mov eax, number

    ; test sets the flags based on a bitwise and, but discards the result
    test eax, 1

    mov esi, offset even_string
    jz print_it
    mov esi, offset odd_string
print_it:
    ; print string whose base address is in esi

如果你需要通过某个任意数字(而不仅仅是2)检查可除性,则除法指令通常会产生商和余数。再次,使用x86作为演示:

idiv ebx  ; divisor in edx:eax
; quotient in eax, remainder in edx

答案 1 :(得分:2)

模数通常由除法指令产生。但是,取模2,4,8,16等是一种特殊情况:因为数字以二进制形式存储,所以可以使用AND指令完成这些检查。

检查可分性的最快方法是查看值的最低有效位。使用值为AND的{​​{1}}指令,即1。其结果始终与number & 1相同。大多数现代编译器(以及一些过时的编译器)都可以轻松优化。

对于其他两个权力,number % 2使用该值减一,即AND使用x % 4x & 3使用x % 8,依此类推

答案 2 :(得分:0)

在没有位测试指令的汇编语言中,您必须(布尔)AND值为1:

    LODI, R0  #5    ; Load register 0 with the number 5.
    ANDI, R0  #1    ; Boolean AND the register with one (1).
    JUMZ      Value_is_even; jump if the value is zero.
;
;   Go here if the value is odd.