【问题标题】:failed to call system call with gcc inline assembler (64-bit)使用 gcc 内联汇编程序(64 位)调用系统调用失败
【发布时间】:2012-10-06 18:28:52
【问题描述】:

我正在尝试使用内联汇编程序(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 上成功运行。

谢谢!

【问题讨论】:

标签: macos gcc assembly inline-assembly


【解决方案1】:

正如我在上面的评论中提到的,系统调用号是不同的。您需要将0x2000004 放入%rax 以使该程序在Mac OS X 上运行。

我也不确定您的程序在 Ubuntu 上的运行情况,因为您在示例中使用的是exit 系统调用号1,而不是4 用于write

【讨论】:

猜你喜欢
  • 2015-04-30
  • 2018-10-01
  • 2020-06-07
  • 1970-01-01
  • 2016-03-31
  • 2011-09-04
  • 2011-03-27
  • 1970-01-01
相关资源
最近更新 更多