Что делает инструкция 'и' с операндами на языке ассемблера?
Что делает инструкция "и" на ассемблере? Мне сказали, что он проверяет битовый порядок операндов и устанавливает 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
.