Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么64位寻址中的sys_write调用在寄存器中的args用于32位寻址时可以正常工作_Linux_Assembly_X86_X86 64_System Calls - Fatal编程技术网

Linux 为什么64位寻址中的sys_write调用在寄存器中的args用于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

以下是导致我出现问题的代码:

表示的片段不起作用,因为在64位寻址时,系统调用参数的寄存器应分别为第一个、第二个和第三个系统调用参数的rdi、rsi、rdx,而不是rbx、rcx、rdx(对于x86-32中的调用)。
但我感兴趣的是,为什么注释掉的行可以与
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