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!