关于GCC内联程序集的奇怪错误消息

ozxc1zmp  于 2023-06-05  发布在  其他
关注(0)|答案(2)|浏览(190)

考虑:

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

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

f0brbegy

f0brbegy1#

不能在带引号的字符串中嵌入换行符

// bad
"two
lines"

改写为

// good
"two\n"
"lines"

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

"two\nlines"
tct7dpnv

tct7dpnv2#

根据我对内联汇编的记忆,您可能需要在分号或类似的东西之后使用\n\t终止每一行。
澄清:
仅仅用;终止内联汇编中的每一行是不够的。内联汇编是由gcc作为字符串直接提供给汇编器的。如果你不使用\n终止每一行,汇编程序将得到像movl $0x1,%%eax;movl $0x0,%%ebx;这样的字符串,它将无法解析。您可能不再需要使用\n\t,因为gcc可以处理命令前面没有\t的汇编文件。

相关问题