2015-11-07 88 views
2

在这里,在64位寻址做工精细SYS_WRITE呼叫与ARGS寄存器是一段代码,引起了我的问题: 为什么打算32位寻址

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 

代表片段不起作用,系统调用参数的64位寻址寄存器中的cuz应分别为rdi, rsi, rdx,分别对应于第1,第2和第3系统调用参数,而不是rbx, rcx, rdx(对于x86中的调用)。 但我为什么被注释掉的线与rbx, rcx, rdx正常工作?

+2

你见过[this](http://stackoverflow.com/questions/10105871/why-cant-i-sys-write-from-a-register) – t0mm13b

+0

使用源代码并找出sys_write调用的位置实现。 – t0mm13b

回答

3

int $0x80是32位兼容性接口,它也适用于64位进程。它当然使用32位约定,这就是你的代码工作的原因。请注意,它只使用寄存器的低32位,你很幸运,你的字符串处于低内存状态。请尝试与堆栈中的字符串相同,该字符串通常在32位范围之外,并且需要64位寄存器以及64位约定。

+0

非常感谢,你的解释对我来说很明确 – red0ct

相关问题