2013年11月20日水曜日

【GAS】アセンブラで名前付きローカル変数を利用できるようにするm4マクロ

アセンブラ開発でしばしば使われるm4マクロを使って
高級言語のように名前付き変数を実現する方法を紹介します。以下のコードはLinux GCC専用です。

define(`tmpcount',0)
define(`setVars',`ifelse($#,1,,eval($#%2),0,`dnl
        define(`count$1',eval(tmpcount+$2)) dnl
        define(`tmpcount',eval(tmpcount+$2)) dnl
        define($1,`-count$1 (%ebp)') dnl
        setVars(shift($@))',`setVars(shift($@))') dnl
')

上記のマクロを定義して、以下のように、setvarsマクロによって変数の宣言を行います。

hello: .string "hello!"
.global main
main:
        pushl %ebp
        movl  %esp,%ebp
        subl  $8,%esp
        setVars(var1,4,var2,4)
        movl    $1,var1
        movl    $2,var2
        pushl $hello
        call puts
        leave
        ret

setVarsマクロはsetVars(変数1の名前,変数1のバイト数,変数2の名前,変数2のバイト数,...)
といった具合に宣言を行います。

0 件のコメント:

コメントを投稿