【发布时间】:2013-08-12 01:59:08
【问题描述】:
我无法编译这个取自教程的程序。它应该打印“Hello World”。
void main()
{
__asm__("jmp forward\n\t"
"backward:\n\t"
"popl %esi\n\t"
"movl $4, %eax\n\t"
"movl $2, %ebx\n\t"
"movl %esi, %ecx\n\t"
"movl $12, %edx\n\t"
"int $0x80\n\t"
"int3\n\t"
"forward:\n\t"
"call backward\n\t"
".string \"Hello World\\n\""
);
}
gcc 4.7在Linux下给我以下错误:
gcc hello.c -o hello
hello.c: Assembler messages:
hello.c:5: Error: invalid instruction suffix for `pop'
还有没有办法避免为每一行指定双引号?
另外,我想知道如何修改程序以使用libc 调用printf 而不是kernel 服务。
【问题讨论】:
-
好吧,它应该是
int main,因为asm非常依赖于系统,因此它肯定会崩溃,具体取决于您使用的计算机 -
看起来您正在编译 x86-32 代码以输出到 x86-64 二进制文件。
-
您可以删除
ls 并将%e*更改为%r*,这样就可以到达某个地方。但是,不要相信我对此的看法。 -
@NayukiMinase 也许你应该发布一个答案,这样我们就可以投票了
-
不要误以为在 GCC 内联汇编中使用
call指令是一件简单的事情。除非你非常非常小心,否则有很多极端情况(尤其是在 64 位中)这样做会破坏事情。并非总是...只是有时...如果是这样,通常不会出现在您的内联汇编结束的地方。如果您这样做,clobber 列表 是必需的。
标签: c gcc assembly x86 inline-assembly