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 文件中单行编写的 asm 代码?

4

2 回答 2

3

是的,通过使用分号,请参阅其他答案。C 宏扩展为没有换行符的单个字符串,但分号可以解决这个问题。

您还可以使用GNU 汇编器宏。这是完全未经测试的,可能是错误的:

.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 回答