11
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Linuxでx86アセンブラ(マクロ編)

:large_blue_diamond:この記事について

Linuxでx86アセンブラ、第7回.今回はマクロについて扱います.
アセンブラにはCで言う関数がありません.その代わり、プロシージャやマクロを使います.プロシージャは動的に呼び出されるのに対してマクロは静的(アセンブル時)にプログラムに埋め込まれます.プロシージャのような柔軟性はありませんが、スタックフレームの構築が必要ないため高速に動作します.
しかし、短所もあります.マクロは単に呼び出された箇所でマクロ内に記述された命令に置き換えるだけです.なので、マクロを多用すると生成される実行ファイルのサイズが巨大化します.

:large_blue_diamond:マクロの定義方法

マクロは以下のように定義します.

%macro <マクロ名> <引数の数>
~マクロの処理~
%endmacro

nasmのマクロは引数に名前をつけることができません.その代わり、

%1
%2
%3

このように%に番号をつけ、引数の渡された順番でアクセスします.

:large_blue_diamond:マクロの呼び出し方

同じソースコード内ならマクロの名前に引数をつけるだけで呼び出せます.

mymacro eax, ebx, 23

他のファイルで定義したマクロを読み来るには%includeを使います.

%include "<ファイルの名前>"

:large_blue_diamond:デモコード

rax、rbx,rcxレジスタの値を合計するマクロのデモコードです.

sum.asm
%macro sum 3
   add %1, %2
   add %1, %3
%endmacro 
mymacro.asm
%include "sum.asm"
section .data

section .bss

section .text

global main

main:
   enter 0,0
   nop

.call_macro:
   mov rax, 1
   mov rbx, 2
   mov rcx, 3
   sum rax, rbx, rcx

.final:
    mov eax, 0
    leave
    ret

コンパイルしてgdb上で実行してみてください.

参考文献

↓↓:bowtie:過去の投稿もよろしくね:bowtie:↓↓

↓↓:bowtie:コメントをいただけたら励みになります:bowtie:↓↓

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
11
Help us understand the problem. What are the problem?