2014-11-21 112 views
0

鑑於這種代碼:x86 linux系統調用調用約定?

section  .text 
global  _start        
_start:           ;tell linker entry point 
    mov  edx,len       ;message length 
    mov  ecx,msg        ;message to write 
    mov  ebx,1        ;file descriptor (stdout) 
## mov  eax,4        ;system call number (sys_write) 
    int  0x80        ;call kernel 
    mov  eax,1        ;system call number (sys_exit) 
    int  0x80        ;call kernel 

section  .data 

msg  db 'Hello, world!',0xa     ;our dear string 
len  equ $ - msg       ;length of our dear string 

如何內核知道msgecxlenedx等?我們不會將參數傳遞給「內核」?

回答

1

這就是你如何傳遞參數。系統調用的調用約定說明哪些寄存器保存參數。內核希望他們在那裏,你應該把它們放在那裏。另請參閱this reference

儘管通常的32位cdecl約定使用堆棧來傳遞參數,但在用戶模式中也有類似的約定(特別是fastcall),它們也使用寄存器來傳遞參數。 x86-64的標準約定也是如此。