This question already has answers here:
ret, retn, retf - how to use them
(3个答案)
去年关闭。
我有以下功能:
这是编译后的汇编代码:
我的问题是:
我必须将最终的
如果您使用的是GCC,则可以使用stdcall attribute来实现:
当然,您可以将
在Cygwin中使用GCC编译上述函数,结果如下:
(3个答案)
去年关闭。
我有以下功能:
int __declspec() MyFunc(SOCKET sSocket, const char* sData, int sSize, int sFlag)
{
pSocket = sSocket;
return send(sSocket,sData, sSize, sFlag);
}
这是编译后的汇编代码:
PUSH EBP
MOV EBP,ESP
PUSH DWORD PTR SS:[EBP+14] // Flags
MOV EAX,DWORD PTR SS:[EBP+8]
PUSH DWORD PTR SS:[EBP+10] // DataSize
MOV DWORD PTR DS:[pSocket],EAX
PUSH DWORD PTR SS:[EBP+C] // Data
PUSH EAX // Socket
CALL DWORD PTR DS:[<&WS2_32.#19_send>] // send
POP EBP
RETN
我的问题是:
RETN
,RETN 8
或RETN 10
有什么区别?我必须将最终的
RETN
更改为RETN 10
,我应该对C ++代码进行哪些更改? 最佳答案
我必须将最终的RETN更改为RETN 10,我应该对我的C ++代码进行哪些更改?
若要使调用的函数在返回之前清理堆栈(使用RET(N) imm
或通过其他方式),请使其使用stdcall
calling convention。
如果您使用的是Microsoft的C / C ++编译器,则可以通过添加__stdcall modifier来实现此目的,如下所示:
void __stdcall foo(int arg1, int arg2) {
// ...
}
如果您使用的是GCC,则可以使用stdcall attribute来实现:
void __attribute__ ((stdcall)) foo(int arg1, int arg2) {
// ...
}
当然,您可以将
#define
__stdcall
作为__attribute__ ((stdcall))
来保存自己的输入内容,并使代码更具可移植性。在Cygwin中使用GCC编译上述函数,结果如下:
_foo@8:
push ebp
mov ebp, esp
... (omitted for brevity)
leave
ret 8
08-25 08:52