Флажковые команды (команды пересылки флагов).

Команды этого класса обеспечивают доступ к флагам процессора.

Команды 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 (расширение недостающих разрядов знаком).