Linux 为什么64位寻址中的sys_write调用在寄存器中的args用于32位寻址时可以正常工作
以下是导致我出现问题的代码: 表示的片段不起作用,因为在64位寻址时,系统调用参数的寄存器应分别为第一个、第二个和第三个系统调用参数的rdi、rsi、rdx,而不是rbx、rcx、rdx(对于x86-32中的调用)。Linux 为什么64位寻址中的sys_write调用在寄存器中的args用于32位寻址时可以正常工作,linux,assembly,x86,x86-64,system-calls,Linux,Assembly,X86,X86 64,System Calls,以下是导致我出现问题的代码: 表示的片段不起作用,因为在64位寻址时,系统调用参数的寄存器应分别为第一个、第二个和第三个系统调用参数的rdi、rsi、rdx,而不是rbx、rcx、rdx(对于x86-32中的调用)。 但我感兴趣的是,为什么注释掉的行可以与rbx、rcx、rdx配合使用?int$0x80是32位兼容接口,恰好也可以在64位进程中工作。它当然使用32位约定,这就是代码工作的原因。请注意,它只使用寄存器的低位32位,幸运的是字符串内存不足。堆栈上的字符串通常不在32位范围内,需要6
但我感兴趣的是,为什么注释掉的行可以与
rbx、rcx、rdx
配合使用?int$0x80
是32位兼容接口,恰好也可以在64位进程中工作。它当然使用32位约定,这就是代码工作的原因。请注意,它只使用寄存器的低位32位,幸运的是字符串内存不足。堆栈上的字符串通常不在32位范围内,需要64位寄存器,因此需要64位约定。您是否看到使用源代码并找到在何处实现sys_write调用。
mystr:
.string "ABCDEFGH"
.set mystrlen, . - mystr
.text
.globl main
.type main, @function
main:
sub $0x10, %rsp
movq $0x44434241, 0x8(%rsp)
lea 0x8(%rsp), %rcx
movq $4, %rax
movq $1, %rbx
//movq $mystr, %rcx
//movq $mystrlen, %rdx
movq $4, %rdx
int $0x80
movq $1, %rax
movq $0, %rbx
int $0x80