Как написать модуль (% в C ++) на ассемблере

0

Я не знаю, какую инструкцию мне нужно использовать для перевода% 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;
 }
  • 10
    скомпилируйте вашу программу и получите вывод ассемблера от компилятора. Дело сделано.
  • 0
    Позвольте компилятору помочь вам :) Переведите сборку, используя ваш любимый компилятор C ++, и проверьте вывод.
Показать ещё 8 комментариев
Теги:
assembly

3 ответа

2
Лучший ответ

Modulo обычно создается инструкцией деления. Однако принятие modulo 2, 4, 8, 16 и т.д. Является особым случаем: поскольку числа хранятся в двоичной форме, эти проверки могут выполняться с помощью инструкции AND.

Самый быстрый способ проверки делимости на 2 - это наименьший значащий бит значения. Используйте команду AND со значением 1, то есть number & 1. Его результат всегда совпадает с number % 2. Большинство современных компиляторов (и некоторые архаичные) сделают это как легкую оптимизацию.

Для других степеней 2 AND с этим значением минус единица, т.е. Для x % 4 используйте x & 3, для x % 8 используйте x & 7 и т.д.

6

На типичном языке ассемблера инструкция целочисленного деления также даст вам остальную часть. В случае остатка при делении на 2, это намного легче перевести в бит-мудрый AND с бит 0, хотя. Например, на 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

Если вам нужно проверить делимость на какое-то произвольное число (вместо двух), команда деления обычно производит как частное, так и остальное. Опять же, используя x86 в качестве демонстрации:

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

В языках ассемблера, которые не имеют битовой тестовой инструкции, вам необходимо (Boolean) И значение с 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню