2012-03-03 22 views
1

彙編語言是相當簡單,但我關於如何使用寄存器例如困惑:是否有使用匯編語言規則登記

section .data  

msg db "Hello, world!",0xa 
len equ $ - msg 

section .text  


global _start 

_start: 

;write our string to stdout 

mov edx,len 
mov ecx,msg 
mov eax,4 
int 0x80   

;and exit 

mov ebx,0 
mov eax,1 
int 0x80 

其工作正常,但是當我的代碼更改爲:

section .data  

msg db "Hello, world!",0xa 
len equ $ - msg 

section .text  


global _start 

_start: 

;write our string to stdout 

mov ebx,len 
mov edx,msg 
mov eax,4 
int 0x80  

;and exit 

mov ebx,0 
mov eax,1 
int 0x80  

它會編譯但它不會顯示'Hello, World'。我所做的只是更改了lenmsg的註冊表。有什麼寄存器必須包含一個約定嗎?

回答

3

當然,執行系統調用時使用哪些寄存器是很重要的。 eax保存系統調用的數量(在本例中爲4),並且ebx,ecx,edx,esi,ediebp以該順序保持系統調用的argumens。第一個參數必須存儲在ebx中,第二個參數存儲在ecx中,依此類推,否則就沒有意義了。

Look here獲取Linux系統調用列表。正如你所看到的,系統調用號4 sys_write

ssize_t sys_write(unsigned int fd, const char * buf, size_t count)

因此您的寄存器必須設置爲這樣:

  • eax - 系統調用號= 4 sys_write
  • ebx - fd =文件描述符,1代表stdout
  • ecx - buf =(在你的代碼msg)指向您的字符串
  • edx - count =字符的金額(在你的代碼len)打印

編輯:Here's another table什麼每個寄存器應填寫具體系統調用。這兩個環節上還包含有關的系統調用,可能是值得一讀的更多信息:

+0

所以寄存器的設置必須以EAX,EBX,ECX,EDX,ESI ,edi,ebp。如果我使用ebp來保存系統調用的數量,那麼註冊的順序是ebp,edi,esi,edx,ecx,ebx,eax是否有意義? – 2012-03-03 06:18:53

+0

@the_transltr:'eax'用於保存系統調用號碼,'ebx'用於第一個參數,'ecx'用於第二個參數,'edx'用於第三個參數,等等。這就是系統調用期望的參數通過。沒有「訂單」,就是這樣。 – AusCBloke 2012-03-03 07:35:42

+0

鏈接已死亡。 – 2015-01-11 09:41:16