Что делает инструкция 'и' с операндами на языке ассемблера?

Что делает инструкция "и" на ассемблере? Мне сказали, что он проверяет битовый порядок операндов и устанавливает 1 в true, а в остальном - false, но я не знаю, что он на самом деле делает или как он влияет на код.

4 ответа

Инструкция AND сравнивает биты в двух операндах следующим образом:

      Bit position 1234 5678
Operand A -- 1101 1001
Operand B -- 1001 0111
             _________
Result ----- 1001 0001

Биты в позициях 1, 4 и 8 являются истинными в обоих байтах, поэтому позиции 1, 4 и 8 результирующего байта будут истинными. Результат будет сохранен в первом операнде.

Инструкция выполняет побитовое И для каждого бита числа.

Побитовое И

Побитовое И, не путать с логическим И C, проверяет позицию каждого бита. Если он обнаружит, что оба операндо имеют бит 1 в одной и той же позиции, выходной бит в этой позиции будет равен 1. Если он обнаружит, что оба бита равны 0 или что 1 бит равен 0, а другой равен 1, выходной бит в этой позиции позиция с be 0.

      Bit Position — 1234 5678
Operand 1 ———— 0111 0101
Operand 2 ———— 1101 1111
               ————————-
Output ——————- 0101 0101

Функциональный пример

The andинструкция имеет несколько применений. Распространенным является преобразование символов ASCII нижнего регистра в символы верхнего регистра. Это можно сделать, вычитая32но это также повлияет на заглавные буквы.

      mov dx, ‘a’
and dx, 11011111b

The dxреестр теперь будет содержатьA. Это работает следующим образом:

      Bit Position - 1234 5678
Operand 1 ———- 0110 0001
Operand 2 ———- 1101 1111
               ————————-
Output ——————- 0100 0001

Для 32-битных регистров это делает 32 отдельных / независимых логических and операции, по одной на каждую битовую позицию. (true, если оба входа верны, иначе false.)

подобно output[4] = a[4] & b[4]где этот синтаксис псевдокода описывает ввод / вывод как массивы битов.

Это точно такая же операция, как C побитовый & или же &= оператор.

(Не С && логический и оператор, который проверяет !=0).

Инструкция andвыполняет побитовую операцию И над своими операндами. Например, инструкция and al, blдолжен вычислить операцию И над регистром и bl(как показано @Serkratos121) и сохраните результат в регистре.

Его можно использовать для очистки битов из регистра. Популярным примером этого является преобразование символа нижнего регистра в верхний регистр. Чтобы преобразовать mк . Можно написать:

      mov al, 'm' ; this moves the ascii code of m i.e. 109 to al register

Теперь, чтобы преобразовать этот верхний регистр, вычтите 32 из . Но вместо использования sub al, 32d, можно написать:

      and al, 11011111b ; this clears the 5th bit (LSB is 0th bit)

Так, alтеперь содержит 77, который является кодом ascii для M.

Другие вопросы по тегам