相关疑难解决方法(0)

132
推荐指数
4
解决办法
10万
查看次数

为什么RCX不用于将参数传递给系统调用,而是用R10替换?

根据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

linux x86-64

5
推荐指数
1
解决办法
730
查看次数

记住 x86-64 System V arg 寄存器顺序的最佳方法是什么?

我经常忘记系统调用中每个参数需要使用的寄存器,每次我忘记时我都会访问这个问题。

x86_64 用户空间函数调用的整数/指针参数的正确顺序是:
%rdi%rsi%rdx%rcx%r8%r9(可变参数函数采用 AL = FP 参数的数量,最多 8)

或者对于系统调用,%rax(系统调用调用号)和相同的参数,除了%r10代替%rcx.

记住这些寄存器而不是每次都用谷歌搜索这个问题的最佳方法是什么?

assembly x86-64 abi cpu-registers calling-convention

5
推荐指数
1
解决办法
646
查看次数

为什么x86-64 Linux系统调用会修改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

linux assembly x86-64 system-calls

4
推荐指数
1
解决办法
1229
查看次数