为什么64位寻址中的sys_write调用与用于32位寻址的寄存器中的args一起正常工作

时间:2015-11-07 13:18:08

标签: linux assembly 64-bit call

这是一段代码,引起了我的问题:

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

表示片段不起作用,因为系统调用args的64位寻址寄存器应分别rdi, rsi, rdx分别为rbx, rcx, rdx的第1,第2和第3个系统调用,而不是rbx, rcx, rdx在x86)。 但是,为什么注释掉的行可以与docker run -dP abcxyz/tomcat catalina.sh run 一起正常工作?

1 个答案:

答案 0 :(得分:3)

int $0x80是32位兼容接口,它恰好也适用于64位进程。它当然使用32位约定,这就是你的代码工作的原因。请注意,它只使用寄存器的低32位,你很幸运,你的字符串在低内存中。尝试使用堆栈上的字符串,该字符串通常超出32位范围,需要64位寄存器,因此需要64位约定。