使用内联汇编程序调用brk系统调用

时间:2015-02-27 17:54:53

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

如何在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操作数使用错误的约束。但仍然难以弄明白。

1 个答案:

答案 0 :(得分:0)

我不在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