Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler 01.doc
Скачиваний:
19
Добавлен:
09.11.2019
Размер:
727.04 Кб
Скачать

3. Сегмент стека.

3.1. Записать в текстовом редакторе NORTON следующую программу в EXE-формате:

.286

TITLE CALLPR (EXE) Вызов процедур

;-------------------------------------------------------

STACKSG SEGMENT PARA STACK 'Stack'

DW 32 DUP(?)

STACKSG ENDS

;-------------------------------------------------------

CODESG SEGMENT PARA 'Code'

BEGIN PROC FAR

ASSUME CS:CODESG,SS:STACKSG

PUSH DS ;Записать DS в стек

SUB AX,AX ;Записать в стек

PUSH AX ;нулевой адрес

CALL B10 ;Вызвать В10

MOV DS,AX ;в регистр DS

MOV AX,0250 ;Переслать 0250 в АХ

ADD AX,0125 ;Прибавить 0125 к АХ

MOV CX,AX ;Записать сумму в CX

RET ;Вернуться в DOS

BEGIN ENDP

;--------------------------------------------------------

B10 PROC

CALL C10 ;Вызвать С10

SUB AX,AX

SUB CX,CX

RET ;Вернуться в вызывающую программу

B10 ENDP

;---------------------------------------------------------

C10 PROC

ADD AX,1

MOV BX,AX

INC BX

RET ;Вернуться в вызывающую программу

C10 ENDP

;-----------------------------------------------------------

CODESG ENDS

END BEGIN

Команда CALL автоматически записывает в стек относительный адрес команды, следующий непосредственно за командой CALL, уменьшая при этом указатель вершины стека. В вызываемой процедуре команда RET использует этот адрес для возврата в вызывающую процедуру и при этом автоматически увеличивается указатель вершины стека.

При передаче управления в ЕХЕ-программу в регистрах микропроцессора устанавливаются следующие значения:

DS и ES: Адрес префикса программного сегмента - область в 256 (100Н) байт, которая предшествует выполняемому программному модулю в памяти.

CS: Адрес точки входа в программу (адрес первой выполняемой команды).

IP: Нуль.

SS: Адрес сегмента стека.

SP: Относительный адрес, указывающий на вершину стека.

3.2. Выполните ассемблирование программы callpr.asm с получением листинга. Запишите листинг в отчет. Выполните компоновку программы.

3.3. Вызовите отладчик DEBUG для пошагового выполнения программы. С помощью команды R просмотрите начальное состояние регистров микропроцессора. С помощью команды D SS:00 просмотрите сегмент стека. Параграфы, отведенные под стек должны быть обнулены. Определите адрес по которому кончается стек и сравните этот адрес с содержимым указателя вершины стека SP. Введите команду Т,

после чего выполнится первая команда PUSH. Определите, как изменилось содержимое указателя вершины стека SP. Проверьте записалось ли содержимое регистра DS в стек, просмотрев еще раз сегмент стека.

Обратите внимание, слова в стек записываются в обратной последовательности, например, 00 07 записывается в виде 07 00. Отладчик DEBUG при использовании его для просмотра стека заносит в стек другие значения, включая содержимое IP, для собственных нужд.

3.4. Продолжая пошаговый режим выполните вторую команду PUSH. Определите, как изменилось содержимое указателя вершины стека и проверьте записался ли нулевой результат из регистра АХ в стек, еще раз просмотрев сегмент стека.

3.5. Выполните команду CALL B10. Определите, как изменилось содержимое указателя вершины стека и какое новое число записалось в стек. Это число является адресом возврата после окончания процедуры CALL B10. Найдите этот адрес по листингу программы и определите команду на которую перейдет микропроцессор после окончания процедуры CALL B10. Сама команда CALL B10 вызывает процедуру B10, первой командой которой является команда CALL C10.

3.6. Выполните команду CALL C10. Определите, как изменилось содержимое указателя вершины стека и какое новое число записалось в стек. Выводы запишите в отчет.

3.7. Продолжая пошаговый режим, выполните команду RET процедуры С10. Определите, как изменилось содержимое указателя вершины стека SP, какое число записалось в регистр команд IP, какое число исчезло из стека. Проверьте по листингу, какая команда находится по адресу, указанному в регистре команд IP. Выводы запишите в отчет.

3.8. Продолжая пошаговый режим, выполните команду RET процедуры B10. Определите, как изменилось содержимое указателя вершины стека SP, какое число записалось в регистр команд IP, какое число исчезло из стека. Проверьте по листингу, какая команда находится по адресу, указанному в регистре команд IP. Выводы запишите в отчет.

3.9. Для выхода из отладчика введите команду Q.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]