Как стать программистом Как устроен компьютер. Что такое программа. Как написать свою программу. И многое другое узнаете вы из этой книги. Получить бесплатно! |
Команда TEST
Лучшие книги по Ассемблеру
Сделал подборку не новых, но проверенных книг по программированию на языке ассемблера. Если вы также как и я любите погружаться на низкий уровень, в те закоулки мира программирования, куда не всем путь открыт, то посмотрите. Возможно, что-то вам понравится. Подробнее... |
Команда TEST выполняет логическое И между всеми битами двух операндов. Результат никуда не записывается, команда влияет только на флаги (то есть первый операнд не изменяется). Синтаксис:
TEST ЧИСЛО1, ЧИСЛО2
В зависимости от результата могут быть изменены флаги ZF, SF, PF. Инструкция TEST всегда сбрасывает флаги OF и CF.
ЧИСЛО1 может быть одним из следующих:
- Область памяти (MEM)
- Регистр общего назначения (REG)
ЧИСЛО2 может быть одним из следующих:
- Область памяти (MEM)
- Регистр общего назначения (REG)
- Непосредственное значение (IMM)
С учётом ограничений, которые были описаны выше, комбинации ЧИСЛО1-ЧИСЛО2 могут быть следующими:
REG, MEM MEM, REG REG, REG MEM, IMM REG, IMM
Таблица истинности для логического И приведена здесь.
Как можно догадаться, команды AND и TEST по сути выполняют одну и ту же операцию - операцию логического И.
Но зачем тогда нужны две команды и когда лучше использовать AND, а когда - TEST?
Отличия, разумеется, есть. Об одном уже было сказано: команда AND записывает результат операции логического И в первый операнд, а команда TEST никуда не записывает результат, а только изменяет флаги (в зависимости от результата).
Если команда AND наиболее часто используется для сброса определённых битов числа, то команда TEST обычно используется для проверки битов и совместно с командами условного перехода.
Кроме того, с помощью инструкции TEST можно определить состояние сразу нескольких битов числа.
Допустим, мы хотим узнать, сброшены ли нулевой и третий биты числа в регистре AL. Тогда можно использовать такую команду с битовой маской, где установлены 3-й и 0-й биты:
TEST AL, 00001001b
А теперь несколько примеров, которые показывают, как работает этот код.
0 0 1 0 0 1 0 1 - Исходное значение 0 0 0 0 1 0 0 1 - Битовая маска 0 0 0 0 0 0 0 1 - Результат: ZF = 0 0 0 1 0 1 0 0 0 - Исходное значение 0 0 0 0 1 0 0 1 - Битовая маска 0 0 0 0 1 0 0 0 - Результат: ZF = 0 0 0 1 0 0 1 0 0 - Исходное значение 0 0 0 0 1 0 0 1 - Битовая маска 0 0 0 0 0 0 0 0 - Результат: ZF = 1
То есть флаг нуля ZF будет установлен только в том случае, если оба бита (0-й и 3-й) сброшены.
Пример программы: .model tiny .code ORG 100h start: MOV AX, 5 TEST AX, 1 ;Проверка числа на чётность JNZ Odd ;нечетное, переход на метку Odd JZ Even ;четное, переход на метку Even Odd: ;Если число в АХ нечетное ADD AX, 1 ;AX = AX + 1 JMP EndProg Even: ;Если число в АХ чётное ADD AX, 2 ;AX = AX + 2 EndProg: END start
Здесь мы проверяем, является ли число в регистре АХ чётным или нечётным. И в зависимости от результата переходим к той или иной метке.
Инструкции JNZ и JZ изучим как-нибудь в другой раз. Но если коротко, то JZ выполняет переход, если результат равен нулю, а JNZ выполняет переход, если результат НЕ равен нулю.
Подписаться на Дзен-канал
Вступить в группу "Основы программирования" Подписаться на рассылки по программированию |
Первые шаги в программирование
Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься». У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение. Подробнее... |