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

1. Программа: использование директив extrn и public для меток.

1.1. Записать в текстовом редакторе следующую программу в ЕХЕ-формате:

.286

TITLE CALLMUL1 (EXE) Вызов подпрограммы умножения

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

EXTRN SUBMUL:FAR

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

STACKSG SEGMENT PARA STACK 'Stack'

DW 64 DUP(?)

STACKSG ENDS

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

DATASG SEGMENT PARA 'Data'

QTY DW 0140H

PRICE DW 2500H

DATASG ENDS

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

CODESG SEGMENT PARA 'Code'

BEGIN PROC FAR

ASSUME CS:CODESG,DS:DATASG,SS:STACKSG

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATASG

MOV DS,AX

MOV AX,PRICE ;Загрузить стоимость

MOV BX,QTY ;и количество

CALL SUBMUL ;Вызвать подпрограмму

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

BEGIN ENDP

CODESG ENDS

END BEGIN

Записать эту программу на диск под именем callmul1.asm.

1.2. Записать в текстовом редакторе следующую подпрограмму:

.286

TITLE SUBMUL1 Подпрограмма для умножения

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

CODESG SEGMENT PARA 'Code'

SUBMUL PROC FAR

ASSUME CS:CODESG

PUBLIC SUBMUL

MUL BX ;AX-стоимость,

;ВХ-количество

;Произведение в DX:AX

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

SUBMUL ENDP

CODESG ENDS

END SUBMUL

Записать эту подпрограмму на диск под именем submul1.asm.

1.3. Выполнить ассемблирование основной программы и подпрограммы. Для этого в командной строке DOS необходимо ввести следующую команду:

tasm.exe callmul1.asm+submul1.asm /l

При этом ассемблер создаст два obj-модуля и два листинга для основной программы и подпрограммы соответственно.

1.4. Просмотреть листинги основной программы и подпрограммы и записать их в отчет.

В основной программе определены сегменты для стека, данных и кода. В сегменте данных определены поля QTY и PRICE. В кодовом сегменте регистр АХ загружается значением PRICE, а регистр ВХ - значением QTY, после чего происходит вызов подпрограммы. Директива EXTRN в основной программе определяет SUBMUL как точку входа в подпрограмму.

Подпрограмма содержит директиву PUBLIC (после ASSUME), которая указывает компоновщику, что точкой входа для выполнения является метка SUBMUL. Подпрограмма умножает содержимое регистра АХ (цена) на содержимое регистра ВХ (количество). Результат умножения вырабатывается в регистровой паре DX:AX в виде числа 002Е 4000.

Так как подпрограмма не определяет каких-либо данных, то ей не требуется сегмент данных. Если бы подпрограмма имела сегмент данных, то только она одна использовала бы свои данные.

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

1.5. Выполните компоновку основной программы и подпрограммы.

Для этого в командной строке DOS введите следующую команду:

tlink.exe callmul1.obj+submul1.obj

Компоновщик создаст загрузочный модуль callmul1.exe.

1.6. Выполните трассировку программы с помощью отладчика DEBUG. Обратите внимание как изменяется содержимое регистров CS и IP при вызове подпрограммы и при возврате в основную программу. Выводы о работе программы запишите в отчет.

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