Macos 无法使用gcc内联汇编程序(64位)调用系统调用

Macos 无法使用gcc内联汇编程序(64位)调用系统调用,macos,gcc,assembly,inline-assembly,Macos,Gcc,Assembly,Inline Assembly,我试图用内联汇编程序(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;"

我试图用内联汇编程序(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
运行:

通过使用Xcode 4.5调试器运行代码,我得到以下错误:

Thread 1: EXC_SYSCALL (code=1, subcode=0x1)
代码怎么了?它使用Ubuntu 12.04 LTS成功运行


谢谢

正如我在上面的评论中提到的,系统呼叫号码是不同的。您需要将
0x2000004
放入
%rax
中,才能使此程序在Mac OS X上运行


我也不确定你的程序在Ubuntu上是如何工作的,因为你在你的例子中使用的是
exit
syscall number
1
,而不是
4
,因为
write

系统调用在Linux和Mac OS X上不一定有相同的数字。你可以通过简单的谷歌之旅找到很多信息。这里有一个链接描述了如何将一个简单的程序从Linux转换到MacOSX:32位和64位Linux中的数字不一样。请看这里:
Thread 1: EXC_SYSCALL (code=1, subcode=0x1)