当我编译以下示例代码(这些代码本质上是垃圾程序集语句而没有实际用途)时,我收到以下错误;
def-asm-pop.c:13:3:错误:数字前的预期字符串文字 恒定
第13行是未注释的“ASM”行;
#define iMOV "mov %eax,%ebx\n\t"
#define iNOP "nop\n\t"
#define iASM __asm__(iMOV iNOP)
#define MOV 0xB8
#define NOP 0x90
#define ASM __asm__(MOV NOP)
int main() {
//iASM; /* This one works when uncommented */
ASM; /* The one causes the error when uncommented */
return 0;
}
我的 Hello World 样式尝试内联汇编可能有错误,但这是我要克服的另一个敲门砖。在这个时间点,我似乎无法定义操作码列表,然后定义一个由它们构建的汇编语句列表,就像我可以通过定义文本命令一样。如何使ASM
像iASM
声明一样工作?
答案 0 :(得分:2)
正如错误消息所述,__asm__
运算符需要一个字符串而不是一个数字,并且在该字符串中它需要有效的汇编程序。
您正在尝试直接编写二进制操作码,这与汇编程序没什么关系。
答案 1 :(得分:1)
这可能有效:
#define MOV ".byte 0xB8\n"
#define NOP ".byte 0x90\n"
确切的语法当然取决于您的汇编程序(相应的机器语言取决于您的目标平台)。除了试验之外,这没什么用处;这不是编写代码的好方法。