Иллюстрированный самоучитель по Assembler

       

P+ STR Сохранение содержимого регистра состояния задачи


Команда str копирует содержимое регистра задачи TR (селектор сегмента состояния задачи) в двухбайтовый регистр общего назначения или 16-битовую ячейку памяти, указанные в качестве операнда.

SUB Вычитание целых чисел

Команда sub вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде

sub операнд_1, операнд_2

то ее действие можно условно изобразить следующим образом:

операнд_1 - операнд_2 -> операнд_1

В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Пример 1

mov AX,100

mov BX,60

sub АХ,ВХ ;АХ=40 (АХ-ВХ) , ВХ=60

Пример 2

mov DL, '8 ' mov DH, '0 '



sub DL,DH ;DL=8 (преобразование кода

; ASCII в цифру))

Пример 3

; ; В полях данных

datl dw -168

dat2 dw 10

; ; В программном сегменте

mov AX,data2

sub mem,AX ;mem = -178

Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.

Пример

mov EAX,1000000

mov EBX,60000

sub EAX,EBX ;EAX=40000

TEST Логическое сравнение

Команда test выполняет операцию логического умножения И над двумя операндами и, в зависимости от результата, устанавливает флаги SF, ZF и PF. Флаги OF и CF сбрасываются, a AF имеет неопределенное значение. Состояние флагов можно затем проанализировать командами условных переходов. Команда test не изменяет ни один из операндов.

В качестве первого операнда команды test можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.


Правила побитового умножения:
Первый операнд-бит 0101
Второй операнд-бит 0011
Бит результата 0001
Флаг SF устанавливается в 1, если в результате выполнения команды образовалось число с установленным знаковым битом.

Флаг ZF устанавливается в 1, если в результате выполнения команды образовалось число, состоящее из одних двоичных нулей.

Флаг PF устанавливается в 1, если в результате выполнения команды образовалось число с четным количеством двоичных единиц в его битах.
Пример 1
test AX,1

jne bityes ;Переход, если бит 0 в АХ установлен

je bitno ;Переход, если бит 0 в АХ сброшен
Пример 2
test SI,8

jne bityes ;Переход, если бит 3 в SI установлен

je bitno ;Переход, если бит 0 в АХ сброшен
Пример 3
test DX,0FFFFh

jz null ;Переход, если DX=0

jnz smth ;Переход, если DX не 0
Пример 4
test CX,0F000h

jne bitsyes ;Переход, если какие-либо из

;4 старших битов СХ установлены

je bitsno ;Переход, если все 4 старших бита

; СХ сброшены
Пример 5
test AX,AX

jz zero ;Переход, если АХ=0

jnz notzero ;Переход, если АХ не 0
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример
test ЕАХ,80000000h

jz b31 ;Переход, если бит 31 ЕАХ равен 0

jnz nob31 ;Переход, если бит 31 ЕАХ равен 1
386Р+ VERR Проверка сегмента на чтение
Команда verr позволяет определить, разрешено ли чтение из сегмента, за которым закреплен селектор, передаваемый команде в качестве ее операнда. Операндом может служить 16-разрядный регистр общего назначения или 16-битовая ячейка памяти.
386Р+ VERW Проверка сегмента на запись
Команда verw позволяет определить, разрешена ли запись в сегмент, за которым закреплен селектор, передаваемый команде в качестве ее операнда. Операндом может служить 16-разрядный регистр общего назначения или 16-битовая ячейка памяти.

Содержание раздела