- •Содержание
- •Введение
- •Архитектура микропроцессоров Intel 8086
- •Общие принципы работы мп 8086 при выполнении прикладных программ
- •Регистры
- •Адресация
- •Непосредственная адресация
- •Прямая адресация
- •Регистровая адресация
- •Косвенная регистровая адресация
- •Адресация no базе
- •Индексная адресация
- •Индексная адресация со смещением
- •Система команд
- •Команды пересылки данных
- •Арифметические команды
- •Битовые команды
- •Строковые команды
- •Команды передачи управления
- •Команды перехода
- •Условные
- •Безусловные
- •Команды условного перехода
- •Команды управления циклом
- •Тело цикла
- •Команды прерываний
- •Структура программы на языке ассемблера
- •Основные понятия языка ассемблера
- •Написание сегмента данных
- •Написание сегмента стека
- •Написание сегмента кода
- •Написание головной подпрограммы
- •Подготовка программ к выполнению
- •Отладка программ в Turbo Debugger
- •Специфика встроенного ассемблера
- •Оператор asm
- •Синтаксис ассемблерных команд
- •Коды инструкций
- •Операнды
- •Константы
- •Выражения
- •Операции
- •Бинарная операция -
- •Побитовые операции not, and, or, xor
- •Директивы ассемблера
-
Система команд
В приводимых ниже таблицах указывается мнемоника всех допустимых инструкций для МП 8086/8088. Для удобства пользования все команды разбиты на 6 функциональных групп:
-
пересылки данных,
-
арифметические,
-
битовые,
-
строковые,
-
передачи управления,
-
прерываний.
Внутри каждой группы команды объединяются в подгруппы по общим дополнительным признакам.
-
Команды пересылки данных
Мнемоника |
Формат |
Пояснение |
Команды общего назначения |
||
MOV |
MOV приемник, источник |
Переслать значение |
push |
PUSH источник |
Поместить в стек |
pop |
PОР приемник |
Извлечь из стека |
XCHG |
XCHG приемник, источник |
Обменять значения |
Команды ввода-вывода |
||
IN |
IN аккумулятор, порт |
Читать из порта |
OUT |
OUT порт, аккумулятор |
Записать в порт |
Команды пересылки адреса |
||
LEA |
LEA регистр16, память16 |
Загрузить исполнительный адрес |
LDS |
LDS регистр 16, память32 |
Загрузить в peгистp DS l6 полный адрес |
L.ES |
LES регистр 16. память32 |
Загрузить в peгистp ES I6 полный адрес |
Одна из наиболее часто используемых команд - MOV позволяет в защищенном режиме переслать байт или слово из регистра в регистр, из памяти в регистр или из регистра в память. Тип пересылаемых данных (байт или слово) определяется регистром, участвующим в пересылке. Ниже приводятся примеры использования команды:
mov ax,Table {Пересылка слова из памяти в АХ}
mov Table,ah (Пересылка байта из АН в память}
mov ds,ax {Пересылка в сегмент данных}
mov es:[bx],ax {Пересылка слова в память: базовая адресация с заменой сегмента} mov ch,-17 {Переслать константу в регистр}
mov Table,$FF {Переслать константу в память}
С помощью МОV нельзя пересылать:
• из памяти в память, например,
mov Mem1, Mem2
следует использовать
mov ax,Mem2
mov Mem1,ax
• константу или переменную в DS, например, нельзя
mov DS, Data_Seg
нужно:
mov ax, Data_Seg
mov ds,ax
• один сегментный регистр в другой, например, нельзя
mov es, ds
но можно
mov ax, ds
mov es, ax
• в регистр CS; значение этого регистра (сегмента кода) автоматически меняется при выполнении дальних команд CALL и JMP; кроме того, он загружается из стека при выполнении команды RETF (выход из дальней процедуры).
Для временного сохранения регистров и данных, а также для обмена значениями между регистрами широко используются стековые команды PUSH и POP. Каждая них работает со словом, т.е. в стек нельзя поместить или извлечь из него одиночный байт. При выполнении PUSH вначале уменьшается на 2 содержимое указателя SP, затем операнд помещается по адресу SS: SP.
При извлечении из стека сначала читается память по адресу SS: SP, а затем SP увеличивается на 2. Таким образом, при запоминании указатель вершины стека SP смещается к младшим адресам, а при освобожден к старшим. При работе со стеком следует помнить о специфике использования стековой памяти («последним пришел - первым ушел»), а также о том, что эта память интенсивно используется при вызове процедур, т.е. состояние стека к моменту выхода из процедуры должно быть строго согласовано с дальнейшей работой программы. Первое условие определяет порядок извлечения данных из стека - он должен быть обратным порядку, в котором эти данные помещались в стек. Второе условие фактически означает, что после выхода из процедуры указатель SP должен содержать то же смещение, что и к моменту входа в нее. Иными словами, процедура не должна «забыть» в стеке лишнее слово или взять из него больше нужного.
Команда загрузки адреса LEA загружает в регистр адрес (смещение) нужного участка памяти. Этого же можно достичь с помощью зарезервированного слова OFFSET, стоящего перед именем переменной. Например:
var
X: Word;
asm
mov ax, OFFSET X (Загружаем смещение X в AX}
lea ax, X {To же действие}
end;
Разница состоит в том, что в случае команды LEA разрешается использовать индексную адресацию, что особенно удобно при пересылке массивов данных.
Две другие команды адресной загрузки - LDS и LES загружают первое 16- разрядное слово из источника в регистр-приемник, а затем следующее слово в регистр DS или ES, т.е. они рассчитаны на загрузку полного адреса операнда.