174
6. Makrojęzyk asemblera MASM
Przykład
• Wywołanie makroinstrukcji
IRPC X, 1234 DB X ENDM
powoduje wygenerowanie w programie źródłowym dyrektyw
DB 1 DB 2 DB 3 DB 4
Ta makroinstrukcja umożliwia zdefiniowanie nowej instrukcji, której stosowanie w programie źródłowym powoduje generowanie ciągu rozkazów maszynowych, dyrektyw, komentarzy itp. (ogólnie wiersza programu). Składnia definicji jest następująca
nazwa MACRO [listaparametrówfornialnych]
; treść makroinstrukcji:
; rozkazy, dyrektywy, komentarze itp.
ENDM
przy czym:
- nazwa spełnia ogólne wymagania asemblera dotyczące nazw symbolicznych; w programie będzie służyć do wywoływania makroinstrukcji,
- lista parametrów formalnych jeżeli występuje, to określa argumenty używane w definicji makroinstrukcji, które w czasie wywołania mogą być zmieniane.
Definicja makroinstrukcji w programie źródłowym nie powoduje w procesie asemblacji wygenerowania żadnego kodu wynikowego. Asembler zapamiętuje jedynie, jaką sekwencję rozkazów i dyrektyw należy wprowadzić do programu źródłowego po napotkaniu wywołania makroinstrukcji. Składnia wywołania jest następująca
nazwa [listaparametrówaktualnych]
lista ^parametrówaktualnych zawiera argumenty podstawione w rozwinięciu makroinstrukcji w programie źródłowym za argumenty z listyjparamelrów Jonnalnych.
Liczba argumentów w liście jest ograniczona jedynie długością wiersza programu. Liczba argumentów w obu listach musi być jednakowa. Gdy nie jest spełniony ostatni warunek, w rozwinięciu makroinstrukcji pomija się nadliczbowe argumenty lub też zamiast brakujących przyjmuje się argumenty puste.
Przykłady
• Definicja makroinstrukcji bez parametrów formalnych, pozwalająca symulować rozkaz przesłania zawartości wszystkich rejestrów do stosu
6.2. Makroinstrukcja definiowana
powered by
Mi siół5
PUSHALL MACRO
PUSH BP MOV BP,SP
IRP REJESTR, < AX,BX,CX,DX,SI,DI,DS,ES> PUSH REJESTR ENDM PUSHF
ENDM ^
Wywołanie makroinstrukcji PUSHALL powoduje wygenerowanie przez asembler w miejscu wywołania następującej sekwencji rozkazów
PUSH BP
MOV BP, SP PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH DS PUSH ES
PUSH «
• Analogicznie można zdefiniować makroinstrukcję realizującą odwrotną funkcję
POPALL MACRO
POPF
IRP REJESTR, < ES,DS,DI,SI,DX,CX,BX,AX >
POP REJESTR ENDM MOV SP, BP POP BP
ENDM ♦
Należy pamiętać o ustawieniu poszczególnych rejestrów we właściwej kolejności.
• Definicja makroinstrukcji z parametrami formalnymi, pozwalającej przepisać tablicę bajtów o dowolnej długości w pamięci operacyjnej
DANE SEGMENT
• • • •
PREPISZ TAB MACRO ZRODLO,PRZEZNACZENIE,DLUGOSC
PUSH ES MOV AX,DS MOV ES,AX; ES = DS ASSUME ES:DANE