【问题标题】:Callling the brk syscall using inline assembler使用内联汇编器调用 brk 系统调用
【发布时间】:2015-04-30 12:51:43
【问题描述】:

如何在 x86-64 linux 中实现 brk 系统调用?我的代码如下:

    Mysyscall(uint64_t n, uint64_t a1){
    uint64_t ret;
    __asm__ __volatile__("movq %0, %%rax\n\t"
            "movq %1, %%rdi\n\t"
            "syscall\n"
            : "=r"(ret)
            : "g"(n), "g"(a1));
    return ret; }

    Mysyscall(SYS_brk, uint64_t increment);

但它不起作用。我想我可能对 asm 操作数使用了错误的约束。但仍然很难弄清楚。

【问题讨论】:

    标签: x86-64 inline-assembly system-calls


    【解决方案1】:

    我不在 linux 上,所以我无法测试这个。但基于http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64,我希望它是这样的:

    __asm__ __volatile__("syscall"
            : "=a" (ret)
            : "0" (12), "D" (a1)
            : "rcx", "r11", "cc");
    

    您可能还需要“记忆”破坏者。

    要了解约束,请查看此处的 i386 部分:https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 1970-01-01
      • 2016-01-16
      • 2020-08-28
      • 2010-12-18
      • 2020-06-07
      • 2013-06-20
      • 1970-01-01
      相关资源
      最近更新 更多