Perakitan - Makro

Menulis makro adalah cara lain untuk memastikan pemrograman modular dalam bahasa assembly.

  • Makro adalah urutan instruksi, ditetapkan dengan nama dan dapat digunakan di mana saja dalam program.

  • Di NASM, makro ditentukan dengan %macro dan %endmacro arahan.

  • Makro dimulai dengan% macro directive dan diakhiri dengan% endmacro directive.

Sintaks untuk definisi makro -

%macro macro_name  number_of_params
<macro body>
%endmacro

Di mana, number_of_params menentukan parameter angka, macro_name menentukan nama makro.

Makro dipanggil dengan menggunakan nama makro bersama dengan parameter yang diperlukan. Saat Anda perlu menggunakan beberapa urutan instruksi berkali-kali dalam sebuah program, Anda dapat meletakkan instruksi tersebut dalam makro dan menggunakannya daripada menulis instruksi sepanjang waktu.

Misalnya, kebutuhan yang sangat umum akan program adalah untuk menulis serangkaian karakter di layar. Untuk menampilkan serangkaian karakter, Anda memerlukan urutan instruksi berikut -

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

Dalam contoh di atas untuk menampilkan string karakter, register EAX, EBX, ECX dan EDX telah digunakan oleh pemanggilan fungsi INT 80H. Jadi, setiap kali Anda perlu menampilkan di layar, Anda perlu menyimpan register ini di stack, memanggil INT 80H dan kemudian mengembalikan nilai asli register dari stack. Jadi, akan berguna jika menulis dua makro untuk menyimpan dan memulihkan data.

Kami telah mengamati bahwa, beberapa instruksi seperti IMUL, IDIV, INT, dll., Memerlukan beberapa informasi untuk disimpan di beberapa register tertentu dan bahkan mengembalikan nilai di beberapa register tertentu. Jika program sudah menggunakan register tersebut untuk menyimpan data penting, maka data yang ada dari register ini harus disimpan di stack dan dikembalikan setelah instruksi dijalankan.

Contoh

Contoh berikut memperlihatkan pendefinisian dan penggunaan makro -

; 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	'Hello, programmers!',0xA,0xD 	
len1 equ $ - msg1			

msg2 db 'Welcome to the world of,', 0xA,0xD 
len2 equ $- msg2 

msg3 db 'Linux assembly programming! '
len3 equ $- msg3

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Hello, programmers!
Welcome to the world of,
Linux assembly programming!