汇编中的win32 api帮助
Posted
技术标签:
【中文标题】汇编中的win32 api帮助【英文标题】:help on win32 api in assembly 【发布时间】:2010-01-29 20:36:49 【问题描述】:为什么汇编中的结构声明与 win32 api 文档中的不同。(我来自 c++ 并尝试使用汇编语言)
例如我从icezelion的教程(tutorial3)中得到了这个函数原型
WNDCLASSEX STRUCT DWORD
cbSize DWORD ?
style DWORD ?
lpfnWndProc DWORD ?
cbClsExtra DWORD ?
cbWndExtra DWORD ?
hInstance DWORD ?
hIcon DWORD ?
hCursor DWORD ?
hbrBackground DWORD ?
lpszMenuName DWORD ?
lpszClassName DWORD ?
hIconSm DWORD ?
WNDCLASSEX ENDS
嘿等等...我知道“WNDCLASSEX”结构,在我的离线版本的win32 api文档中,它被声明为...。
typedef struct _WNDCLASSEX // wc
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
WNDCLASSEX;
为什么 asm 版本只使用 DWORD 与 win32 api 文档中的相反? 我使用了错误的文档还是什么?如果有人可以给我发一个适用于 asm 程序员的 WIN32 api 文档的下载链接吗? 求助,很迷茫。
已编辑:这是我参考的教程的链接:
iczelion's win32 asm tutorial 3
【问题讨论】:
win32 不适合 asm 程序员,没有 win32 asm 文档。 它是一个 C API,所以你可以很容易地调用函数。你只需要确切地知道你在做什么。 nos:简单的谷歌搜索会证明你错了。 【参考方案1】:DWORDS 是 32 位窗口上的 32 位类型,与结构的 C 版本中的所有类型一样。因此两者是兼容的。
【讨论】:
注意:类型大小(如果您使用 16、32 或 64 位整数等)在 limits.h 中定义。此大小因平台和操作系统(如果存在)而异,但通常定义为与系统的寄存器宽度相同。 实际上是 所有 版本的 Windows 上的 32 位类型,16 位、32 位和 64 位版本的 Windows 都将 DWORD 视为 32 位无符号整数。 WORD 通常定义为 16 位,其中包含双字 (DWORD) 32。但是,这并不能保证在所有平台(Linux、*ix、嵌入式系统等)上。跨度> 【参考方案2】:汇编语言是无类型的 - DWORD 和其他关键字仅表示应为特定实体保留的字节数。事实上,由于 DWORD 及其表亲不代表操作码/助记符,它们实际上是宏预处理器的特性。
C/C++ 类型与其他语言的类型一样,受到诸如字节序、符号位的位置、可能的转换、转换和赋值等规则的约束。您提供的结构的 C 版本是比汇编语言版本更具体,但兼容。
【讨论】:
不兼容是什么意思?它似乎正在工作 我说“不是不兼容”。请原谅我的双重否定,但这意味着它是兼容的。已在文本中更正。【参考方案3】:所有这些不同 C 类型的大小都是 DWORD。程序集不是强类型的——它只知道每个变量的字节数。
【讨论】:
【参考方案4】:曾经(16 位 Windows)这些类型具有不同的大小。在迁移到 Win32 期间,它们都以 32 位数据类型结束。因此,DWORD
至少在某种程度上与所有这些都兼容。
然而,与流行的看法相反,汇编语言确实(或至少可以)具有类型,甚至相当公平的类型安全。举个例子,考虑一下当您执行以下操作时会发生什么:
mov lpszMenuName[ecx], 0
将lpszMenuName
定义为DWORD
,汇编器不会接受这个,因为“0”可能是byte
、word
、dword
或(在 64 位世界)一个qword
。为了让它工作,你必须(基本上)添加一个类型转换:
mov byte ptr lpszMenuName[ecx], 0
所以汇编器知道你想写一个字节。或者,您可以将lpszMenuName
定义为:
lpszMenuName ptr byte
在这种情况下,汇编器将知道它应该将其视为指向一个字节,而无需每次都明确说明。
【讨论】:
“在迁移到 Win32 的过程中,它们都以 32 位数据类型结束”你有任何链接/引用 @Dr. Deo:您是否要求提供参考,表明它们现在都是 32 位类型,或者其中一些曾经是 16 位类型?【参考方案5】:WNDPROC、UINT 等是在 C 头文件中定义的,因此没有直接的 ASM 等效项。它们在 32 位系统上都是 DWORD 大小的数量,这就是该教程生成工作代码的原因。
【讨论】:
【参考方案6】:在汇编中,无论高级结构是否具有指针或整数,实际情况是它们关联的高级数据类型是 BYTE、WORD 和 DWORD,在您的情况下,结构都是 32 位的,因此是 DWORD( WORD 是 16 位,DWORD 是 32 位)。不要误以为汇编中的结构与 C 中的结构不同,它们非常相似。汇编器具有原始数据类型,无论指针、结构等如何,它们的不同之处在于它是如何加载到寄存器中的(取决于语法):
mov eax, dword ptr [bx]这个汇编程序示例演示了使用bx
寄存器指向的值加载eax
寄存器,实际上与
希望这会有所帮助, 最好的祝福, 汤姆。
【讨论】:
【参考方案7】:事实上,MASM 6+ 支持一种类型的类型,因此您可以在 MASM 中使用类似于 C 中的结构。但是您必须首先重新创建类型层次结构,并且您很快就会注意到使用 MASM 打字的好处在某种程度上是有限的(去过那里,做过)。我建议您谷歌一下 MASM 6 Programmer's Reference PDF 文件:它相当清楚地解释了 MASM 中的“HLL”好东西,包括打字,并包含许多示例。 下面的链接似乎提供了一份副本,但还有其他的。
http://www.microlab.teipat.gr/upload/arxeshy/Microsoft_MASM_Programmers_Guide_v6.zip
【讨论】:
以上是关于汇编中的win32 api帮助的主要内容,如果未能解决你的问题,请参考以下文章