2012-11-18 44 views
0

我目前正在使用C中的一些ASM返回/ C++C/C++的x86代碼

我有以下

__declspec(naked) unsigned long 
someFunction(unsigned long inputDWord) 
{ 
    __asm 
    { 
    } 
} 

如何在ASM,我會返回unsigned long類型?

我是否需要將某物推入堆棧然後調用ret? 我很久沒有使用過Asm了,以前從來沒有在C++裏面使用過。

謝謝!

+3

對此的回答實際上取決於您針對的開發架構。 –

+1

是否有你想自己處理函數調用的原因?你不能只在函數內部有本地程序集嗎?或者甚至更好,使用編譯器內在函數而不是程序集? –

+3

獲得相應體系結構和ABI答案的最簡單方法就是編譯一個常規函數,然後查看生成的asm。 –

回答

3

編輯:感謝@Matteo Italia,我已更正ret的使用。

把retval放在eax的寄存器中,這是根據__cdecl__stdcall的約定。

然後,根據不同的調用約定,你應該使用ret指令的適當的變體:

  • __cdecl約定(或類似)的情況下 - 使用ret。在機器級別上,這意味着pop-從堆棧返回地址,jmp。調用者負責從棧中刪除所有的函數參數。
  • __stdcall約定(或類似)的情況下 - 使用ret X,而X是所有函數參數的大小。
+5

「而X是所有參數的大小」 - 只有當它是__stdcall時,在__cdecl中(通常是默認值)清理由調用者決定,所以它很簡單'ret'(除非我忘記了某些東西關於「裸體」)。 –

+0

@Matteo Italia:哦,你100%正確。對不起,我忘了這個。我會修復我的帖子。 – valdo