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 |