有没有办法使用C宏在.S文件中生成asm代码?

时间:2013-03-14 17:12:55

标签: c assembly

我必须生成冗余的asm代码,它不断调用不同的C函数

我正在尝试做类似

的事情
#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文件中用单行划分asm代码?

2 个答案:

答案 0 :(得分:1)

简答:不,C宏扩展为单个字符串,没有换行符。

如果您想坚持使用.s文件,可以使用GNU Assembler macros

这完全未经测试,可能是错误的:

.macro CODEGEN func
push a
call \func
pop a
.endm

答案 1 :(得分:0)

分号';'可以用来代替换行符。

类似

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

将编译并运作