Команда 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 выполняет переход, если результат НЕ равен нулю.



Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика