考虑:
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条答案
按热度按时间f0brbegy1#
不能在带引号的字符串中嵌入换行符
改写为
预处理器将无缝地连接字符串,以
tct7dpnv2#
根据我对内联汇编的记忆,您可能需要在分号或类似的东西之后使用
\n\t
终止每一行。澄清:
仅仅用
;
终止内联汇编中的每一行是不够的。内联汇编是由gcc作为字符串直接提供给汇编器的。如果你不使用\n
终止每一行,汇编程序将得到像movl $0x1,%%eax;movl $0x0,%%ebx;
这样的字符串,它将无法解析。您可能不再需要使用\n\t
,因为gcc可以处理命令前面没有\t
的汇编文件。