以下链接解释了UNIX(BSD风格)和Linux的x86-32系统调用约定:
但是UNIX和Linux上的x86-64系统调用约定是什么?
根据System V X86-64 ABI,应用程序中的函数调用使用以下寄存器序列来传递整数参数:
rdi, rsi, rdx, rcx, r8, r9
Run Code Online (Sandbox Code Playgroud)
但是系统调用参数(除了系统调用号)在另一个寄存器序列中传递:
rdi, rsi, rdx, r10, r8, r9
Run Code Online (Sandbox Code Playgroud)
为什么内核使用r10而不是rcx第四个参数?它是否以某种方式与rcx未被保留的事实有关r10?
我经常忘记系统调用中每个参数需要使用的寄存器,每次我忘记时我都会访问这个问题。
x86_64 用户空间函数调用的整数/指针参数的正确顺序是:
%rdi、%rsi、%rdx、%rcx和%r8。%r9(可变参数函数采用 AL = FP 参数的数量,最多 8)
或者对于系统调用,%rax(系统调用调用号)和相同的参数,除了%r10代替%rcx.
记住这些寄存器而不是每次都用谷歌搜索这个问题的最佳方法是什么?
我正在尝试使用sys_brksyscall 在Linux中分配一些内存。这是我尝试过的:
BYTES_TO_ALLOCATE equ 0x08
section .text
global _start
_start:
mov rax, 12
mov rdi, BYTES_TO_ALLOCATE
syscall
mov rax, 60
syscall
Run Code Online (Sandbox Code Playgroud)
事情是按照linux调用约定,我希望返回值在rax寄存器中(指向已分配内存的指针)。我在gdb中运行了此文件,并在进行了sys_brksyscall 后注意到以下寄存器内容
在系统调用之前
rax 0xc 12
rbx 0x0 0
rcx 0x0 0
rdx 0x0 0
rsi 0x0 0
rdi 0x8 8
Run Code Online (Sandbox Code Playgroud)
系统调用后
rax 0x401000 4198400
rbx 0x0 0
rcx 0x40008c 4194444 ; <---- What does this value mean?
rdx 0x0 0
rsi 0x0 0
rdi 0x8 8
Run Code Online (Sandbox Code Playgroud)
rcx在这种情况下,我不太了解寄存器中的值。哪个指针可以用作我分配给它的8个字节的开头的指针sys_brk?