Assembly-programming-assembly-macros
提供:Dev Guides
アセンブリ-マクロ
マクロを記述することは、アセンブリ言語でモジュール式プログラミングを保証する別の方法です。
- マクロは、名前で割り当てられた一連の命令であり、プログラム内のどこでも使用できます。
- NASMでは、マクロは*%macro および%endmacro *ディレクティブで定義されます。
- マクロは%macroディレクティブで始まり、%endmacroディレクティブで終わります。
マクロ定義の構文-
%macro macro_name number_of_params
<macro body>
%endmacro
ここで、_number_of_params_は数値パラメーターを指定し、_macro_name_はマクロの名前を指定します。
マクロは、必要なパラメーターとともにマクロ名を使用して呼び出されます。 プログラムで命令のシーケンスを何度も使用する必要がある場合は、常に命令を記述する代わりに、それらの命令をマクロに入れて使用できます。
たとえば、プログラムの非常に一般的な必要性は、画面に文字列を書き込むことです。 文字列を表示するには、次の一連の指示が必要です-
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
上記の文字列表示の例では、レジスタEAX、EBX、ECXおよびEDXがINT 80H関数呼び出しによって使用されています。 したがって、画面に表示する必要があるたびに、これらのレジスタをスタックに保存し、INT 80Hを呼び出して、スタックからレジスタの元の値を復元する必要があります。 そのため、データを保存および復元するための2つのマクロを作成すると便利です。
IMUL、IDIV、INTなどの一部の命令では、一部の情報を特定のレジスタに格納し、特定のレジスタに値を返す必要があることを確認しました。 プログラムがすでに重要なデータを保持するためにこれらのレジスタを使用していた場合、これらのレジスタからの既存のデータはスタックに保存され、命令の実行後に復元されます。
例
次の例は、マクロの定義と使用を示しています-
; 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
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Hello, programmers!
Welcome to the world of,
Linux assembly programming!