この記事について
Linuxでx86アセンブラ、第7回.今回はマクロについて扱います.
アセンブラにはCで言う関数がありません.その代わり、プロシージャやマクロを使います.プロシージャは動的に呼び出されるのに対してマクロは静的(アセンブル時)にプログラムに埋め込まれます.プロシージャのような柔軟性はありませんが、スタックフレームの構築が必要ないため高速に動作します.
しかし、短所もあります.マクロは単に呼び出された箇所でマクロ内に記述された命令に置き換えるだけです.なので、マクロを多用すると生成される実行ファイルのサイズが巨大化します.
マクロの定義方法
マクロは以下のように定義します.
%macro <マクロ名> <引数の数>
~マクロの処理~
%endmacro
nasmのマクロは引数に名前をつけることができません.その代わり、
%1
%2
%3
このように%に番号をつけ、引数の渡された順番でアクセスします.
マクロの呼び出し方
同じソースコード内ならマクロの名前に引数をつけるだけで呼び出せます.
mymacro eax, ebx, 23
他のファイルで定義したマクロを読み来るには%include
を使います.
%include "<ファイルの名前>"
デモコード
rax、rbx,rcxレジスタの値を合計するマクロのデモコードです.
%macro sum 3
add %1, %2
add %1, %3
%endmacro
%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上で実行してみてください.
参考文献
- NASM development team site:
http://www.nasm.us/ - GDB: The GNU Project Debugger site:
https://www.gnu.org/software/gdb/ - Assembly Language Step-by-Step: Programming with Linux:
http://www.amazon.co.jp/Assembly-Language-Step---Step-Programming/dp/0470497025/ref=sr_1_1?ie=UTF8&qid=1446704607&sr=8-1&keywords=assembly+language+step+by+step - Stack Analysis with GDB:
http://resources.infosecinstitute.com/stack-analysis-with-gdb/
↓↓過去の投稿もよろしくね↓↓
-
Linuxでx86アセンブラ(スタック編)
http://qiita.com/MoriokaReimen/items/31a8f8ce4a46ba0f3590 -
Linuxでx86アセンブラ(基本的なコードの構造編)
http://qiita.com/MoriokaReimen/items/b320e6cc82c8873a602f -
Linuxでx86アセンブラ(論理演算編)
http://qiita.com/MoriokaReimen/items/bf863585616ad0a0a969 -
Linuxでx86アセンブラ(四則演算編)
http://qiita.com/MoriokaReimen/items/4853587dcb9eb96fab62 -
Linuxでx86アセンブラ(Cとの連携編)
http://qiita.com/MoriokaReimen/items/590a4ddb3de15bfacb4b -
Linuxでx86アセンブラ(道具編)
http://qiita.com/MoriokaReimen/items/b316a68d76c1eafa18f8 -
tmuxの使い方
http://qiita.com/MoriokaReimen/items/d7d5b158cb412dd65a60
↓↓コメントをいただけたら励みになります↓↓