10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-29

: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:↓↓

10
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?