Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MAIN_ASS.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
153 Кб
Скачать
☆

Директива macro

Эта директива используется для создания макрокоманд. Формат директивы:

имя MACRO список_параметров

операторы

ENDM

Список_параметров представляет перечень фиктивных аргументов макроса и имеет следующий синтаксис:

[фикт_арг1[, фикт_арг2..]]

Каждый фиктивный аргумент имеет следующий синтаксис:

имя_фикт_аргум[: тип_фикт_аргум]

; Программа hello3_m.asm состоит из вызывающей программы и макроса ;WriteMsg. В WriteMsg используются функции BIOS.

WriteMsg MACRO

mov di,OFFSET Hello

mov ah,0eh

mov bh,0

Next: mov al,[di]

cmp al,’$’

je Quit

int 10h

inc di

jmp Next

Quit: ret

ENDM

AStack SEGMENT STACK

DW 12 DUP(?)

AStack ENDS

AData SEGMENT

Hello DB ‘Здравствуйте!$’

AData ENDS

ACode SEGMENT

ASSUME CS: ACode,DS: AData,SS: AStack

Main PROC FAR

push ds

sub ax,ax

push ax ;адрес начала PSP

mov ax,AData

mov ds,ax

WriteMsg

ret

Main ENDP

ACode ENDS

END Main

Рис 1.4. Программа содержит макрокоманду WriteMsg.

Еще один полезный пример программы, преобразующей строку цифр в коде ASCII в двоичный формат и наоборот(Рис 1.5.).

;Преобразование ASCII и двоичных форматов

TITLE EXCONV (EXE)

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

stacksg SEGMENT PARA STACK ‘Stack’

dw 32 dup(?)

stacksg ends

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

datasg SEGMENT PARA ‘Data’

ascval db ‘12345’

binval dw 0

asclen db 5

mult10 dw 1

asvout db 5 dup(0)

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

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

call b10asbi ;вызов преобразования ASCII

call c10bias ;вызов двоичного преобразования

ret

begin endp

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

; Преобразование ASCII в двоичное

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

b10asbi PROC

mov cx,10 ; фактор умножения

lea si,ascval-1 ; адрес ascval

xor bx,bx

mov bl,asclen ; длина  ascval

b20:

mov al,[si+bx] ; выбрать ASCII- символ

and ax,000fh ; очистить зону тройки

mul mult10 ; умножить на фактор 10

add binval,ax ; прибавить к двоичному

mov ax,mult10 ; вычислить следующий

mul cx ; фактор умножения

mov mult10,ax

; mov mult10,al

dec bl ; последний ASCII символ?

jnz b20 ; нет­ продолжать

ret

b10asbi endp

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

; Преобразование двоичного в ASCII

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

c10bias proc

mov cx,10 ; фактор деления

lea si,asvout+4

mov ax,binval ; загрузить двоичное число

c20:

cmp ax,0010 ; значение меньше 10?

jb c30 ; да- выйти

xor dx,dx ; очистить часть частного

div cx ; разделить на 10

or dl,30h

mov [si],dl ; записать ASCII символ

dec si

jmp c20

c30:

or al,30h ; записать полученное частное

mov [si],al ; как ASCII- символ

ret

c10bias endp

codesg ENDS

end begin

Рис. 1.5. Преобразование форматов.

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