Makros in Assembler schreiben
Das Schreiben eines Makros in Assembler ist eine weitere Möglichkeit, die modulare Programmierung in Assemblersprache sicherzustellen.
Was genau ist ein Makro in Assembler?
Ein Makro ist eine Folge von Anweisungen, die einem Namen zugeordnet sind und überall im Programm verwendet werden können. In NASM werden Makros mit % macro- und %endmacro- Direktiven definiert. Das Makro beginnt mit der %macro-Direktive und endet mit der %endmacro-Direktive.
Makro Syntax verstehen und richtig anwenden
Die Syntax für die Makrodefinition in Assembler sieht wie folgt aus:
%macro macro_name number_of_params <macro body> %endmacro
Dabei gibt der Begriff number_of_params die Anzahl der Parameter an, macro_name gibt den Namen des Makros an.
Das Makro in Assembler wird aufgerufen, indem der Makroname zusammen mit den erforderlichen Parametern verwendet wird. Wenn eine Reihe von Anweisungen mehrmals in einem Programm verwendet werden muss, können die Anweisungen in einem Makro gekapselt verwendet werden, anstatt die Anweisungen wiederholt zu schreiben.
Zum Beispiel besteht ein sehr häufiger Bedarf für Assembler Programme darin, eine Zeichenkette auf dem Bildschirm auszugeben. Um eine Zeichenfolge anzuzeigen, werden die folgenden Befehle immer wieder verwendet:
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
Im Beispiel zur Anzeige einer Zeichenkette wurden die Register EAX, EBX, ECX und EDX vom Funktionsaufruf INT 80H verwendet. Jedes Mal, wenn die Ausgabe auf dem Bildschirm angezeigt werden muss, müssen diese Register auf dem Stack gespeichert, INT 80H aufgerufen und dann den ursprünglichen Wert der Register aus dem Stack wiederhergestellt werden.
Es kann also sehr nützlich sein, zwei Makros zum Speichern und Wiederherstellen von Daten zu schreiben.
Assembler Makro Beispiel schreiben
Das folgende Beispiel zeigt das Definieren und Verwenden von Makros in der Programmiersprache Assembler:
; Ein Makro mit zwei Parametern %macro schreibe_string 2 mov eax, 4 mov ebx, 1 mov ecx, %1 mov edx, %2 int 80h %endmacro section .text global _start _start: ;Einstiegspunkt definieren schreibe_string msg1, len1 schreibe_string msg2, len2 schreibe_string msg3, len3 mov eax,1 ;Systemaufruf int 0x80 ;Aufruf des Kernels section .data msg1 db 'Hallo Programmierer!',0xA,0xD len1 equ $ - msg1 msg2 db 'Willkommen in der Welt', 0xA,0xD len2 equ $- msg2 msg3 db 'der Programmiersprache Assembler!' len3 equ $- msg3
Wenn nun der Quelltext in Assembler kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:
Hallo Programmierer! Willkommen in der Welt der Programmiersprache Assembler!
Weiterführende Artikel
- Dateiverwaltung