2

さまざまな C 関数を呼び出し続ける冗長な asm コードを生成する必要があります

私は次のようなことをしようとしています

#define CODE_GEN(func) push a \
         call func
         pop a

のようなものを呼び出す

CODE_GEN(foo)

発生します

bash-4.1$ gcc -E mk.S 
# 1 "mk.S"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "mk.S"
# 1 "asm_gen.h" 1
# 2 "mk.S" 2
# 13 "mk.S"
pusha call foo popa iret

しかし、これはコンパイルに失敗します

bash-4.1$ gcc -m32 mk.S 
mk.S: Assembler messages:
mk.S:13: Error: junk `foo popa iret' after expression
mk.S:13: Error: suffix or operands invalid for `pusha'

.S ファイルで 1 行に記述された asm コードを区切る方法はありますか?

4

2 に答える 2

3

はい、セミコロンを使用して、他の回答を参照してください。C マクロは、改行なしで 1 つの文字列に展開されますが、セミコロンはそれを回避します。

GNU Assembler マクロも使用できます。これは完全にテストされていないため、間違っている可能性があります。

.macro CODEGEN func
push a
call \func
pop a
.endm
于 2013-03-14T18:26:50.413 に答える
3

セミコロン「;」改行の代わりに使用できます。

だから何か

#define CODE_GEN(func) push a; \
call func; \
pop a;

コンパイルして動作します

于 2014-03-03T04:29:03.200 に答える