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

Callling the brk syscall using inline assembler

如何在 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 操作数使用了错误的约束。但还是觉得很难搞清楚。

我不在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");

您可能还需要 "memory" 破坏器。

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