Логические команды.
Все логические команды рассматривают свои операнды как упорядоченные наборы битовых значений. В таком наборе может содержаться 8 бит или 16 бит, в зависимости от размера операнда.[38] Бит со значением 1 может трактоваться как логическое значение True, а нулевой бит – как логическое значение False.
Сначала рассмотрим двухадресные логические команды, имеющие такой общий вид
КОП op1,op2
Ниже приведены допустимые операнды таких команд:
op1 | op2 |
r8 | r8, m8, i8 |
m8 | r8, i8 |
r16 | r16, m16, i16 |
m16 | r16, i16 |
Как видно, у этих команд допускаются такие же операнды, как и у команд сложения, вычитания и сравнения.
Будем нумеровать биты в операндах логических команд так же, как и в регистрах, от нуля до некоторого числа N. Число N равно 7 для коротких (байтовых) операндов и равно 15 для длинных (размером в слово):
N 0 | ||||||||
. . . | ||||||||
Таким образом, операнды логической команды можно рассматривать как массивы логических элементов, проиндексированных от 0 до N. На языке Паскаль такие массивы можно, например, описать в следующем виде
Var op1,op2: array[0..N] of Boolean;
Схему выполнения команды логического умножения
and op1,op2
на языке Паскаль можно записать в виде
for i:=0 to N do op1[i]:=op1[i] and op2[i]
Схему выполнения команды логического сложения
or op1,op2
на языке Паскаль можно записать в виде
for i:=0 to N do op1[i]:=op1[i] or op2[i]
Схему выполнения команды неэквивалентности (её часто называют также командой сложения по модулю 2)
xor op1,op2
на языке Паскаль можно записать в виде
for i:=0 to N do op1[i]:=op1[i] <> op2[i]
Команда логического тестирования
test op1,op2
выполняется точно так же, как и команда логического умножения, но без записи результата на место первого операнда, т.е. как и у команды сравнения с кодом cmp её единственным результатом является установка флагов.
Все перечисленные выше логические команды устанавливают флаги так же, как команда вычитания, например, флаги CF и OF будут разны нулю (никакого переноса и переполнения, конечно, нет), во флаг знака SF переносится левый бит результата и т.д. Но, как мы вскоре увидим, интерес для программиста представляет здесь только флаг нулевого результата ZF, который, как обычно, равен единице (поднят) для полностью нулевого результата, и равен нулю (опущен), если в результате есть хотя бы один ненулевой бит.
Следует заметить, что мы использовали цикл языка Паскаль только для более строгого описания работы логических команд. Не следует понимать это слишком буквально: на самом деле логические команды на современных ЭВМ выполняют операции над битами своих операндов одновременно (чаще всего за один такт работы центрального процессора), а не в последовательном цикле. [39]
Дата добавления: 2015-10-05; просмотров: 626;