1

次のようなマクロを作成したいと思います。

.altmacro

.macro assert_eq a, b=%eax
    LOCAL ok
    #...
.endm

用途:

assert_eq $1
assert_eq $1, %eax

が必要.altmacroですLOCAL( を使用する別の可能性が見えますが\@、 が必要ですLOCAL)。

But when I try to compile this I get:

Error: % operator needs absolute expression

b=%eaxこの問題は、によって有効にされた別の機能を使用しようとしているという事実によって作成されていると推測しています.altmacro: Expression results as strings.altmacroこれがなくても問題なく記述できるからです。

これが正しい場合、マクロを機能させるにはどうすればそれを回避できますか? そうでない場合、コードの何が問題になっていますか?

おまけの質問: 使い方は%?

ガスのバージョン: 2.23.52

4

3 に答える 3

1

.altmacro の使用が必要なマクロにレジスタを引数として渡したいという非常によく似た問題に遭遇しました。機能した修正は、レジスタを <> で囲み、 ! を配置することでした。前 %。したがって、マクロを次のように変更してみてください

.macro assert_eq a, b=<%eax>

レジスタを引数としてマクロを呼び出したい場合は、

assert_eq <%eax>, <%ecx>
于 2014-11-01T01:05:41.550 に答える
1

では.altmacro、渡されたパラメータまたはパーセントを含むデフォルトは%、式として扱われます。

使用例:

.altmacro

.macro PERCENT x
    mov $\x, %eax
.endm
mov $0, %eax
PERCENT %1+1
/* eax == 2 */

.macro PERCENT_DEFAULT x=%1+1
    mov $\x, %eax
.endm
mov $0, %eax
PERCENT_DEFAULT 1
/* eax == 1 */
PERCENT_DEFAULT
/* eax == 2 */

その拡張が起こらないようにするには、 mfbutner が述べたようにする必要があります。

.altmacro

.macro PERCENT x
    mov \x, %eax
.endm
PERCENT <%ebx>

.macro PERCENT_DEFAULT x=<%ebx>
    mov \x, %eax
.endm
PERCENT_DEFAULT

この展開はマクロ自体ではなく、引数に対してのみ発生するため、引数がレジスタであることが確実な場合の 1 つの代替方法は、パーセントをマクロ内に配置することです。

.macro PERCENT_ESCAPE_REG x
    mov %x, %eax
.endm
mov $0, %eax
mov $1, %ebx
PERCENT_ESCAPE_REG ebx
/* eax == 1 */

$1しかし、これには、もう次のように即時を渡すことができないという欠点があります。

PERCENT_ESCAPE_REG $1

.altmacroこれは、発信者がすべての通話で余分なノイズを使用する必要があるため、を使用することに対する大きなターンオフです...

于 2015-09-23T10:10:55.747 に答える