Scenariusz na lab 5

Makra w NASM

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=d
po wykonaniu (w trakcie rozwijania makra)
      %rotate 1
otrzymamy
  %1=b %2=c %3=d %4=a

Wywołania funkcji

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, fuStyle
co 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
      %endmacro
Jest 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.