为什么在操作后添加系统调用__NR_lchown注册



我在GDB中注意到,在我调用__NR_write操作之后,__NR_lchown系统调用号码(16)被传递到rax寄存器。我得到的代码是:

.data
BemVindo: .ascii "Seja bem vindo!n"
Digite: .ascii "Digite alguma coisan"
_start:
    mov $4, %rax
    mov $1, %rbx
    mov $BemVindo, %rcx
    mov $16, %rdx
    int $0x80
    mov $4, %rax # had to add this line because I was assuming that value 4 was still there in the register
    mov $Digite, %rcx
    mov $20, %rdx
    int $0x80

根据我unistd.h

#define __NR_write 4
#define __NR_lchown 16

所以,既然我在 linux 上,我认为这个 lchown 一定与命令 chown 有关,对吧?无论如何,问题是,为什么在我调用操作后立即加载值 16?

Linux 上的系统调用遵循自己的"调用约定",就像 C 函数一样。代码使用的int $0x80系统调用接口遵循 32 位 x86 系统调用约定。值得注意的是,在此约定中,系统调用的返回值在 EAX 中返回。write系统调用的返回值是写入文件的字节数,因此毫不奇怪,EAX 会更改为您正在写入的字符串长度。 我相信所有其他登记册都保留了下来。

请注意,在 64 位代码中,应使用 64 位 x86 系统调用接口,而不是 32 位系统调用接口。 32 位接口仅使用 32 位寄存器,因此,如果您尝试显示的字符串不在前 4GB 内存中,您的程序将失败。 64 位接口具有与 32 位接口不同的系统调用号,使用不同的寄存器传递参数,并使用 SYSCALL 指令而不是 INT。

最新更新