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
|
 |