【问题标题】:C; Inline assembly syntax mistake "Expected string literal before numerical constant"C;内联汇编语法错误“数字常量之前的预期字符串文字”
【发布时间】:2013-09-30 20:16:53
【问题描述】:

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

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 语句一样工作?

【问题讨论】:

    标签: c inline-assembly


    【解决方案1】:

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

    你正在尝试直接编写二进制操作码,这与汇编程序没有太大关系。

    【讨论】:

    • 好吧,既然你这么说,这似乎很明显!哈,我真是个笨蛋。谢谢 Jens Gustedt,我会重新考虑我在做什么,并在下面尝试 Eric 的建议。
    【解决方案2】:

    这可能有效:

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

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

    【讨论】:

    • 我同意这不是一个好的写作方式,是的,它纯粹是为了实验工作,只是我自己的自学等。我会试试你的建议。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2012-08-03
    相关资源
    最近更新 更多