有关GCC内联汇编的奇怪错误消息

int main() { __asm__("movl $0x1,%%eax; movl $0x0,%%ebx; int $0x80; ":::"eax","ebx"); } 

我尝试在Linux中模拟exit()的行为。 但在现代Linux中,我发现这样做很困难,因为一些退出处理程序将在exit()之后被调用。 所以我写了一个旧版本的exit()。 也许10年前,你可以在一些代码中find它。 我用gcc编译它。

 gcc -o exit exit.c 

它给了我这些信息。

 exit.c: In function 'main': exit.c:3:13: warning: missing terminating " character [enabled by default] exit.c:3:5: error: missing terminating " character exit.c:4:13: error: expected string literal before 'movl' exit.c:6:27: warning: missing terminating " character [enabled by default] exit.c:6:13: error: missing terminating " character 

我仔细检查了我的代码,我不认为我的代码是错误的。 那是什么?

Solutions Collecting From Web of "有关GCC内联汇编的奇怪错误消息"

您不能在引用的字符串中嵌入换行符

 // bad "two lines" 

重写为

 // good "two\n" "lines" 

预处理器将无缝地连接字符串

 "two\nlines" 

从我所记得的内联汇编中,可能需要在分号之后用\n\t来终止每一行。

澄清:
在内联程序集中终止每一行是不够的; 。 内联汇编作为一个字符串通过gcc直接送到汇编程序。 如果你不用\n终止每一行,汇编程序将得到如movl $0x1,%%eax;movl $0x0,%%ebx; 它将无法解析。 您可能不需要再使用\n\t因为gcc可以处理在\t之前没有命令的程序集文件。