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

4. Использование макрокоманд внутри макроопределения.

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

.286

TITLE MACRO4 (EXE) Вложенные макрокоманды

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

INIT2 MACRO CSNAME,DSNAME,SSNAME

ASSUME CS:CSNAME,DS:DSNAME

ASSUME SS:SSNAME,ES:DSNAME

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DSNAME

MOV DS,AX

MOV ES,AX

ENDM ;Конец макрокоманды

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

DOS21 MACRO DOSFUNC

MOV AH,DOSFUNC

INT 21H

ENDM

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

DISP MACRO CHAR

MOV DL,CHAR

DOS21 02

ENDM

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

STAC SEGMENT PARA 'Stac'

DW 32 DUP(?)

STAC ENDS

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

DATA SEGMENT PARA 'Data'

NAMEPAR LABEL BYTE ;Список параметров

MAXLEN DB 20 ;Максимальная длина

ACTLEN DB ? ;Реальная длина

NAMEFLD DB 20 DUP (' ') ;Введенные символы

DATA ENDS

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

CSEG SEGMENT PARA 'Code'

BEGIN PROC FAR

.SALL

INIT2 CSEG,DATA,STAC ;Макрокоманда

LEA DX,NAMEPAR

DOS21 0AH

.LALL

DISP '*'

RET

BEGIN ENDP

CSEG ENDS

END BEGIN

Макроопределение DOS21 заносит в регистр АН номер функции DOS и выполняет INT 21H. Макроопределение DISP использует макроопределение DOS21 для установки в регистре АН функции 02 для вывода символа. Указывая параметр макроопределения DISP можно выводить любой символ.

4.2. Выполнить ассемблирование и компоновку программы. Запустить программу из панели NORTON. Просмотреть листинг программы и записать его в отчет.

5. Директива local.

5.1. Составить в текстовом редакторе следующую программу в COM-формате:

.286

TITLE MACRO5 (COM) Использование директивы LOCAL

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

DIVIDE MACRO DIVIDEND,DIVISOR,QUOTIENT

LOCAL COMP

LOCAL OUT

; AX=делимое ВХ=делитель СХ=частное

MOV AX,DIVIDEND ;Загрузить делимое

MOV BX,DIVISOR ;Загрузить делитель

SUB CX,CX ;Регистр для частного

COMP: CMP AX,BX ;Делимое < делителя?

JB OUT ;да - выйти

SUB AX,BX ;Делимое - делитель

INC CX ;Частное + 1

JMP COMP

OUT: MOV QUOTIENT,CX ;Записать результат

ENDM ;Конец макрокоманды

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

CSEG SEGMENT PARA 'Code'

ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG

ORG 100H

BEGIN: JMP SHORT MAIN

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

DIVDND DW 150 ;Делимое

DIVSOR DW 27 ;Делитель

QUOTNT DW ? ;Частное

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

MAIN PROC NEAR

.LALL

DIVIDE DIVDND,DIVSOR,QUOTNT

RET

MAIN ENDP

CSEG ENDS

END BEGIN

Программа иллюстрирует использование директивы LOCAL. В приведенной программе выполняется деление вычитанием; делитель вычитается из делимого и частное увеличивается на 1 до тех пор, пока делимое больше делителя. Для данного алгоритма необходимы две метки: COMP - адрес цикла, OUT - адрес выхода из цикла по завершении. Обе метки COMP и OUT определены как LOCAL и могут иметь

любые правильные ассемблерные имена.

В макрорасширении для COMP генерируется метка ??0000, а для OUT - ??0001. Если макрокоманда DIVIDE будет использована в этой программе еще один раз, то в следующем макрорасширении будут сгенерированы метки ??0002 и ??0003 соответственно. Таким образом, с помощью директивы LOCAL, обеспечивается уникальность меток в макрорасширениях в одной программе.

5.2. Выполнить ассемблирование и компоновку программы. Запустить программу из панели NORTON. Просмотреть листинг программы и записать его в отчет.

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