2012-07-08 62 views
0

我有問題從內聯彙編調用C++函數。我需要在堆棧上推送所需的參數,但出現問題。例如,如果我推3,然後一切正常,但如果我嘗試推送變量(來自函數)或[ebp+8](同一事物)的值,則被調用函數將錯誤地接收爲1,而不管實際價值。內聯asm:推函數參數

int i; 

DWORD nietgebruikt(DWORD x) 
{ 
    // x is always 1 
    x += 40; 
    return x; 
} 

_declspec(naked) void asmfunc(DWORD x) 
{ 
    _asm 
    { 
     push x; // or [ebp+8] 
     call nietgebruikt 
     pop x // or [ebp+8] 

     add i, eax 
     ret 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    i = 1; 

    asmfunc(3); 

    cout << i << endl; 
    system("pause"); 

    return 0; 
} 
+1

如果您將函數聲明爲裸函數,那麼您需要負責設置ebp寄存器。 – 2012-07-08 23:03:48

回答

0

您是否試過在調試器中逐步調試代碼,以可視化和理解其執行?從長遠來看,你可能會發現它非常有用。

更具體地,您的_tmain功能,不通過引用傳遞值3asmfunc由值。換句話說,由asmfunc對其整個本地「副本」進行的任何更新都不會被調用函數看到。

您可能會考慮讓您的asmfunc嘗試返回更新後的值,然後在_tmain中顯示該值。