Размер стека зависит от режима работы микропроцессора и ограничивается 64 Килобайтами (или 4 Гигабайтами в защищенном режиме). В каждый момент времени доступен только один стек, адрес сегмента которого содержится в регистре SS. Этот стек называется текущим. Для того чтобы обратиться к другому стеку («переключить стек»), необходимо загрузить в регистр SS другой адрес. Регистр SS автоматически используется процессором для выполнения всех команд, работающих со стеком.
Перечислим еще некоторые особенности работы со стеком:
1. запись и чтение данных в стеке осуществляется в соответствии с принципом LIFO;
2. по мере записи данных в стек последний растет в сторону младших адресов. Эта особенность заложена в алгоритм команд работы со стеком;
При использовании регистров esp/sp и ebp/bp для адресации памяти ассемблер автоматически считает, что содержащиеся в нем значения представляют собой смещения относительно сегментного регистра ss.
В общем случае стек организован так:
Регистр ESP/SP всегда указывает на вершину стека, т. е. содержит смещение, по которому в стек был занесен последний элемент. Команды работы со стеком неявно изменяют этот регистр так, чтобы он указывал всегда на последний записанный в стек элемент.
Если стек пуст, то значение ESP равно адресу последнего байта сегмента, выделенного под стек. При занесении элемента в стек процессор уменьшает значение регистра esp, а затем записывает элемент по адресу новой вершины. При извлечении данных из стека процессор копирует элемент, расположенный по адресу вершины, а затем увеличивает значение регистра указателя стека esp. Таким образом, получается, что стек растет вниз, в сторону уменьшения адресов.
Задание для выполнения
Напишите программу вывода числа хранящегося в регистре AX (5A0Fh) в десятичной системе счисления. Создайте COM-файл. Опишите алгоритм работы стека в созданной программе.
Критерии оценок:
5 – работа выполнена полностью. В тексте программы нет синтаксических ошибок. Разработан оптимальный алгоритм решенных задач. Описан алгоритм работы стека.
4 – работа выполнена полностью. В тексте программы нет синтаксических ошибок. Разработан не оптимальный алгоритм решенных задач. Описан алгоритм работы стека.
3 – работа выполнена полностью. В тексте программы нет синтаксических ошибок. Разработан не оптимальный алгоритм решенной задачи. Алгоритм работы стека описан не правильно
2 – поставленная задача не была реализована.
Программа вывода числа хранящегося в регистре AX (5A0Fh) в десятичной системе счисления
s1 segment
org 100h
start:
mov ax,0003h
int 10h
mov ax,5A0Fh
mov bx,10
mov cx,0
label1:
mov dx,0
div bx
push dx
add cx,1
cmp ax,0
jnz label1
label2: pop dx
call print
loop label2
mov ah,10h
int 16h
int 20h
print proc
mov ah,02h
add dl,30h
int 21h
ret
print endp
s1 ends
end start
Практическая работа №6
Использование прерывания 21h: Сервис DOS.
Цель занятия: изучить и научиться использовать основные функции прерывания 21h.
Прерывание - специальный набор готовых процедур, постоянно доступный для использования.
Общий алгоритм применения функций любого прерывания
1. Поместить номер вызываемой функции в регистр ah;
2. Подготовить, если необходимо, входные данные для функции;
3. Вызвать прерывание;
Сохранить или обработать выходные данные.
Пример 1: Вывести на экран символ '$'
…
mov ah, 02;номер функции
mov dl, '$';входные данные
int 21h;вызов прерывания
…
Пример 2: Ввести строку с клавиатуры и вывести ее на экран
…
mov ah, 0ah;номер функции
lea dx,max;входные данные
int 21h;вызов прерывания
mov ah,09h;номер функции
mov dx,offset enter1;выходные данные
int 21h;вызов прерывания
mov ah,09h;номер функции
mov dx,offset string;выходные данные
int 21h;вызов прерывания
max db 255;структура адреса буфера ds:dx для функции 0ah
len db 0
string db 254 dup(‘$’)
enter1 db 10,13,’$’;перевод строки на экране
…
Функции DOS (Int 21h)
Назначение | № Функции | Данные на входе | Данные на выход |
Ввод символа с ожиданием и эхосопровождением | 01h | ah – 01h | al - ASCII код |
Вывод символа | 02h | ah – 02h dl - ASCII код | |
Ввод символа с ожиданием и без эхосопровождения | 08h | ah – 08h | al - ASCII код |
Вывод строки на экран | 09h | ah – 09h ds:dx - адрес строки с символом '$' на конце | |
Ввод строки с клавиатуры | 0ah | ah – 0ah ds:dx - адрес буфера со следующим форматом: 1й байт - размер буфера; 2й байт - число фактически введенных символов; 3й байт и следующие за ним - буфер под строку | Введенная строка в буфере с 0dh на конце |
Задания для выполнения
1. Вывести слово "Привет" вертикально.
2. Вывести приглашение к вводу символа, вывести введенный символ.
3. Вывести приглашение к вводу строки, вывести введенную строку.
Критерии оценок:
5 – работа выполнена полностью (решены три задачи). В тексте программ нет синтаксических ошибок. Разработан оптимальный алгоритм решенных задач.
4 – работа выполнена не полностью (решены две задачи). В тексте программ нет синтаксических ошибок. Разработан оптимальный алгоритм решенных задач.
3 – работа выполнена не полностью (решена одна задача). В тексте программы нет синтаксических ошибок. Разработан не оптимальный алгоритм решенной задачи.
2 – ни одна из поставленных задач не была реализована.
Практическая работа №7