⚙️MACROS

Escribir una macro es otra forma de garantizar la programacion modular en asm.

  • Una macro es una secuencia de instrucciones, asignada por un nombre y posria usarse en cualquier parte del programa.

  • En nams, las macros se definen con las directivas %macro y %endmacro .

  • La macro comienza con la directiva %macro y termina con la directiva %endmacro.

Su sintaxis es:

%macro macro_name number_of_params
<macro body>
%endmacro

Donde, number_of_params especifica los parametroa numericos, macro_name especifica el nombre de la macro.

La macro se invoca utilizando el nombre de la macro junto con los parametros necesarios. Cuando necesite usar una secuencia de instrucciones muchas veces en un programa, puede poner esas instrucciones en una macro y usarla en lugar de escribir las instrucciones todo el tiempo.

Por ejemplo, una necesidad muy comun de los programas es escribir una cadena de caracteres en la pantalla. Para mostrar una cadena de caracteres, necesita la siguiente secuencia de instrucciones:

mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80

En este ejemplo, la llamada funcion int 0x80 utiliza los registros. Por lo tanto cada ves que necesite mostrar en pantalla , debe guardar los registros en la pila, invocar int 0x80 y luego restaurar el valor original de los registros de la pila . POr lo tanto, podria ser util escribir dos macros para guardar y restaurar datos.

Hemos observado que algunas instrucciones como IMUL, IDIV, INIT, etc, necesitan que parte de la insformacion se almacene en algunos registros particulares e incluso devuelven valores . Si el programa ya estaba usando esos registros para mantener datos importantes, entonces los datos existentes de estos registros deben guardarse en la pila y restaurarse despues de ejecutar la instruccion.

EJEMPLO:

Veamos este ejemplo:

%macro write_string 2
    mov eax, 4
    mov ebx, 1
    mov ecx, %1
    mov edx, %2
%endmacro

section .data
    msg1 db 'Hola', 0xa, 0xd
    len1 equ $ - msg1

    msg2 db 'BUenvenido ', 0xa, 0xd
    len2 equ $ - msg2
    
    msg3 db 'Linux es rey'
    len3 eque $ - msg3

section .text
    global _start:

_start:
    write_string msg1, len1
    write_string msg2. len2
    write_string msg3, len3
    
    mov eax, 1
    int 0x80

Última actualización