- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里发生了一些奇怪的事情。 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”,因此它确实找到了正确的符号
extern void __stdcall * _memcpy(void*,void*,unsigned __int32);
以 32 位编译。该函数复制内存(我可以在调试器中看到),但堆栈清理似乎不起作用
__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/
我正在用 C++ 编写我的第一个 DLL。使用 __declspec(dll_export),我可以使用 C 包装器在 Python 和 C++ 上读取它。但我现在也想在 C 上阅读它,所以我现在必须
我有一个调用一组函数的程序,如下所示: int _stdcall VB_Create(char*); int _stdcall VB_Open(unsigned int, unsigned int,
typedef bool (*my_function_f)(int, double); typedef bool (__stdcall *my_function_f2)(int, double); /
我有一个 .dll 我怀疑使用了 __stdcall 函数,但是 完全 未修饰的名称(甚至没有下划线或 @ 符号)。我为它写了一个 .def 文件,别名如 func1 = func1 func1@4
我开始做一些 directX 编程。我正在使用从 Internet 上找到的这个教程。 我只是想知道为什么 CALLBACK 被定义为 _stdcall 以及为什么 WINAPI 也是如此。 我以为在
在我看来,MSVS 忽略了我函数上的 __stdcall 指令。我正在手动清理堆栈,但编译器仍会在每个 CALL 之后附加 ADD ESP 指令。 这是我声明函数的方式: extern "C" voi
我正在学习 Win32 编程,WinMain 原型(prototype)如下所示: int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_in
我遇到过 __stdcall 这些天很多。 MSDN 并没有很清楚地解释它的真正含义,何时以及为什么应该使用它,如果有的话。 如果有人能提供解释,最好是一两个例子,我将不胜感激。 最佳答案 C/C++
在发布这个问题之前,我已经阅读了一些文档,SO answers并观看了一些视频来了解__stdcall 。到目前为止,我已经理解这是一个调用约定,并指定将参数从右向左推送到堆栈上。这也表示何时清除堆栈
我想 thunk(通过调整堆栈)__stdcall 函数。例如,调用者认为它有一个指向具有以下原型(prototype)的回调函数的指针: int Func(int a); 我想编写一个 thunk(
我遇到了 MSVC 和 ICC 的问题: 我需要使用具有 stdcall 调用约定的可变参数,但编译器会忽略可变参数并破坏堆栈。 解决这个问题的简单方法是将参数的数量作为参数之一并在它损坏之前偏移 E
在学习调试 OpenGL 时,我实现了一个回调函数,只要出现问题,它就会从 OpenGL API 接收任何调试错误消息。在教程中它说函数签名是: typedef void APIENTRY funcn
我在 Windows 7x64 上玩 JNI,Java 版本是 1.7.0_40 和 MinGW/GCC/G++ 4.7.2。 试图从 Java 关闭我的显示器。所以,我创建了一个类: public
我正在从供应商提供的 dll(所有 __stdcall)中导入大约 1500 个函数。由于繁琐的原因,dll 存在多个版本,其中包含完整功能列表的各个子集(尽管所有存在的功能都具有通用接口(inter
我正在尝试使用 __stdcall 创建函数名称和函数指针的映射。这是我目前获取函数指针的方式: typedef int (CALLBACK* InitializeDLL)(int,int); Ini
我正在查看一些代码,例如此处提到的代码:Function pointers for winapi functions (stdcall/cdecl) , Function pointer and ca
我正在从事一个项目,为离线测试生成一个虚拟 DLL。我们有真正的 DLL 及其头文件,尽管它们看起来不兼容。 DLL 中的名称未被破坏,但函数前向声明声明被调用为 __stdcall: 例子.h DW
我试过了 typedef void (* __stdcall MessageHandler)(const Task*); 这编译但给了我这个警告(VS2003): warning C4229: ana
这里发生了一些奇怪的事情。 Visual Studio 让我知道 ESP 值没有正确保存,但我看不到代码中的任何错误(32 位、windows、__stdcall) MASM 代码: .MODE FL
__stdcall 和 __cdecl 调用约定规定函数名必须在前面加上下划线: C (__cdecl) The same constraints apply to the 32-bit world
我是一名优秀的程序员,十分优秀!