abc Asembler - elektronski priručnik
XIX dio Makroi

Makroi

Pisanje makroa je još jedan način da se osigura modularno programiranje u asemblerskom jeziku.

  • Makro je sekvenca instrukcija, kojoj je dodijeljeno ime i koja se može koristiti bilo gdje u programu.
  • U NASM, makroi se definišu sa %macro i %endmacro direktivama.
  • Makro počinje sa %macro direktivom i završava sa %endmacro direktivom.

Sintaksa za definiciju makroa:

%macro   macro_name    number_of_params
; < macro body >
%endmacro

Gdje, number_of_params specificira broj parametara, macro_name specificira ime makroa.
Makro se poziva pomoću imena makroa zajedno sa potrebnim parametrima. Kada je potrebno koristiti neku sekvencu instrukcija mnogo puta u programu, moguće je staviti te instrukcije u makro i koristiti ga umjesto pisanja instrukcija sve vrijeme.
Na primjer, vrlo često je potrebno da program ispiše string karaktera na ekran. Za prikazivanje stringa karaktera, potrebna je sljedeća sekvenca instrukcija:

mov  edx, len 	;message length
mov  ecx, msg 	;message to write
mov  ebx, 1 	;file descriptor (stdout)
mov  eax, 4 	;system call number (sys_write)
int     0x80 	;call kernel

U gore navedenom primjeru prikaza stringa karaktera, korišteni su registri EAX, EBX, ECX i EDX pomoću INT 80H funkcijskog poziva. Dakle, svaki put kada je potreban prikaz na ekranu, moraju se sačuvati ovi registri na steku, pozvati INT 80H i onda obnoviti izvorne vrijednosti registara sa steka. Dakle, bilo bi korisno napisati dva makroa za čuvanje i obnavljanje podataka.
Primijetili smo da, neke instrukcije kao IMUL, IDIV, INT, itd., trebaju neke informacije spremiti u neke određene registre i čak vratiti vrijednosti u neke specifične registre. Ako program već koristi te registre za držanje važnih podataka, tada postojeći podaci iz tih registara moraju biti sačuvani na steku i obnovljeni nakon što se instrukcija izvrši.

Primjer
Sljedeći primjer pokazuje definisanje i upotrebu makroa:

; A macro with two parameters
; Implements the write system call
    %macro  write_string  2
            mov  eax,  4
            mov  ebx,  1
            mov  ecx,  %1
            mov  edx,  %2
            int  80h
%endmacro

section    .text
      global _start 	;must be declared for using gcc
_start: 			;tell linker entry point
        write_string  msg1,  len1
        write_string  msg2,  len2
        write_string  msg3,  len3
        mov   eax, 1 	;system call number (sys_exit)
        int   0x80 	;call kernel

section    .data
msg1  db  'Zdravo, programeri!', 0xA, 0xD
len1    equ $ - msg1
msg2  db  'Dobrodosli u svijet,',  0xA, 0xD
len2    equ $- msg2
msg3  db  'Linux asemblerskog programiranja! '
len3    equ $- msg3

Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:

Zdravo, programeri!
Dobrodosli u svijet,
Linux asemblerskog programiranja!

Rekurzija    <    Index    >    Upravljanje fajlovima