2010-09-02 77 views
2

我有任務來計算GCD的兩個號碼。通過使用堆棧幀&我寫的代碼本 -我有問題關於堆棧

.text 

GCD: 
    push ebp 
    mov ebp,esp 

1: cmp ebx,eax 
    je 3f 

     ja 2f 

     sub ebx,eax 
     jmp 1b 

2: sub eax,ebx 
     jmp 1b 

3: leave 
     ret 

我得到這個代碼的答案,但我有沒有考慮存儲位置像[ebp+8]如何運行程序或該程序是如何執行的問題?

回答

0

那麼,你的函數實際上在eaxebx中使用它的參數,而不是使用推入堆棧的參數。如果這不是你想要的,就把這兩個指令的mov ebp, esp後:

mov eax, [ebp + 8] 
mov ebx, [ebp + 12] 
1

使用__fastcall調用約定,你可以要求到寄存器傳遞參數。除非您創建基於堆棧的變量以便以後使用,否則應該甚至會使您的函數序言(push ebp等)和epilogue(leave)冗餘。

Visual C++有__fastcall的一個實現,但GCC也處理它。有關調用約定的信息,請參見this document

儘管如此 - 如果任務要求您使用堆棧幀,則需要使用__cdecl或__stdcall調用約定來獲取從中計算GCD的參數。