
- •3.8Адресация оперативной памяти. Сегментные регистры.
- •3.9Система команд процессора i32. Способы адресации.
- •3.10Система команд процессора i32. Машинная команда. Байт способа адресации.
- •3.11Разветвляющий вычислительный процесс.
- •3.12Циклический вычислительный процесс.
- •3.13Рекурсивный вычислительный процесс.
3.10Система команд процессора i32. Машинная команда. Байт способа адресации.
Машинная команда представляет собой закодированное по определенным правилам указание микропроцессору на выполнение некоторой операции или действия. Каждая команда содержит элементы, определяющие:
код операции (КОП));
операнды;
Приведенный на рис. 1 формат машинной команды является самым общим. Максимальная длина машинной команды — 15 байт. Реальная команда может содержать гораздо меньшее количество полей, вплоть до одного — только КОП.
Рис. 1. Формат машинной команды
Опишем назначения полей машинной команды.
Префиксы. Необязательные элементы машинной команды, каждый из которых состоит из одного байта или может отсутствовать. Назначение префиксов — модифицировать операцию, выполняемую командой.
Код операции. Обязательный элемент, описывающий операцию, выполняемую командой. Многим командам соответствует несколько кодов операций, каждый из которых определяет нюансы выполнения операции.
Последующие поля машинной команды определяют местоположение операндов, участвующих в операции, и особенности их использования.
Байт режима адресации modr/m. Байт способа адресации, если он присутствует, занимает второй байт машинного кода и состоит из следующих трех элементов:
1) mod - двухбитового кода, имеющего значения 11 для ссылки на регистр и 00, 01 и 10 для ссылки на память; 2) reg - трехбитового указателя регистра; 3) r/m - трехбитового указателя регистра или памяти (r - регистр, m - адрес памяти).
Биты MOD Два бита mod определяют адресацию регистра или памяти.
00 биты г/m дают абсолютный адрес, байт смещения (относительный адрес) отсутствует; 01 биты г/m дают абсолютный адрес памяти и имеется один байт смещения; 10 биты г/m дают абсолютный адрес и имеется два байта смещения; 11 биты г/m определяют регистр. Бит w (в байте кода операции) определяет ссылку на восьми- или шестнадцатибитовый регистр.
Биты REG Три бита reg (вместе с битом w) определяют конкретный восьми- или шестнадцатибитовый регистр.
Биты R/M Три бита г/m (регистр/память) совместно с битами mod определяют способ адресации
Рассмотрим пример сложения содержимого регистра АХ с содержимым регистра BX:
ADD BX,AX 00000011 11 011 000 dw mod reg r/m
3.11Разветвляющий вычислительный процесс.
Последовательно работает очень мало программ. Обычно в программе есть точки, в которых принимается решение о том, какая команда будет выполняться следующей. Это решение может быть безусловным и условным. Для перхода используют Метки - символическое имя определенной ячейки памяти, предназначенное для использования в командах передачи управления в качестве операнда. Транслятор ассемблера присваивает каждой метке три атрибута:
Имя сегмента кода, в котором эта метка описана
Смещение, то есть расстояние в байтах от начала этого сегмента
Тип метки (near. Переход на такую метку возможен только в пределах того сегмента кода, в котором она описана, far. Переход на метку возможен в результате межсегментной передачи управления)
Определить метку можно двумя способами: с помощью директивы LABEL, с помощью оператора ":" (двоеточие).
Команды условного перехода удобно применять для проверки различных условий, возникающих в ходе выполнения программы. Сравнение происходит с помощью команды cmp операнд_1, операнд_2
Команда |
Состояние проверяемых флагов |
Условие перехода |
JA |
CF = 0 и ZF = 0 |
если выше |
JAE |
CF = 0 |
если выше или равно |
JB |
CF = 1 |
если ниже |
JBE |
CF = 1 или ZF = 1 |
если ниже или равно |
JC |
CF = 1 |
если перенос |
JE |
ZF = 1 |
если равно |
JZ |
ZF = 1 |
если 0 |
JG |
ZF = 0 и SF = OF |
если больше |
JGE |
SF = OF |
если больше или равно |
JL |
SF <> OF |
если меньше |
JLE |
ZF=1 или SF <> OF |
если меньше или равно |
JNA |
CF = 1 и ZF = 1 |
если не выше |
JNAE |
CF = 1 |
если не выше или равно |
JNB |
CF = 0 |
если не ниже |
JNBE |
CF=0 и ZF=0 |
если не ниже или равно |
JNC |
CF = 0 |
если нет переноса |
JNE |
ZF = 0 |
если не равно |
JNG |
ZF = 1 или SF <> OF |
если не больше |
JNGE |
SF <> OF |
если не больше или равно |
JNL |
SF = OF |
если не меньше |
JNLE |
ZF=0 и SF=OF |
если не меньше или равно |
JNO |
OF=0 |
если нет переполнения |
JNP |
PF = 0 |
если количество единичных битов результата нечетно (нечетный паритет) |
JNS |
SF = 0 |
если знак плюс (знаковый (старший) бит результата равен 0) |
JNZ |
ZF = 0 |
если нет нуля |
JO |
OF = 1 |
если переполнение |
JP |
PF = 1 |
если количество единичных битов результата четно (четный паритет) |
JPE |
PF = 1 |
то же, что и JP, то есть четный паритет |
JPO |
PF = 0 |
то же, что и JNP |
JS |
SF = 1 |
если знак минус (знаковый (старший) бит результата равен 1) |
JZ |
ZF = 1 |
если ноль |
Логические условия "больше" и "меньше" относятся к сравнениям целочисленных значений со знаком, а "выше и "ниже" — к сравнениям целочисленных значений без знака.