2013-11-22 3 views
0

Я не знаю, что инструкции я должен использовать для того, чтобы перевести% 2Как написать модуль (% в C++) на ассемблере

#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++ и проверить вывод. – dasblinkenlight

+1

Пусть компилятор сделает это. – JBL

ответ

2

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

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

Для других степеней числа два, AND с этим значением минус один, то есть для использования x % 4x & 3, для использования x % 8x & 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 

Если вам необходимо проверить делимость некоторым произвольным числом (вместо только 2), инструкция деление обычно производят как частное и остаток. Опять же, используя 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. 
Смежные вопросы