Команды этого класса обеспечивают доступ к флагам процессора.
Команды LAHF (загрузить флаги в AH) и SAHF (запомнить AH во флагах). LAHF передает 5 флагов SF, ZF, AF, PF и CF в определенные биты регистра AH, а SAHF - реализует противоположную передачу. На рисунке 2.1 показано соответствие флагов разрядам регистра AH.
SF | ZF | AF | PF | CF | флаги | |||
AH |
Рисунок 2.1. Соответствие флагов разрядам регистра AH.
Эти флаги выделены потому, что они были в микропроцессоре 8080. LAHF и SAHF предусмотрены в основном, для преобразования программ микропроцессора 8080 в программы микропроцессора 8086. Команда SAHF оказалась полезной при использовании арифметического сопроцессора для использования результатов расчета в команде условного перехода.
Существуют команды для пересылки содержимого регистра флагов в стек и обратно. Это команды PUSHF (включить в стек флаги) и POPF (извлечь из стека флаги). Рисунок 2.2 иллюстрирует работу этих команд.
Младшие адреса | ||||||||
SF | ZF | AF | PF | CF | ||||
NT | IO | PL | OF | DF | IF | TF | ||
Старшие адреса |
Рисунок 2.2. Размещение в стеке флагов после команды PUHF.
Начиная с микропроцессора 80386 добавляются команды PUSHFD и POPFD для 32-битного регистра EFLAGS.
PUSHFD- включает в стек 32-разрядный регистр флагов.
POPFD - извлекает из стека 32-разрядный регистр флагов.
2.5.2.Арифметические команды.
Перечень арифметических команд приведен в таблице 2.6.
Таблица 2.6. Перечень арифметических команд.
Мнемоника команд | Описание команды |
Сложение | |
ADD - сложение | приемник + источник à приемник |
ADC - сложить с переносом | приемник + источник + CF à приемник |
INC - увеличить на 1 | приемник + 1 à приемник |
. Вычитание | |
SUB - вычесть | приемник - источник à приемник |
SBB - вычесть с займом | приемник - источник - CF à приемник |
DEC - уменьшить на 1 | приемник - 1 à приемник |
NEG - изменить знак | 0 - приемник à приемник |
CMP - сравнить | приемник - источник à |
Умножение | |
MUL - умножить | AL * источник (8) à AX |
AX * источник (16) à DX, AX | |
IMUL - умножить со знаком | так же, как и в команде MUL, но операнды со знаком |
Деление. | |
DIV - разделить | AX/источник (8): целая часть à AL, остаток à AH |
[DX, AX]/источник (16): целая часть à AX, остаток à DX | |
IDIV - разделить со знаком | так же, как и в команде DIV, но операнды со знаком |
Команды расширения | |
CBW - преобразовать байт в слово | знаковый бит AL à в AH |
CWD - преобразовать слово в двойное слово | знаковый бит AX à в DX |
CWDE - преобразовать слово в расширенное двойное слово | знаковый бит AX à в EAX |
CDQ - преобразовать двойное слово в учетверенное двойное слово | знаковый бит EAX à в EDX |
В арифметических командах устанавливаются или сбрасываются 6 флажков состояния:
CF - устанавливается, если операция дала беззнаковый результат вне диапазона (т.е. есть перенос в знаковый разряд). Заём (7,15,31) вызывает выход из разрядной сетки.
OF - устанавливается, если в операции получился знаковый результат, находящийся вне диапазона (т.е. перенос в знаковый разряд) не создаёт переноса из разрядной сетки или перенос из разрядной сетки происходит без переноса в знаковый разряд.
ZF - устанавливается, если результат операции (знаковый или беззнаковый) равен нулю.
SF - устанавливается, если старший бит результата операции содержит 1, показывая отрицательное число.
PF - устанавливается, если результат операции содержит четное число единичных битов.
AF - устанавливается, если в десятичных операциях требуется коррекция.
2.5.2.1. Команды сложения.
В системе команд существует три команды сложения: ADD, ADC, INC.
ADD - команда сложения, один из операндов которой может находиться в регистре или в самой команде (непосредственный операнд)
ADC - команда сложения с переносом, аналогична ADD, но использует в качестве третьего слагаемого начальное значение CF.
INC - команда увеличения на единицу, имеет один операнд. Прибавляет 1 к содержимому операнда и помещает результат в этот же операнд (не устанавливает флаг CF). INC идентична ADD с непосредственным операндом 1, но требует меньше байт в памяти.
Форматы команды ADD:
ADD reg/ mem, imn
ADD reg, reg/ mem
ADD mem/ reg, reg,
где reg - имя регистра, mem - имя ячейки памяти, imn - непосредственное значение размером 8, 16 или 32- разряда:
Начиная с микропроцессора 80386 введены следующие форматы:
ADD reg/ mem16, imn 8
ADD reg/ mem 32, imn 8 (расширение недостающих разрядов знаком).