Команды PUSH и POP .

PUSH - передает слово из источника в стек, а команда POP осуществляет противоположное действие: передает слово из стека в приемник. Регистр SP содержит смещение последнего включенного в стек слова (вершину стека).

! Стек растет по направлению уменьшения адресов !

PUSH начинается с уменьшения содержимого SP на 2, а команда POP завершается увеличением содержимого SP на 2.

Операндами команд PUSH и POP могут быть сегментный регистр, несегментный (шестнадцатиразрядный) ре­гистр или слово в памяти. Кроме того, в команде PUSH можно указывать непосредственный операнд, что не допускается в команде PUSH для процессора 8086. POP- не может содержать непосредственный операнд. Форматы команд приведены в таблице 2.4.

Таблица 2.4. Форматы команд PUSH и POP.

Операнд Включение Извлечение
Регистр PUSH AX POP BX
Память PUSH PW POP PW
Сегментный регистр PUSH DS POP ES
Непосредственный операнд PUSH 856  
Все 16-битные регистры PUSHA POPA
Все 32-битные регистры PUSHAD POPAD

Исключение:

POP CS и POP IP - недействительные операции.

PUSHA и POPA являются эффективным средством для сохранения содержимого всех регистров (кроме сег­ментных и IP) в начале выполнения процедуры и восстановления их в конце работы. PUSHA включает в стек регистры в следующем порядке: AX, CX, DX, BX, SP, BP, SI, DI. Значение SP то, что было в нем до выполнения команды PUSHA. PUSHAуменьшает содержимоеSP на 2 при включении в стек содержимого каждого регистра. POPA вызывает увеличение содержимого SP на ту же величину, что и PUSHA, ей не требуется запомненное в стеке содержимое регистра SP и она егопросто уничтожает. Команды PUSHAD, POPAD работают аналогично с 32-битными регистрами процессора.

Команда XLAT - преобразует значение в регистре AL: она его заменяет на байт из таблицы, адресуемой регистром BX, причем индексом таблицы служит исходное содержимое регистра AL. Удобна для преобразования из одного кода в другой.

Пример использования команды для перевода цифр из 10 системы счисления в код “2 из 5” - любой код, содержащий 2 единичных бита.

Код “2 из 5” приведен в таблице.

Цифра Код
~ ~

TABLE DW 11000B, 00011B, 00101B, 00110B, 01001B, 01010B, 01100B, 10001B, 10010B, 10100B, 11000B

MOV BX, OFFSET TABLE

MOV AL, 7

XLAT TABLE

2.5.1.3. Команды ввода-вывода.

Для связи с разными частями ЭВМ и управления ими микропроцессор использует порты ввода-вывода. Лю­бой порт идентифицируется шестнадцатиразрядным номером порта в диапазоне от 0 до 65535. Как и при доступе к памяти, процессор для связи использует шины данных и адреса. При доступе к порту он посылает сначала по управляющей шине сигнал, который оповещает все устройства ввода-вывода, что адрес на шине является адресом определенного порта, а затем посылает сам адрес. То устройство, адрес порта которого совпадает, дает ответ. Номер порта - это адрес ячейки памяти, являющейся частью устройства ввода-вывода, а не частью основной памяти. Для указания на доступ к порту и пересылки информации к устройствам ввода-вывода и обратно, используются специальные команды ввода-вывода.

IN - передает данные (байт, слово или двойное слово ) из исходного порта в аккумулятор (AL, AX или EAX).

OUT - передает данные из аккумулятора в исходный порт.

Номер порта можно указывать либо в самой команде, либо в регистре DX(0-65535).

Примеры использования команд ввода-вывода приведены в таблице 2.5.

Таблица 2.5. Примеры использования команд ввода-вывода.

Команда Байт Слово Дв. Слово
IN (непосредственная, операнд) IN AL, 20h IN AX, 20h IN EAX, 20h
OUT(непосредственная, операнд) OUT 20h, AL OUT 20h, AX OUT 20h, EAX
IN (регистр) IN AL, DX IN AX, DX IN EAX, EDX
OUT(регистр) OUT DX, AL OUT DX, AX OUT EDX, EAX