gpt4 book ai didi

c - 堆栈清理不起作用(__stdcall MASM 函数)

转载 作者:行者123 更新时间:2023-12-04 11:58:39 27 4
gpt4 key购买 nike

这里发生了一些奇怪的事情。 Visual Studio 让我知道 ESP 值没有正确保存,但我看不到代码中的任何错误(32 位、windows、__stdcall)
MASM 代码:

.MODE FLAT, STDCALL
...
memcpy PROC dest : DWORD, source : DWORD, size : DWORD
MOV EDI, [ESP+04H]
MOV ESI, [ESP+08H]
MOV ECX, [ESP+0CH]
AGAIN_:
LODSB
STOSB
LOOP AGAIN_
RETN 0CH
memcpy ENDP
我将 12 个字节 (0xC) 传递给堆栈,然后将其清理干净。我通过查看符号确认函数符号类似于“memcpy@12”,因此它确实找到了正确的符号
这是 C 原型(prototype):
extern void __stdcall * _memcpy(void*,void*,unsigned __int32);
以 32 位编译。该函数复制内存(我可以在调试器中看到),但堆栈清理似乎不起作用
编辑:
MASM 代码:
__MyMemcpy PROC _dest : DWORD, _source : DWORD, _size : DWORD
MOV EDI, DWORD PTR [ESP + 04H]
MOV ESI, DWORD PTR [ESP + 08H]
MOV ECX, DWORD PTR [ESP + 0CH]
PUSH ESI
PUSH EDI
__AGAIN:
LODSB
STOSB
LOOP __AGAIN
POP EDI
POP ESI
RETN 0CH
__MyMemcpy ENDP
代码:
extern void __stdcall __MyMemcpy(void*, void*, int);

typedef struct {
void(__stdcall*MemCpy)(void*,void*,int);
}MemFunc;

int initmemfunc(MemFunc*f){
f->MemCpy=__MyMemcpy
}
当我这样称呼它时,我收到错误:
MemFunc mf={0};
initmemfunc(&mf);
mf.MemCpy(dest,src,size);
当我这样称呼它时,我不:
__MyMemcpy(dest,src,size)

最佳答案

堆栈损坏的原因是 MASM “ secret 地”将序言代码插入到您的函数中。当我添加禁用它的选项时,该功能现在对我有用。
当您在 C 代码中切换到汇编模式,然后进入您的函数时,您可以看到这一点。当 VS 已经在汇编源代码中时,它似乎不会切换到汇编模式。

.586
.MODEL FLAT,STDCALL
OPTION PROLOGUE:NONE

.CODE

mymemcpy PROC dest:DWORD, src:DWORD, sz:DWORD
MOV EDI, [ESP+04H]
MOV ESI, [ESP+08H]
MOV ECX, [ESP+0CH]
AGAIN_:
LODSB
STOSB
LOOP AGAIN_
RETN 0CH
mymemcpy ENDP

END

关于c - 堆栈清理不起作用(__stdcall MASM 函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66920917/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com