Сравнение битов - операция test
О ней написано, что она аналогична логической операции and,
т. е. по ней можно выпонить условный переход.
Например:
test 4,4
далее возможен условный переход jnz.
Но в книжке сделано примечание, что условный переход будет и при:
test 5,4
и test 7,4 и при test 12,4
С одной стороны это понятно, т. к. если запишем в двоичной форме:
4 - 100
5 - 101
4 - 100
7 - 111
и т. д.
Значения битов в 3-ем разряде совпадают, поэтому условный переход выполняется,
меня интресует ПОЧЕМУ СРАВНИВАЮТСЯ БИТЫ ТОЛЬКО В ТРЕТЬЕМ РАЗРЯДЕ.
(я думаю во всех асемблерах эта команда одинаково работает, но на всякий случай напишу что у меня
TASM).
Цитата:
Originally posted by bave
Значения битов в 3-ем разряде совпадают, поэтому условный переход выполняется,
меня интресует ПОЧЕМУ СРАВНИВАЮТСЯ БИТЫ ТОЛЬКО В ТРЕТЬЕМ РАЗРЯДЕ.
TASM).
Значения битов в 3-ем разряде совпадают, поэтому условный переход выполняется,
меня интресует ПОЧЕМУ СРАВНИВАЮТСЯ БИТЫ ТОЛЬКО В ТРЕТЬЕМ РАЗРЯДЕ.
TASM).
Потому что в твоих примерах результат операции AND бедет ненулевой только в третьем разряде. А вот, например, 111 and 010 = 010 - уже "только" во втором разряде... ;)
Цитата:
Originally posted by bave
Не могу до конца понять как работает операция test.
Не могу до конца понять как работает операция test.
Вот что на эту тему пишет Зубков:
влияет на переход так же, как и
and a,b
но не изменяет значение A
JNZ - переход если не установлен флаг нуля (результат последней операции не равен нулю)
4 and 4 = 4 ==> не ноль
5 and 4 = 4 ==> не ноль
7 and 4 = 4 ==> не ноль
12 and 4 = 4 ==> не ноль
Операция AND:
0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1
- и так для каждого бита.
Другое толкование операции AND (побитовой, например для байта):
AND Byte1, Mask1
используется, чтобы сбросить в ноль те биты Byte1, которым в Mask1 соответствуют нули, а остальные оставить без изменения.
Пример:
маска=00001100,
байт=11111000
AND Byte1, Mask1
==> Byte1=00001000, потому что только этот бит равен 1 у обоих операндов.
А вот, если бы "TEST Byte1, Mask1" , то Byte1 так бы и остался равен 248 (то бишь 11111000 двоичн.), но флаг нуля все равно бы сбросился (ну не нулевой результат-то 00001000 = 8 ).
А раз результат получился не нулевой, то переход
по команде JNZ - произойдет, а по команде JZ значит наоборот - не перейдет.
Да, много написал. А что делать? Если не нравится, не надо было спрашивать... :)
творится. Я вроде помнил, что после первого
ответа я ответил, что до меня всё дошло
(всмысле теперь я это понял).
Ну в любом случае спасибо за ответы, после
последнего ответа я окончательно убедился, что
я всё понял правильно.