5

私は現在、アセンブリ言語、特に GNU アセンブラー、IA-32 (x86) の AT&T 構文でのマクロの概念を理解しようとしています。私の大学のスライドには次のように書かれています。

# How to define a macro:
.macro write string
    movl string, %esi
    call printstr
.endm

# How to use a macro:
write aString

しかし、これは私にはうまくいきません。コードのコンパイルにgccを使用しています。

.data
    msg:    .string "The result is %d.\n"

.text
.global main

.macro add_3 n
    movl n, %eax
    addl $3, %eax
.endm

main:
    add_3 $39
    pushl %eax
    pushl $msg
    call printf
    popl %eax
    popl %eax
    movl $1, %eax
    int $0x80

これをコンパイルしようとすると、次のエラーが発生します。

undefined reference to `n'

私は正確に何を間違っていますか?

4

1 に答える 1

7

マクロ内の引数を参照するには、名前の前にバックスラッシュを追加します。例えば:

.macro  add_3  n
    movl \n + 3, %eax
.endm

GAS マニュアル: https://sourceware.org/binutils/docs/as/Macro.html

于 2013-11-19T00:53:27.043 に答える