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

时间:2012-04-18 08:32:57

标签: c linux

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

我尝试在Linux中模拟exit()的行为。但是在现代Linux中我发现这很难做到,因为在exit()之后会调用一些退出处理程序。 所以我写了一个旧版本的exit()。也许10年前你可以在一些代码中找到它。 我用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

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

2 个答案:

答案 0 :(得分:5)

您不能在引用字符串

中嵌入换行符
// bad
"two
lines"

重写为

// good
"two\n"
"lines"

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

"two\nlines"

答案 1 :(得分:1)

根据我对内联汇编的记忆,您可能需要在分号之后用\n\t终止每一行。

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