我正在尝试使用内联汇编程序(gcc 4.2.1,Mac OS 10.7.5)调用系统调用write
,代码编译成功,但根本没有任何输出。这是完整的代码:
int main()
{
char s[] = "Test\n";
// write(1, s, 5);
asm(
"movq $1, %%rax;"
"movq $1, %%rdi;"
"movq %0, %%rsi;"
"movq $5, %%rdx;"
"syscall;"
:
: "r"(s)
: "%rax", "%rdi", "%rsi", "%rdx"
);
}
使用gcc编译:
$ gcc main.c -o test
执行命令
$ ./test
通过使用Xcode 4.5调试器运行代码,我收到此错误:
Thread 1: EXC_SYSCALL (code=1, subcode=0x1)
代码有什么问题?它与Ubuntu 12.04 LTS成功运行。
谢谢!
答案 0 :(得分:3)
正如我在上面的评论中提到的,系统呼叫号码是不同的。您需要将0x2000004
放在%rax
中才能使此程序在Mac OS X上运行。
我不确定你的程序在Ubuntu上是如何工作的,因为你在你的例子中使用了exit
系统调用号1
,而不是4
用于{{ 1}}。