180 6. Makrojęzyk asemblera MASM
DBA | |
ENDM |
; wersja bez % |
BAJTY MACRO A BAJTY |
MACRO A |
B =0 |
B = 0 |
REPT A |
REPT A |
BAJT %B |
DB B |
B = B+ 1 |
B = B -t-1 |
ENDM |
ENDM |
ENDM |
ENDM |
Wywołanie makroinstrukcji w postaci | |
BAJTY 3 |
BAJTY 3 |
spowoduje wygenerowanie dyrektyw | |
DBO |
DB B |
DB 1 |
DB B |
DB 2 |
DB B |
• Makroinstrukcja dokonująca konwersji tablicy (łańcucha) zawierającej kolejne cyfry liczby, wyrażone w kodzie ASCII, na jej dwójkową postać. ^
ASCII BIN MACRO ŁAŃCUCH,DLUGOSC,WYNIK ; konwersja ASCII -* postać dwójkowa LOCAL DZIESIEC,START,OBLICZ,MNOZ,KONIEC JMP START
DZIESIECDB 10
START: MOV WYNIK,0
XOR CX,CX ; CX«-0
OBLICZ: XOR AX,AX; AX<-0
MOV AL,ŁAŃCUCH [SI]; cyfra do konwersji SUB AL,30H; konwersja cyfry
CMP CX,2; czy ostatnia cyfra ? .|
JL KONIEC; tak
PUSH CX; nie, schowaj CX, bo LOOP !
DEC CX
MNOZ:MUL CS:DZIESIEC; pomnóż cyfrę przez n*10, przy LOOP MNOZ; czym n określa pozycję cyfry POP CX
KONIEC: ADD WYNIK,AX; wynik poprawny o kolejną cyfrę INC SI; następna cyfra
powered by
6.4. Przykłady stosowania makroinstrukcji I Mi sial
LOOP OBLICZ; do konwersji ENDM
Sposób wywołania
ASCIIBIN LICZBA,8,LICZBA BIN
• Makroinstrukcja umożliwiająca przepisywanie w pamięci bajtów, słów bądź podwójnych słów. Jest ona przykładem wywoływania makroinstrukcji wewnątrz innej makroinstrukcji. Głębokość zagnieżdżania makroinstrukcji jest ograniczona jedynie wielkością dostępnej w czasie asemblacji pamięci operacyjnej.
MOV BAJT
MOV SŁOWO
MOV PODWÓJNE
MOV ZMIENNA
MACRO X,Y; przesłanie bajtu MOV AL,Y MOV X,AL ENDM
MACRO X,Y ; przesłanie słowa PUSH Y POPX ENDM
MACRO X,Y ; przesłanie podwójnego słowa MOV_SLOWO < WORD PTR X >, < WORD PTR Y > MOV_SLOWO < WORD PTR X + 2>,< WORD PTR Y + 2>
ENDM
MACRO PRZEZN,ZRODLO IFE (TYPE PRZEZN)-(TYPE ZRODLO)
IFE (TYPE ZRODLO)-l
MOV BAJT PRZEZN, ZRODLO ELSE
IFE (TYPE ZRODLO)-l
MOV SŁOWA PRZEZN, ZRODLO;; tak, słowa! ELSE ;; nie słowa
MOV PODWÓJNE PRZEZN, ZRODLO ;; podwójne słowa ENDIF ENDIF
ELSE ;; typy niezgodne
CALL BLAD ENDIF
;; typy zgodne? ;; lak, bajty?
;; tak, bajty!
;; nie bajty ;; słowa ?
ENDM
Sposoby poprawnego wywołania
MOV_ZMIENNA BAJT 1, BAJT 2 MOV ZMIENNA SŁOWO l, SLOWO_2 MOV ZMIENNA BAJT 1, SLOWO_2 MOY ZMIENNA PODWOJNE1, PODWÓJNE 2