2013-04-12 96 views
0

我正在嘗試學習x86語法,並且在一般情況下我有點困惑。我知道堆棧中有幀,並且在進行調用時,該函數中發生的第一件事是某種幀更新,然後獲取參數。所以,如果我在我的主要代碼區域中的寄存器eax中具有某種類型的值5並且調用Function,那麼我仍然可以訪問eax中的值5正確嗎?或者爲了把它作爲一個參數,我必須做這樣的事情。我在別的地方看到你在調用函數之前將你的參數推入堆棧,這是真的嗎?我認爲必須在8(ebp)處找到將它移入eax的東西,但是在用movl移動它之前,eax的價值是什麼?它是5嗎?我知道這是很多問題,我只是在調用函數和返回一些東西時感到困惑。任何幫助將不勝感激。我相信這對於一些大會指導者來說就像一塊蛋糕!在x86中調用多個函數

Function: 
pushl %ebp 
movl %esp, %ebp 

movl 8(ebp), eax 
+0

有人要知道正確的方法來調用帶參數的函數的x86! – Tastybrownies

回答

1

This頁面應該基本上包裝起來。

隨着CDECL你去喜歡

; I'm not comfortable with AT&T syntax, but it's not relevant here 

; void *processData(void *firstParam, void *secondParam) 
proc processData 
    push ebp 
    mov ebp,esp 

    mov eax,[dword ptr ss:ebp + 8] ; firstParam 
    mov edx,[dword ptr ss:ebp + 12] ; secondParam 

    ; do something with the data and put the result into EAX 

    mov esp,ebp 
    pop ebp 
    ret 
endp processData 

你調用它像

lea eax,[ds:bufferOfSecondParam] 
push eax 
lea eax,[ds:bufferOfFirstParam] 
push eax 
call processData 
add esp,8 

; Here you can do with the return value anything you want 

首先,你需要在調用約定使用的決定。例如,Win32使用cdecl的變體,稱爲stdcall被調用者負責清理堆棧 - 這不太方便實現,並且不允許可變參數。

[SS:EBP + 8]指向第一個參數,因爲

  • 參數被傳遞到堆棧從右到左([SS:EBP + 12]指向第二ARG)
  • DWORDS是4個字節
  • [SS:EBP + 0]指向以前EBP保存在創建的堆棧幀的
  • [SS:EBP + 4]在RET指向返回地址reaad到EIP