Dostęp do parametrów makrowołania uzyskujemy używając %1
dla
pierwszego argumentu, %2
dla drugiego argumentu itd.
%0
podaje liczbę argumentów.
Polecenie (pseudoinstrukcja) %rotate
,,obraca'' parametry
w lewo lub w prawo zależnie od podanego argumentu, np. dla argumentów
%1=a %2=b %3=c %4=dpo wykonaniu (w trakcie rozwijania makra)
%rotate 1otrzymamy
%1=b %2=c %3=d %4=a
Wiele asemblerów posiada polecenia pozwalające przy wywołaniu funkcji bezpośrednio podać jej argumenty, np. w MASM mamy
call MessageBox, hOwner, lpszText, lpszTitle, fuStyleco w NASM wymaga kilku instrukcji:
push fuStyle push lpszTitle push lpszText push hOwner call MessageBox
Można to łatwo zapisać w NASM używając makr o zmiennej liczbie
parametrów (notacja `-*
') oraz polecenia %rep
%macro call32 2-* %rep %0-1 %rotate 1 push %1 %endrep %rotate 1 call %1 %endmacroJest na pliku
23. Napisz makro ENUM, uproszczoną wersję tego z C (tylko początkowa inicjalizacja, wymagana)
Użycie: ENUM integer,symbol,...
gdzie integer podaje wartość od której zaczynamy, a symbole to definiowane kolejno identyfikatory
Przykłady:
ENUM 0,TRUE,FALSE EQUalizuje TRUE z 0, a FALSE z 1 ENUM 11 JACK,QUEEN,KING JACK to 11, QUEEN to 12, a KING to 13.
Rozwiązanie: tutaj
24. Napisz makro call64, ułatwiające wołanie funkcji z argumentami (przy okazji utrudniające zachowywanie rejestrów). Przykład wywołania
wz db `Mamy: %d.\n`,0 ... call64 printf,wz,16
Argumentów zmiennopozycyjnych nie obsługujemy. Można ograniczyć się do 6 argumentów.
25. Wypisz parametry programu głównego - są na stosie.