2015-11-07 92 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

相關問題