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

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

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

.286

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

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

EXTRN SUBMUL2: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 PUBLIC '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 SUBMUL2 ;Вызвать подпрограмму

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

BEGIN ENDP

CODESG ENDS

END BEGIN

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

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

.286

TITLE SUBMUL2 Вызываемая подпрограмма умножения

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

CODESG SEGMENT PARA PUBLIC 'Code'

SUBMUL2 PROC FAR

ASSUME CS:CODESG

PUBLIC SUBMUL2

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

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

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

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

SUBMUL2 ENDP

CODESG ENDS

END SUBMUL2

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

2.3. Выполнить ассемблирование основной программы и подпрограммы.

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

Для данного примера имеется одно изменение в основной программе и одно - в подпрограмме. В обоих случаях в директиве SEGMENT используется атрибут PUBLIC.

Из таблицы идентификаторов (в конце каждого листинга ассемблирования) следует, что обобщенный тип кодового сегмента CODESG - PUBLIC (в предыдущем примере было NONE). При этом компоновщик объединит два логических кодовых сегмента в один физический кодовый сегмент.

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

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

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

3. Программа: общие данные в подпрограмме.

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

.286

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

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

EXTRN SUBMUL3:FAR

PUBLIC QTY,PRICE

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

STACKSG SEGMENT PARA STACK 'Stack'

DW 64 DUP(?)

STACKSG ENDS

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

DATASG SEGMENT PARA PUBLIC 'Data'

QTY DW 0140H

PRICE DW 2500H

DATASG ENDS

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

CODESG SEGMENT PARA PUBLIC 'Code'

BEGIN PROC FAR

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

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATASG

MOV DS,AX

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

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

BEGIN ENDP

CODESG ENDS

END BEGIN

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

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

.286

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

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

EXTRN QTY:WORD,PRICE:WORD

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

CODESG SEGMENT PARA PUBLIC 'Code'

SUBMUL3 PROC FAR

ASSUME CS:CODESG

PUBLIC SUBMUL3

MOV AX,PRICE

MOV BX,QTY

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

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

SUBMUL3 ENDP

CODESG ENDS

END SUBMUL3

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

3.3. Выполнить ассемблирование основной программы и подпрограммы.

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

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

В основной программе имена QTY и PRICE определены как PUBLIC. Сегмент данных также определен с атрибутом PUBLIC.

В подпрограмме имена QTY и PRICE определены как EXTRN и WORD. Такое определение указывает ассемблеру на длину этих полей в 2 байт. Благодаря этому ассемблер сгенерирует правильный код операции для команд MOV, а компоновщик установит значения операндов.

Команды MOV в листинге программы имеют следующий вид:

А1 0000е MOV AX,PRICE

8B 1E 0000e MOV BX,QTY

В объектном коде А1 обозначает пересылку слова из памяти в регистр АХ, а 8В - пересылку слова из памяти в регистр ВХ (объектный код для операций с регистром АХ чаще требует меньшего числа байтов, чем с другими регистрами).

3.4. Выполните трассировку программы callmul3.exe с помощью отладчика DEBUG.

Трассировка выполнения программы показывает, что компоновщик установил в объектном коде следующие операнды:

А1 0200

8В 1Е 0000

Объектный код теперь идентичен коду, сгенерированному в предыдущем примере, где команды MOV находились в вызывающей программе.

Выводы о работе программы запишите в отчет.

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