1

当我编译以下示例代码(这些本质上是没有实际用途的垃圾汇编语句)时,我收到以下错误;

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风格的内联汇编尝试中可能存在错误,但这是我要克服的另一个垫脚石。在这个时间点,我似乎无法定义操作码列表,然后定义由它们构建的汇编语句列表,就像我可以通过定义文本命令一样。我怎样才能ASMiASM声明一样工作?

4

2 回答 2

2

正如错误消息所述,__asm__操作员需要一个字符串而不是数字,并且在该字符串中它需要有效的汇编程序。

您正在尝试直接编写二进制操作码,这与汇编程序无关。

于 2013-09-30T20:22:25.487 回答
1

这可能有效:

#define MOV ".byte 0xB8\n"
#define NOP ".byte 0x90\n"

确切的语法当然取决于您的汇编程序(适当的机器语言取决于您的目标平台)。除了实验之外,这对其他任何事情都没有多大用处。这不是编写代码的好方法。

于 2013-09-30T20:34:03.257 回答