- •Язык ассемблера и программирования Глава 1. Директивы языка ассемблера Директива segment
- •Директива group
- •Директива assume
- •Assume сегментный_регистр : имя [, ...]
- •Директива Proc
- •Директива macro
- •Оформление программ в виде отдельных модулей
- •Передача параметров в подпрограмму
- •Директивы упрощенного описания сегментов Директива model
- •Описание
- •Вызов процедур с использованием кадра стека
- •Глава 2. Вывод информации на терминал в текстовом режиме Вывод символьной строки. Модуль puts.
Директива 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. Преобразование форматов.
