Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Ассемблеру.docx
Скачиваний:
12
Добавлен:
09.11.2018
Размер:
125.1 Кб
Скачать
  1. Система команд

В приводимых ниже таблицах указывается мнемоника всех допустимых инструкций для МП 8086/8088. Для удобства пользования все команды разбиты на 6 функциональных групп:

  • пересылки данных,

  • арифметические,

  • битовые,

  • строковые,

  • передачи управления,

  • прерываний.

Внутри каждой группы команды объединяются в подгруппы по общим дополнительным признакам.

    1. Команды пересылки данных

Мнемоника

Формат

Пояснение

Команды общего назначения

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, т.е. они рассчитаны на загрузку полного адреса операнда.