我目前正在使用C中的一些ASM返回/ C++C/C++的x86代碼
我有以下
__declspec(naked) unsigned long
someFunction(unsigned long inputDWord)
{
__asm
{
}
}
如何在ASM,我會返回unsigned long類型?
我是否需要將某物推入堆棧然後調用ret? 我很久沒有使用過Asm了,以前從來沒有在C++裏面使用過。
謝謝!
我目前正在使用C中的一些ASM返回/ C++C/C++的x86代碼
我有以下
__declspec(naked) unsigned long
someFunction(unsigned long inputDWord)
{
__asm
{
}
}
如何在ASM,我會返回unsigned long類型?
我是否需要將某物推入堆棧然後調用ret? 我很久沒有使用過Asm了,以前從來沒有在C++裏面使用過。
謝謝!
編輯:感謝@Matteo Italia,我已更正ret
的使用。
把retval放在eax
的寄存器中,這是根據__cdecl
和__stdcall
的約定。
然後,根據不同的調用約定,你應該使用ret
指令的適當的變體:
__cdecl
約定(或類似)的情況下 - 使用ret
。在機器級別上,這意味着pop
-從堆棧返回地址,jmp
。調用者負責從棧中刪除所有的函數參數。__stdcall
約定(或類似)的情況下 - 使用ret X
,而X
是所有函數參數的大小。「而X是所有參數的大小」 - 只有當它是__stdcall時,在__cdecl中(通常是默認值)清理由調用者決定,所以它很簡單'ret'(除非我忘記了某些東西關於「裸體」)。 –
@Matteo Italia:哦,你100%正確。對不起,我忘了這個。我會修復我的帖子。 – valdo
對此的回答實際上取決於您針對的開發架構。 –
是否有你想自己處理函數調用的原因?你不能只在函數內部有本地程序集嗎?或者甚至更好,使用編譯器內在函數而不是程序集? –
獲得相應體系結構和ABI答案的最簡單方法就是編譯一個常規函數,然後查看生成的asm。 –