Montaj - Makrolar

Bir makro yazmak, assembly dilinde modüler programlamayı sağlamanın başka bir yoludur.

  • Makro, bir adla atanan ve programın herhangi bir yerinde kullanılabilen bir talimatlar dizisidir.

  • NASM'de makrolar ile tanımlanır %macro ve %endmacro direktifler.

  • Makro,% makro yönergesi ile başlar ve% endmacro yönergesi ile biter.

Makro tanımı için Sözdizimi -

%macro macro_name  number_of_params
<macro body>
%endmacro

Nerede, number_of_params belirtir sayı parametreleri, macro_name makro belirtir ismi.

Makro, gerekli parametrelerle birlikte makro adı kullanılarak çağrılır. Bir programda bazı komut dizilerini birçok kez kullanmanız gerektiğinde, bu talimatları bir makroya koyabilir ve her zaman talimatları yazmak yerine onu kullanabilirsiniz.

Örneğin, programlar için çok yaygın bir ihtiyaç, ekrana bir karakter dizisi yazmaktır. Bir karakter dizisini görüntülemek için aşağıdaki talimat sırasına ihtiyacınız vardır -

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

Yukarıdaki bir karakter dizisini görüntüleme örneğinde, EAX, EBX, ECX ve EDX kayıtları INT 80H fonksiyon çağrısı tarafından kullanılmıştır. Bu nedenle, ekranda her görüntülemeniz gerektiğinde, bu yazmaçları yığına kaydetmeniz, INT 80H'yi çağırmanız ve ardından yazmaçların orijinal değerini yığından geri yüklemeniz gerekir. Bu nedenle, verileri kaydetmek ve geri yüklemek için iki makro yazmak faydalı olabilir.

IMUL, IDIV, INT vb. Gibi bazı komutların bazı bilgilerin belirli kayıtlarda saklanmasına ve hatta bazı özel kayıt (lar) da değerlerin döndürülmesine ihtiyaç duyduğunu gözlemledik. Program önemli verileri saklamak için zaten bu kayıtları kullanıyorsa, bu kayıtlardan gelen mevcut veriler yığına kaydedilmeli ve komut yürütüldükten sonra geri yüklenmelidir.

Misal

Aşağıdaki örnek, makroların tanımlanmasını ve kullanılmasını göstermektedir -

; 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

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

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