- •Введение
- •1. Особенности персонального компьютера
- •1.1. Оперативная память
- •1.2. Регистры
- •1.3. Представление данных
- •1.4. Представление команд
- •2. Язык ассемблера. Начальные сведения
- •2.1. Лексемы
- •2.2. Предложения
- •2.3. Директивы определения данных
- •2.4. Директивы эквивалентности и присваивания
- •2.5. Выражения
- •3. Пересылки. Арифметические команды
- •3.1. Обозначения операторов команд
- •3.2. Команды пересылки
- •3.3. Команды сложения и вычитания
- •3.4. Команды умножения и деления
- •3.5. Изменение размера числа
- •3.6. Примеры
- •3.7. Лабораторная работа № 1
- •4. Переходы. Циклы
- •4.1. Безусловный переход
- •4.2. Команды сравнения и условного перехода
- •4.3. Команды управления циклом
- •4.4. Вспомогательные операции ввода-вывода
- •4.5. Массивы
- •4.6. Лабораторная работа № 2
- •5. Программные сегменты
- •5.1. Сегментирование адресов в пк
- •5.2. Программные сегменты
- •5.3. Начальная загрузка сегментных регистров
- •5.4. Структура программы
- •6. Стек
- •6.1. Стек и сегмент стека
- •6.2. Стековые команды
- •6.3. Приемы работы со стеком
- •7. Процедуры
- •7.1. Дальние переходы
- •7.2. Подпрограммы-процедуры
- •7.3. Передача параметров через регистры
- •7.4. Передача параметров через стек
- •7.5. Локальные данные процедур
- •7.6. Лабораторная работа № 3
- •8. Ввод и вывод данных
- •8.1. Реализация основных операций ввода-вывода
- •8.2. Операции ввода-вывода
- •8.3. Пример структуры программы
- •Заключение
- •Библиографический список
- •Оглавление
- •Учебное издание
- •394026 Воронеж, Московский просп., 14
7.6. Лабораторная работа № 3
Цели работы:
– закрепление навыков работы со стеком;
– закрепление навыков создания процедур в программах на ассемблере (переход в процедуру, сохранение регистров, возврат из процедуры).
– изучение особенностей передачи параметров из основной программы в процедуры.
– проверка правильности выполнения заданий № 6 и № 7 второй части контрольной работы.
Среда выполнения:
Интерпретатор команд DOS, ассемблер MASM, интерактивный отладчик AFD.
Отчет по лабораторной работе
Отчет по лабораторной работе следует писать по ходу выполнения ЛР от руки либо на отдельных листах, либо непосредственно в контрольной работе (рядом с решением и/или с оборотной стороны листов). В каждом задании указывается, какие именно данные должны быть внесены в отчет.
Необходимым условием допуска к выполнению работы является наличие выполненной контрольной работы (часть 2, задания 6 и 7).
Каждое выполненное по ходу работы задание следует показать преподавателю.
Порядок выполнения работы
Задание 1. 45 (25) минут. Освоить приемы работы со стеком.
Создать, ассемблировать и выполнить в отладчике программу, содержащую примеры использования представленных ниже приемов работы со стеком.
Выполняя программу пошагово, проследить изменения указателя и содержимого стека.
Получившуюся программу записать в отчет. Справа от каждой команды, изменяющей содержимое стека, указать текущее значение указателя стека и содержимое 4 верхних слов в стеке.
Показать результат преподавателю.
Приемы работы со стеком
Пересылка данных из одной переменной в другую
PUSH X
POP Y
Этот прием удобно использовать, когда все регистры общего назначения заняты другими данными.
Очистка стека
Удаление данных из стека – это не очистка соответствующей памяти. Это только перемещение указателя вершины стека. Если необходимо очистить стек сразу от N значений, то можно просто увеличить значение регистра SP на нужную величину (вспомните, что стек растет в сторону меньших адресов). Учитывая, что каждый элемент стека занимает слово (2 байта), очистка стека от K слов будет выглядеть следующим образом
ADD SP, K*2
Другой вариант очистки стека: сначала запомнить то значение указателя стека SP, до которого затем надо будет очищать стек, после чего можно записывать в стек что угодно, а в конце просто занести в SP сохраненное значение:
MOV AX, SP
... ;Запись в стек
MOV SP, AX
Доступ к элементам стека
При написании программы на ассемблере нельзя обратиться к элементу стека как к обычной переменной, с помощью имени (элементы стека не имеют имен). Для этого необходимо использовать косвенную адресацию по регистру-модификатору BP (отсюда и название регистра – указатель базы, base pointer).
Сначала следует записать в регистр BP адрес какого-либо элемента стека, например, его вершины:
MOV BP, SP
Теперь команда
MOV AX, [BP]
поместит в регистр AX содержимое последней ячейки стека (т.е. то слово, которое было положено в стек последним). Команда
MOV AX, [BP+2]
поместит в AX содержимое предпоследней ячейки (ее адрес равен адресу вершины стека плюс 2), а команда
MOV AX, [BP+4]
– содержимое третьей с конца ячейки. Аналогичным образом можно обратиться к любому элементу стека.
Регистр BP выбран для адресации доступа не случайно. Сам указатель стека SP нельзя использовать, так как он не относится к регистрам. Другие регистры-модификаторы в принципе использовать можно, но неудобно. Это связано с тем, что если в качестве регистра модификатора используется BP, то при определении абсолютного физического адреса процессор по умолчанию будет использоваться регистр SS в качестве сегментного. Именно благодаря этому мы можем не указывать сегментный регистр в команде. Если же использовать другой регистр-модификатор, то регистр SS придется указывать явно, например:
MOV AX, SS:[BX+4]
Таким образом, вариант с регистром BP более удобен.
Задание 2. 45 (20) минут. Освоить приемы проверки на выход за пределы стека.
Команды PUSH и POP не осуществляют проверку на выход за пределы стека. Если применяется команда считывания из стека, а стек при этом пуст – ошибка не фиксируется (будет считано слово, следующее за пределами стека). Также не будет зафиксирована ошибка при попытке записать значение в стек, когда он полон. Такие проверки необходимо делать программно:
CMP SP, 0 ; Проверка – стек полон?
CMP SP, K ; Проверка – cтек пуст (в стеке k байт)?
Иначе говоря, стек полон, если вершина стека достигла начала области, выделенной для стека, а это значит, что смещение вершины стека равно 0. При пустом стеке в регистре SP находится число, равное размеру области в байтах.
Добавить в созданную программу (задание 1) фрагмент, в цикле записывающий в стек произвольное значение (команда PUSH) до тех пор, пока стек не окажется полон. Точнее, почти полон, так как несколько байт следует оставить для системы (CMP SP, 4).
Потом в цикле должно извлекаться (команда POP) по значению из стека, пока он не вернется в исходное состояние (что в нем было, то и должно остаться).
Выполнить программу в отладчике. Для быстрого выхода из цикла использовать клавишу F2.
Записать в отчет команды проверок (CMP).
Показать результат преподавателю.
Задание 3. 45 (25) минут. Проверить правильность выполнения шестого задания второй части контрольной работы (процедуры, передача параметров через регистры).
Создать и ассемблировать программу, содержащую Ваше решение. Добиться, чтобы ассемблер не выдавал сообщений об ошибках и предупреждений.
Собрать загрузочный модуль и запустить в отладчике. Пошагово выполняя программу, проверьте корректность своего решения.
Занести в отчет содержимое регистров, передающих параметры, в момент вызова процедуры.
Занести в отчет содержимое стека (рисунок со «стопкой» данных, лежащих в стеке):
– в момент входа в процедуру;
– после сохранения регистров;
– перед возвратом из процедуры;
– после возврата из процедуры.
Исправить решение в контрольной работе, если в нем были ошибки.
Показать результаты преподавателю (на экране и в отчете).
Задание 4. 45 (20) минут. Проверить правильность выполнения шестого задания второй части контрольной работы (процедуры, передача параметров через регистры).
Создать и ассемблировать программу, содержащую Ваше решение. Добиться, чтобы ассемблер не выдавал сообщений об ошибках и предупреждений.
Собрать загрузочный модуль и запустить в отладчике. Пошагово выполняя программу, проверить корректность своего решения.
Занести в отчет содержимое стека (рисунок со «стопкой» данных, лежащих в стеке):
– в момент входа в процедуру;
– после сохранения регистров.
Исправить решение в контрольной работе, если в нем были ошибки.
Показать результаты преподавателю (на экране и в отчете).