使用内联汇编程序调用 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
如何在 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