Как проще всего проверить остаток целого числа по модулю 2 в ассемблере Nasm?

Например:

int x = 35;
if( x%2==1) { //do something }

Я просто хочу проверить значение модуля, не присваивая результат x.

Предположим, что значение находится в eax, поэтому я могу использовать инструкцию DIV, затем вернуть исходное значение в eax и т. д., но это кажется неэффективным. Можете ли вы предложить лучший способ?


person vkx    schedule 06.10.2012    source источник


Ответы (2)


Для перехода по модулю 2 значения в al/ax/eax/rax:

    test al,1
    jnz is_odd

is_even:
    ; do something for even numbers.

is_odd:
    ; do something for odd numbers.

Однако, если все, что вам нужно, это значение по модулю, вам не нужны никакие ветки.

test al,1
setnz bl   ; modulo 2 of al/ax/eax/rax is now in bl.
person nrz    schedule 07.10.2012
comment
еще проще, если вы не против перезаписать старое значение, and al, 1 - person John Dvorak; 05.03.2014
comment
@JanDvorak test al,1 то же самое, что и and al,1, за исключением того, что and перезаписывает результат, а test только обновляет флаги. Поэтому я не вижу смысла использовать здесь and al,1. Также and al,1 может быть медленнее, чем test al,1, потому что следующие инструкции могут потребовать ожидания результата в al. Кроме того, OP специально хочет проверить значение модуля, не присваивая результат x. - person nrz; 05.03.2014

Если младший бит включен, он не делится на два:

test   x, 1
jne    somewhere_when_odd
person wallyk    schedule 06.10.2012
comment
and x,1 является деструктивным в x86 сборке. test x,1 делает то же самое, но не разрушает (обновляет флаги, но не сохраняет результат в x; см. мой ответ ниже). - person nrz; 07.10.2012