[英]help on win32 api in assembly
为什么程序集中的结构声明与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文档中的内容相反?
我使用的是错误的文档还是什么? 如果我可以有人给我发布WIN32 api文档的下载链接意味着asm程序员?
帮忙,很困惑。
编辑 :这是我参考的教程的链接:
DWORDS在32位窗口上是32位类型,与C版本的结构中的所有类型一样。 因此两者是兼容的。
汇编语言是无类型的 - DWORD和其他关键字仅表示应为特定实体保留的字节数。 实际上,由于DWORD及其表兄弟不代表操作码/助记符,因此它们实际上是宏预处理器的功能。
与其他语言类似的C / C ++类型受到诸如endian-ness之类的规则的约束,其中符号位,转换,转换和赋值是可能的等等。您提供的C版本的结构比汇编语言版本,但兼容。
所有这些不同C类型的大小是DWORD。 程序集不是强类型的 - 它只知道每个变量的字节数。
在一次(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
在这种情况下,汇编器会知道它应该将其视为指向一个字节,而不是每次都明确说明。
WNDPROC,UINT等在C头中定义,因此没有直接的ASM等效。 它们都是32位系统上的DWORD大小的数量,这就是本教程生成工作代码的原因。
在汇编中,无论高级结构是否具有指针或整数,实际情况是它们的相关高级数据类型是BYTE,WORD和DWORD,在您的情况下,结构都是32位因此DWORD(WORD是16位) ,DWORD是32位)。 不要误以为装配中的结构与C中的结构不同,它是非常相同的。 汇编程序具有原始数据类型,无论指针,结构等如何,它们如何区分它是如何加载到寄存器中(取决于语法):
mov eax, dword ptr [bx]
这个汇编程序示例演示了如何使用bx
寄存器指向的值加载eax
寄存器,实际上与此相同
int bx = 5; int *eax; ptr = &bx;
希望这会有所帮助,最好的问候,汤姆。
实际上,MASM 6+支持一种打字形式,因此您可以将MASM中的结构与C中的结构类似。但是您必须首先重新创建类型层次结构,并且您很快就会注意到它的好处。用MASM打字在某种程度上是有限的(去过那里,完成了)。 我建议您使用Google MASM 6程序员参考PDF文件:它清楚地解释了MASM中的“HLL”好东西,包括打字,并包含了许多示例。 一个副本似乎可以在下面的链接中找到,但还有其他副本浮动。
http://www.microlab.teipat.gr/upload/arxeshy/Microsoft_MASM_Programmers_Guide_v6.zip
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.