Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000239.doc
Скачиваний:
23
Добавлен:
30.04.2022
Размер:
1.12 Mб
Скачать

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) минут. Проверить правильность выполнения шестого задания второй части контрольной работы (процедуры, передача параметров через регистры).

Создать и ассемблировать программу, содержащую Ваше решение. Добиться, чтобы ассемблер не выдавал сообщений об ошибках и предупреждений.

Собрать загрузочный модуль и запустить в отладчике. Пошагово выполняя программу, проверить корректность своего решения.

Занести в отчет содержимое стека (рисунок со «стопкой» данных, лежащих в стеке):

– в момент входа в процедуру;

– после сохранения регистров.

Исправить решение в контрольной работе, если в нем были ошибки.

Показать результаты преподавателю (на экране и в отчете).