3.1.1 Команда PUSH (занесение операнда в стек).
Команда push уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину двухбайтовый операнд-источник (проталкивает в стек новое данное). Проталкивать в стек можно только целые слова (не байты). Программа должна строго следить за тем, чтобы каждой команде проталкивания в стек push отвечала обратная команда выталкивания из стека pop. Если стек используется для временного хранения некоторых данных, то извлекать эти данные из стека следует в порядке, обратном их сохранению.
В качестве операнда-источника может использоваться любой 16-разрядный регистр (включая сегментный) или ячейка памяти. Команда push не воздействует на флаги процессора.
Пара команд push - pop часто используется для пересылки данного из регистра в регистр (особенно, в сегментный) через стек.
Пример 1
push ES: mem; Сохранение содержимого
push DS; слова памяти mem из
push BP; дополнительного сегмента, а также регистров DS и ВР
pop PP; Восстановление из стека
pop DS; трех операндов
pop ES: mem; в обратном порядке
Пример 2
push DS; Пересылка DS через стек
pop ES; Теперь ES=DS
Простейший способ решения задачи вывода значения байта в десятеричной системе счисления
Пример № 3.1
. model tiny | ; модель памяти, в которой сегменты кода, данных и стека объединены. |
. code | ; сегмент кода, который содержит данные. |
org 100h | ; начало СОМ-файла |
begin: | ; метка начала кода программы |
mov dh, 33 | ; заносим в регистр dh число 33 |
mov al, dh | ; заносим в регистр al число 33 |
xor ah, ah | ; обнуление ah |
mov bl, 10 | ; заносим в регистр bl число 10 |
xor cx, cx | ; обнуление сх (счетчик) |
@1: | ; устанавливаем метку @1 |
div bl | ; делим целое число (регистр ax) без знака, на число (регистр bl) |
push ax | ; пересылаем ax через стек |
inc cx | ; увеличиваем на 1 cx (счетчик) |
xor ah, ah | ; обнуление ah |
or ax, ax | ; логического (побитового) сложения само на себя |
jnz @1 | ; если флаг zf не ноль, то переходим на метку @1 |
@2: | ; вызов прерывания DOS - вызов символа; |
pop ax | ; заносим в регистр al число 10 |
xchg ah, al | ; обмен данными между операндами ah и al |
add al, 30h | ; прибавляем к al число 30h |
int 29h | ; вызов прерывания DOS - вызов символа |
loop @2 | ; реализация цикла - переходим на метку @2 |
mov al, 13 | ; заносим в регистр al число 13 |
int 29h | ; вызов прерывания DOS - вызов символа |
mov al, 10 | ; заносим в регистр al число 10 |
int 29h | ; вызов прерывания DOS - вызов символа |
ret | ; функция DOS "завершить программу" |
end begin | ; метка окончания кода программы |
Задание для выполнения.
3.1 C помощью редактора эмулятора EMU 8086 напишите программы, исходный текст которых приводится в примерах данной лабораторной работы.
3.2 Создайте исполняемые файлы типа *.com.
3.3 Изучите работу полученных программ.
3.4 Напишите программу для вывода на экран содержимого регистра DS (на основе примера №2.1). Сравните результат работы своей программы и того, что показывает отладчик.
3.5 Опишите работу команд DIV, PUSH, POP, SHL, TEST.
3.6 Установите (найдите адреса и запишите), где находятся числа, помещенные в стек.
3.7 Напишите программу для вывода на экран содержимого регистра СS (на основе примера №3.1).
3.8 Предложите другие способы решения поставленных задач.
5. Контрольные вопросы
Преимущества использования команды SHL вместо TEST (пример №1.1)?
Чем отличаются команды
SHL dx,1
и
SHL dx, cl
Как переслать содержимое X в стек и получить обратно?
Опишите методику вывода значения байта в десятеричной системе счисления?
Опишите методику вывода значения байта в шестнадцатеричной системе счисления?
Опишите методику вывода двоичного кода числа, записанного в регистр X
Стек. Принцип работы. Команды работы со стеком.
Укажите отличия в работе тандема команд
push DS
pop ES
от
push DS
pop ES
КОМАНДЫ, ОБСЛУЖИВАЮЩИЕ РАБОТУ С КЛАВИАТУРОЙ
Цель работы: Освоить команды считывания данных и управления клавиатурой. Изучить способы работы с процедурами.
0 комментариев