【问题标题】:How do you call Win32 API functions from inline assembler?如何从内联汇编器调用 Win32 API 函数?
【发布时间】:2010-05-26 22:10:47
【问题描述】:
有人能告诉我这段代码有什么问题吗
我只是从 kernel32.dll 调用 Sleep 函数
怎么了?
我正在使用 Visual Studio 2008。
任何帮助将不胜感激。
非常感谢。
__asm
{
mov eax, 77e2ef66h
push 9999
call eax
}
【问题讨论】:
标签:
c
visual-studio-2008
inline-assembly
kernel32
【解决方案1】:
你从哪里得到这个神奇的数字77e2ef66h?通常,如果您从内联汇编器调用 Win32 API 函数,您会执行以下操作:
__asm
{
push 9999
call Sleep
}
Win32 中的函数没有固定地址(无论您的“DLL 导出查看器”可能显示什么)。函数在加载时由 name 或 ordinal 链接(由 Windows PE 加载程序),并且不位于固定地址。事实上,函数的实际地址可能会在不同的 Windows 版本、同一版本的 Windows 中的子版本之间、从机器到机器、甚至可能从您的程序的一次运行到下一次运行之间发生变化。
(免责声明:我已经做了很长时间了,所以上面代码示例的细节无疑是错误的,但我知道你绝对不需要使用幻数。)