Код
|
Инструкция
|
Описание
|
28 /r
|
SUB r/m8, r8
|
r/m8:= r/m8 – r8
|
29 /r
|
SUB r/m16, r16
|
r/m16:= r/m16 – r16
|
2A /r
|
SUB r8, r/m8
|
r8:= r8 – r/m8
|
2B /r
|
SUB r16, r/m16
|
r16:= r16 – r/m16
|
2C ib
|
SUB AL, imm8
|
AL:= AL – imm8
|
2D iw
|
SUB AX, imm16
|
AX:= AX – imm16
|
80 /5 ib
|
SUB r/m8, imm8
|
r/m8:= r/m8 – imm8
|
81 /5 iw
|
SUB r/m16, imm16
|
r/m16:= r/m16 – imm16
|
83 /5 ib
|
SUB r/m16, imm8
|
r/m16:= r/m16 – imm8
|
Примеры использования команды вычитания:
MOV AL, 10 ; AL=10
SUB BL, 10 ; BL=AL-10=0 ZF=1
SUB BL, -10 ; BL=10
Команда SBB обеспечивает вычитание двух 8- или 16-разрядных двоичных чисел с учётом значения входного заёма, определяемого флагом CF (табл. 21). Флаги устанавливаются как у команды SUB.
Табл. 21. Команда SBB.
Код
|
Инструкция
|
Описание
|
18 /r
|
SBB r/m8, r8
|
r/m8:= r/m8 – r8 – CF
|
19 /r
|
SBB r/m16, r16
|
r/m16:= r/m16 – r16 – CF
|
1A /r
|
SBB r8, r/m8
|
r8:= r8 – r/m8 – CF
|
1B /r
|
SBB r16, r/m16
|
r16:= r16 – r/m16 – CF
|
1C ib
|
SBB AL, imm8
|
AL:= AL – imm8 – CF
|
1D iw
|
SBB AX, imm16
|
AX:= AX – imm16 – CF
|
80 /3 ib
|
SBB r/m8, imm8
|
r/m8:= r/m8 – imm8 – CF
|
81 /3 iw
|
SBB r/m16, imm16
|
r/m16:= r/m16 – imm16 – CF
|
83 /3 ib
|
SBB r/m16, imm8
|
r/m16:= r/m16 – imm8 – CF
|
Команда DEC уменьшает значение операнда на единицу (табл. 22). Флаги OF, SF, ZF, AF и PF устанавливаются в соответствии с результатом по обычным правилам. Значение флага CF не изменяется. Операндом может являться любой регистр общего назначения, одно- или двухбайтовое поле памяти.
Как и команда INC декремент 16-разрядных регистров общего назначения может быть выполнен двумя видами инструкций – однобайтовой (код операции 48 плюс номер регистра) и двухбайтовой (код операции FF, номер регистра определяется байтом ModRegR/M).
Выгода от команд INC и DEC заключается в том, что они занимают меньше места в памяти и выполняются быстрее, чем соответствующие команды ADD и SUB.
Табл. 22. Команда DEC.
Код
|
Инструкция
|
Описание
|
48+rw
|
DEC r16
|
Декремент r16.
|
FE /1
|
DEC r/m8
|
Декремент r/m8.
|
FF /1
|
DEC r/m16
|
Декремент r/m16.
|
Команда AAS обеспечивает коррекцию результата вычитания двоично-десятичных неупакованных и ASCII чисел (табл. 23). Команда AAS используется после SUB, SBB или DEC. Если установлен флаг AF или содержимое младшего полубайта регистра AL превышает 9, из этого значения вычитается 6, содержимое регистра AH уменьшается на единицу, и устанавливаются флаги AF и CF. В противном случае флаги AF и CF сбрасываются. В любом случае старший полубайт регистра AL обнуляется. Значение флагов OF, SF, ZF и PF не определено.
Табл. 23. Команда AAS.
Код
|
Инструкция
|
Описание
|
3F
|
AAS
|
Коррекция вычитания неупакованных двоично-десятичных чисел.
|
Пример вычитания неупакованных двоично-десятичных чисел:
CLC ; CF=0
MOV AL, 02h
SUB AL, 05h ; AL=0FDh AF=1
AAS ; AL=0FDh – 6 = 0F7h CF=1
Команда DAS выполняет коррекцию результата вычитания двух упакованных двоично-десятичных чисел (табл. 24). Флаги AF и CF устанавливаются в соответствии с результатом операции. Флаги SF, ZF и PF устанавливаются по обычным правилам в соответствии с полученным результатом. Значение флага OF не определено.
Табл. 24. Команда DAS.
Код
|
Инструкция
|
Описание
|
2F
|
DAS
|
Коррекция вычитания упакованных
двоично-десятичных чисел.
|
Алгоритм коррекции следующий. Если при выполнении операции вычитания в младшем полубайте регистра AL получено значение, превышающее 9, или был установлен флаг AF (произошёл заём в 3-ий разряд), то значение младшего полубайта регистра AL уменьшается на 6, флаг CF устанавливается. Если содержимое младшего полубайта регистра AL не превышает 9 и флаг AF сброшен, никаких действий с младшим полубайтом не выполняется.
Затем проверяется содержимое старшего полубайта регистра AL. Если его значение больше 9 либо если установлен флаг CF, то значение уменьшается на 6 и устанавливается флаг CF. Если значение старшего полубайта не превышает 9 и флаг CF сброшен, никаких действий со старшим полубайтом не выполняется.
Пример вычитания упакованных двоично-десятичных чисел:
CLC ; CF=0
MOV AL, 25h
SUB AL, 52h ; AL=0D3h AF=0 CF=1
DAS ; AL=0D3h – 60h=73h CF=1
Do'stlaringiz bilan baham: |