2016-03-21 4 views
0

私はアセンブリコードで新しくなっています。私は次のように関数を作成するマクロを書いている
ASM - プリプロセッサのラベルを連結する

.macro CREATE_FUNC ARG1 ARG2 
.align 4 
.func ARG1 
     cmpl $0x1, some_var 
     je  skip_exec 
     call ARG2 
skip_exec: 
     iret 
.endfunc 
.endm 

は、今私は2つの機能Bを作成したいので、私は次のコードを書いている:

CREATE_FUNC a, aa 
CREATE_FUNC b, bb 

しかし、コードをコンパイルするときに、 "skip_exec 'がすでに定義されています"エラーが発生しました。つまり、のCREATE_FUNCは、' skip_exec 'が既に機能。
私は、次のいずれかでそれを解決するために考えた:skip_exeC##のARG1のようなもの、入力パラメータARG1にラベルskip_execを連結

  1. - しかし、それは動作しませんでしたし、私は方法がわかりませんそれは...
  2. マクロの先頭に "LOCAL skip_exec"セクションを定義することができます。しかし、それは問題を解決しなかった、私はコンパイルでエラーを取得し続けます。

誰でも私のやり方を理解するのを手伝ってもらえますか(1)、なぜ(2)が私にはうまくいかないのですか?

ありがとうございます!

答えて

0

私は接頭辞@ \を置くことによってローカルラベルを使用することができますが見つかりました:

.macro CREATE_FUNC ARG1 ARG2 
.align 4 
.func ARG1 
     cmpl $0x1, some_var 
     je  skip_exec\@ 
     call ARG2 
skip_exec\@: 
     iret 
.endfunc 
.endm 
+0

ありません。このソリューションは、* *作業してはなりません。 GNUアセンブラは '\ @'をマクロカウンタとして保持しているので、このサンプルコードでは 'skip_exec0'と' skip_exec1'という2つのシンボルを定義し、 'skip_exec'を呼び出す' je skip_exec'を呼びます。 – starrify

+0

また、 '\ @'は実際にカウンタとして働いているので、多くの場合役に立ちますが、これは役に立ちません。 – starrify

+0

skip_execの代わりにskip_exec \ @にジャンプするようにコードに変更しました。うまくいきます。 – RRR

1

あなたはlocal labelsを使用することができます。

.macro CREATE_FUNC ARG1 ARG2 
.align 4 
.func ARG1 
     cmpl $0x1, some_var 
     je  1f 
     call ARG2 
1: 
     iret 
.endfunc 
.endm 
関連する問題