1. Условные флаги в алфавитном порядке.
AF (Auxiliary Carry flag) – флаг вспомогательного переноса, предназначенный для обработки чисел в BCD-формате, используется при выполнении арифметических операций над числами длиной 1 байт для индикации переноса из младшей тетрады в старшую (или займа из старшей тетрады). Здесь BCD (Binary Coded Decimal) – двоично-десятичное представление чисел (каждая десятичная цифра кодируется двоичной тетрадой)
CF (Carry flag) – флаг переноса, предназначен для индикации переноса из старшего байта, используется в операндах, разрядность которых больше 16 бит.
OF (Overflow flag) – флаг переполнения, предназначен для индикации переполнения результатов при выполнении арифметических операций. При сложении он устанавливается в 1, если есть перенос в старший бит, но нет переноса из старшего бита.
PF (Parity flag) – флаг четности, используется как контрольный бит, устанавливается в 1, если младший байт содержит четное число единиц.
SF (Sign flag) – флаг знака, равен 1 для отрицательного результата.
ZF (Zero flag) – признак нулевого результата.
Управляющие флаги устанавливаются программным путем и используются для изменения состояния МП.
DF (Direction flag) – флаг направления, применяется в командах обработки строк. При DF=1 обработка осуществляется от наибольшего адреса к меньшему, а при DF=0 – от начала к концу.
Установка флага осуществляется следующими командами ассемблера:
Команда | Устанавливает значение DF |
STD | 1 |
CLD | 0 |
IF (Interrupt-Enable flag) – разрешение прерывания, используется для разрешения или запрета обработки внешнего маскируемого прерывания. Устанавливается командами ассемблера
Команда | Значение IF | Результат установки |
STI | 1 | Обработка прерывания разрешена |
CLI | 0 | Обработка прерывания запрещена |
TF (Trap flag) – трассировка, используется для осуществления покомандного (пошагового) выполнения программы. При TF=1 МП автоматически вырабатывает внутренние прерывания после каждой команды, что удобно для отладочного режима выполнения программы. Изменить состояние флага TF довольно сложно.
Две части МП:
ОУ – операционное устройство, выполняет команды; содержит АЛУ, УУ и 10 регистров. Эти устройства обеспечивают выполнение команд, арифметических вычислений и логических операций.
ШИ – шинный интерфейс, подготавливает команду и данные для выполнения; содержит 3 элемента:
1) Блок управления шиной
2) Очередь команд
3) Сегментные регистры
Структура команд
Операционная часть | Адресная часть |
В командах ЯА:
Мнемоника | Адресная часть |
Машинные команды МП занимают от 1 до 6 байтов, причём операционная часть занимает 1 или 2 первых байтов команды, остальное адресная часть.
Операнды могут быть указаны:
§ В самой команде(непосредственная адресация)
§ В одном из регистров, тогда в команде указывается этот регистр (регистровая адресация)
§ В оперативной памяти (ОП) по адресу, который тем или иным образом описан в команде (прямая, базовая или индексная адресация)
§ Некоторые команды требуют, чтобы один из операндов находился в определённом регистре (например в AX), тогда он не указывается в команде( подразумеваемая адресация)
Результат выполнения команды обычно помещается на место первого операнда. Форматы команд разнообразны (в основном двухадресные).
В общем виде запишем : op1 := op1 * op2, где * - какая-то команда, заданная МНК(мнемоникой); op1 – регистр или ячейка памяти, 1 байт или одно слово (2 байта); op2 – непосредственный операнд - регистр или ячейка памяти, 1 байт или одно слово (2 байта).
Система команд МП Intel 80x86
Арифметические команды
1. Команды сложения и вычитания
Операции сложения и вычитания одинаково для знаковых и беззнаковых целых. Используются две формы операндов: байт или слово, причем операнды должны быть одинаковой длины. Операнды могут храниться в регистре или в ОП, но второй операнд может быть непосредственным.
Перечислим команды, относящиеся к группе команд сложения и вычитания:
Группа а) ADD op1, op2 ; op1 := op1+op2
SUB op1, op2 ; op1 := op1 – op2
Сложение (вычитание) операндов в дополнительном двоичном коде, результат помещается на место первого операнда, второй операнд не изменяется.
Команды корректируют регистр флагов FLAGS в соответствии с результатом операции, а именно:
ZF – нулевой рез-т,
SF – знак результата,
PF – флаг четности,
CF, AF – флаги переносов,
OF – флаг переполнения.
Примеры:
ADD AH, 12 ; AH := AH + 12 (1Б)
SUB z, BX ; z := z – BX (2Б)
Группа б) ADC op1, op2 ; op1 := op1+op2+CF
SBC op1, op2 ; op1 := op1 – op2 – CF
Сложение (вычитание) операндов с переносом, образованным предыдущей командой. Модифицирует флаги аналогично группе а.
Например, если требуется сложить двойные слова, расположенные в парах регистров
(AX, BX) := (AX, BX) + (CX, DX),
причем AX, CX – старшие байты слагаемых,
BX, DX – младшие байты.
Сложение выполняется двумя командами:
ADD BX, DX
ADC AX, CX
Группа в) Специальный случай сложения – изменение операнда на единицу.
INC op ; op := op +1 (инкремент)
DEC op ; op := op –1 (декремент)
Операнд может быть регистр, или ячейка памяти, байт или слово.
Группа г) Десятичная коррекция - анализ и преобразование сложения(вычитания) для BCD кодов. BCD-операнды обрабатываются обычными командами сложения и вычитания, а затем размещается команда десятичной коррекции, которая обрабатывает только один байт данных, находящихся в AL, поэтому команды десятичной коррекции операндов не имеют (подразумеваемая адресация).
DAA; коррекция после сложения
DAS; коррекция после вычитания.
Например:
ADD AL, y
DAA
SUB AL, DH
DAS
BCD-операнды, представленные более, чем одним байтом должны обрабатываться побайтно.
Команды десятичной коррекции модифицирует флаги аналогично п.(а), за исключением флагов AF и OF.
2. Дополнительные команды
Группа а) Команда сравнения
CHP op 1, op 2; op 1 - op2
Результат нигде не запоминается, команда корректирует арифметические флаги ZF, SF, PF, CF, AF, OF.
Группа б) Команда изменения знака
NEG op ; op := - op.
Операнд может быть байт или слово в регистре или в ячейке памяти.
Пример,
MOV AH, 1 ; AH := 1
NEG AH ; AH := -1
Если операнд равен нулю, то его значение не изменяется.
Команда корректирует флаги аналогично группе а; причем
CF=1, кроме случая, когда операнд равен нулю;
OF=0, кроме случая, когда op=-128 (для 1Б) = 80h (это значит, что число заняло всю разрядность), тогда OF=1, а операнд остается без изменения.
3. Команды умножения и деления
Группа а) Умножение
MUL op ; умножение целых чисел без знака
IMUL op ; умножение целых чисел со знаком
Операнд может быть слово или байт в регистре или в ячейке памяти, но не непосредственный операнд.
Команды действуют одинаково:
- для байтов AX := AL*op
- для слов (DX, AX) := AX*op
Т. к. результат получается удвоенной разрядности относительно операндов, то при умножении слов он располагается в стандартной паре регистров (DX, AX), причем DX хранит старшие разряды. Команды модифицируют флаги:
СF=OF=0 , если старшая половина результата AH нулевая или совпадает по знакам.
СF=OF=1 , если старшие разряды не нулевые.
Группа б) Деление
DIV op; деление целых чисел без знака
IDIV op; деление целых чисел со знаковом
где op – аналогично умножению.
Команды выполняют деление нацело и формируют два результата: целое частное и остаток.
Деление слова на байт выполняется по схеме
АН:=АХ mod op (остаток)
AL:=AX div op (частное)
Деление двойного слова на слово
DX := (DX, AX) mod op
AX := (DX, AX) div op
При делении слова на байт делимое заранее должно быть размещено в аккумуляторе и сдвинуто в сторону младшего байта в АХ или AL соответственно. Деление является дополнительной к умножению командой.
Флаги не модифицируются, но может возникнуть ошибка «деление на ноль или переполнение», которая возникает, если делитель нулевой или частное не помещается в соответствующее ему место.
При появлении этой ошибки микропроцессор прекращает выполнение программы.
4. Команды преобразования длины
Эти команды часто требуются перед делением, флаги – не модифицируют.
CBW – преобразует байт со знаком в AL, в слово со знаком в АХ путем распространения старшего бита AL по всем разрядам AH;
CWD – преобразует слово со знаком в АХ в двойное слово со знаком в (DX, AX) аналогично CBW.
Так же существуют команды десятичной коррекции умножения и деления AAM, AAD
Команды обработки битов
Данная группа команд отличается отсутствием межразрядных переносов. Команды делятся на 2 группы.
1) Логические команды
Общие черты:
§ Выполняют побитовую обработку операндов параллельно, без переносов; единица трактуется как «истина», ноль – «ложь»;
§ модифицируют флаги, но важен только флаг ZF «нулевой результат»;
§ операндами могут быть байты или слова в регистрах или ячейках памяти; второй операнд может быть непосредственным операндом.
Перечислим основные команды
NOT op; отрицание (инверсия кода). Флаги не модифицирует.
AND op1, op2; op1:= op1^ op2
Например, 0Fh ^ 15h = 05h
^ | 00001111 |
00010101 | |
00000101 |
OR op1, op2; op1:= op1 v op2
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 |


