【问题标题】:How to write modulus (% in C++) in assembly language如何用汇编语言编写模数(C++ 中的 %)
【发布时间】:2013-11-22 16:24:56
【问题描述】:

我不知道我必须使用什么指令来翻译 %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;
 }

【问题讨论】:

  • 编译您的程序并从编译器获取汇编器输出。工作完成。
  • 让编译器帮助你 :) 使用你最喜欢的 C++ 编译器翻译成汇编,并检查输出。
  • 让编译器来做。
  • 您的问题令人费解:您是否希望将您的 C++ 程序转换为汇编,您是否想知道在汇编中进行余数运算的等效代码是什么?
  • 嘿,answer!还有another!

标签: c++ assembly


【解决方案1】:

在典型的汇编语言中,整数除法指令也会给你余数。在除以 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

【讨论】:

    【解决方案2】:

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

    检查可被 2 整除的最快方法是查看值的最低有效位。使用值为1AND 指令,即number &amp; 1。其结果始终与number % 2 相同。大多数现代编译器(以及一些过时的编译器)都会将此作为一种简单的优化。

    对于其他 2 的幂,AND 使用该值减一,即对于 x % 4,使用 x &amp; 3,对于 x % 8,使用 x &amp; 7,依此类推。

    【讨论】:

      【解决方案3】:

      在没有一点测试指令的汇编语言中,您必须(布尔)将值与 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.
      

      【讨论】:

        猜你喜欢
        • 2011-12-22
        • 2016-07-05
        • 2016-03-07
        • 2021-10-28
        • 1970-01-01
        • 2016-04-15
        • 2018-01-10
        • 2015-04-26
        • 1970-01-01
        相关资源
        最近更新 更多