2
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

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

4

2 回答 2

5

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

// bad
"two
lines"

改写为

// good
"two\n"
"lines"

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

"two\nlines"
于 2012-04-18T08:38:39.123 回答
1

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

澄清:用 .
终止内联汇编中的每一行是不够的;。内联汇编由 gcc 作为字符串直接提供给汇编器。如果您不以 结束每一行\n,汇编器将获得movl $0x1,%%eax;movl $0x0,%%ebx;无法解析的字符串。您可能不再需要使用,\n\t因为 gcc 可以处理命令前面没有\t.

于 2012-04-18T08:35:52.553 回答