为了在C ++中试验程序集,我尝试了以下操作,导致应用程序崩溃:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
__asm {
push 5000
call Sleep
}
...
}
代码的汇编部分应该像下一行一样
Sleep(5000);
我做错了什么?
编辑:我收到了访问冲突。
答案 0 :(得分:3)
我刚刚在VC ++ 6中检查了汇编代码。
你必须像这样调用例程:
call dword ptr [Sleep]
答案 1 :(得分:3)
直接在C中编写代码 - 反汇编它,找出编译器的功能,然后你可以编写正确的版本 -
答案 2 :(得分:0)
自从我这么做以来已经有很长一段时间但是我从过去回忆起有时候我必须在EAX寄存器中放入一个参数而不是将它推到堆栈上。或者如果调用约定需要它,你可能需要在单词之后再次弹出它。
正如Arak所说,检查您是否匹配编译器调用约定。 Masm将强制执行一个约定,检查您的C编译器是否执行相同的操作。
答案 3 :(得分:0)
我不是x86人,但我认为你应该检查编译器使用的调用约定。似乎Sleep
在它自己之后进行清理,所以编译器也可能在此之后插入清理代码?