Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сравнение битов - операция test

279
02 марта 2005 года
bave
456 / / 07.03.2004
Не могу до конца понять как работает операция 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).
391
02 марта 2005 года
Archie
562 / / 03.02.2005
Цитата:
Originally posted by bave
Значения битов в 3-ем разряде совпадают, поэтому условный переход выполняется,
меня интресует ПОЧЕМУ СРАВНИВАЮТСЯ БИТЫ ТОЛЬКО В ТРЕТЬЕМ РАЗРЯДЕ.
TASM).


Потому что в твоих примерах результат операции AND бедет ненулевой только в третьем разряде. А вот, например, 111 and 010 = 010 - уже "только" во втором разряде... ;)

3.1K
03 марта 2005 года
V_oron i
108 / / 01.12.2004
Цитата:
Originally posted by bave
Не могу до конца понять как работает операция test.


Вот что на эту тему пишет Зубков:

1.8K
04 марта 2005 года
Sanya DLR
123 / / 03.03.2004
test A,B
влияет на переход так же, как и
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 значит наоборот - не перейдет.

Да, много написал. А что делать? Если не нравится, не надо было спрашивать... :)
279
29 марта 2005 года
bave
456 / / 07.03.2004
Что-то у меня с памятью в последнее время не то
творится. Я вроде помнил, что после первого
ответа я ответил, что до меня всё дошло
(всмысле теперь я это понял).

Ну в любом случае спасибо за ответы, после
последнего ответа я окончательно убедился, что
я всё понял правильно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог