What are macros in assembly language?
Macros are used to make programs written in assembly code modular and concise. Macros are very similar to procedures but follow a different syntax and accept parameters. Macros are very similar to functions that are available in most high-level programming languages.
A procedure is a feature of Assembly Language that enables programmers to make assembly code modular. Unlike procedures,
macrosare defined outside of thetextsegment, accept parameters, and are primarily used to create small modules.
Syntax
We can declare a macro using the following syntax:
%macro macro_name parameter_count
instr#1
instr#2
...
...
instr#n-1
instr#n
%endmacro
Example
The program below demonstrates how a macro may print a string on the console:
We define three strings and their sizes in the data segment. Our macro takes in 2 parameters, the message that needs to be printed and its size, and contains the instructions needed to write to the stdout stream. The macro is called thrice to print each of the three strings. If a macro was not used, we would have to write all the instructions inside the macro thrice in the text segment. In this way, using macros helps us make our code modular and shorter in size.
%macro print 2mov edx, %1 ;length of message or the first argument stored in edxmov ecx, %2 ;message to be printed or the second argument stored in ecxmov ebx, 1 ;ebx contains the file descriptor of the file descriptor (1 for stdout)mov eax, 4 ;eax contains the system call number. 4 is the system call number for the write system callint 0x80 ;kernel interrupts to execute the write system call in kernel mode%endmacro ;returns to the address where the print procedure was last calledsection .textglobal _start_start:print len0, msg0 ;executes our macro with len0 and msg0 as the first and second arguments, respectivelyprint len1, msg1 ;executes our macro with len1 and msg1 as the first and second arguments, respectivelyprint len2, msg2 ;executes our macro with len2 and msg2 as the first and second arguments, respectivelymov eax, 1 ;system call number for the exit system call saved in eaxint 0x80 ;kernel interrupt to shift from user mode to kernel mode to execute the system callsection .datamsg0 db "Welcome to Educative!", 0x0A ;defines message to be printed. 0xA is \n in hex.len0 equ $ - msg0 ;stores length of the messagemsg1 db "We are glad to have you here.", 0x0A ;defines message to be printed. 0xA is \n in hex.len1 equ $ - msg1 ;stores length of the messagemsg2 db "You are almost an expert at assembly language now!", 0x0A ;defines message to be printed. 0xA is \n in hex.len2 equ $ - msg2 ;stores length of the messagesegment .bss
Free Resources