为什么程序集中的结构声明与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程序员使用吗?
帮忙,很困惑。
已修改:以下是我所参考的教程的链接:
答案 0 :(得分:7)
DWORDS在32位窗口上是32位类型,与C版本结构中的所有类型一样。因此,这两者是兼容的。
答案 1 :(得分:5)
汇编语言是无类型的 - DWORD和其他关键字仅表示应为特定实体保留的字节数。实际上,由于DWORD及其表兄弟不代表操作码/助记符,因此它们实际上是宏预处理器的功能。
C / C ++类型与其他语言类似,受到诸如endian-ness之类的规则的约束,其中符号位,转换,转换和赋值是可能的等等。您提供的结构的C版本是比汇编语言版本更具体,但兼容。
答案 2 :(得分:4)
所有这些不同C类型的大小是DWORD。程序集不是强类型的 - 它只知道每个变量的字节数。
答案 3 :(得分:2)
有一次(16位Windows)这些类型有不同的大小。在迁移到Win32期间,它们最终都是32位数据类型。因此,DWORD
至少在某种程度上与所有这些都兼容。
与流行的看法相反,汇编语言确实(或至少可以)具有类型甚至相当公平的类型安全性。例如,考虑当您执行以下操作时会发生什么:
mov lpszMenuName[ecx], 0
将lpszMenuName
定义为DWORD
,汇编程序将不接受此项,因为“0”可以是byte
,word
,{{{ 1}}或(在64位世界中)dword
。要使它工作,你必须(基本上)添加一个类型转换:
qword
因此汇编程序知道你想写一个字节。或者,您可以将mov byte ptr lpszMenuName[ecx], 0
定义为:
lpszMenuName
在这种情况下,汇编器会知道它应该将其视为指向一个字节,而不是每次都明确说明。
答案 4 :(得分:1)
WNDPROC,UINT等在C头中定义,因此没有直接的ASM等效。它们都是32位系统上的DWORD大小的数量,这就是该教程生成工作代码的原因。
答案 5 :(得分:1)
在汇编中,无论高级结构是否有指针或整数,实际情况是它们的相关高级数据类型是BYTE,WORD和DWORD,在你的情况下,结构都是32位因此是DWORD(a WORD是16位,DWORD是32位)。不要误以为装配中的结构与C中的结构不同,它是非常相同的。汇编程序具有原始数据类型,无论指针,结构等如何,它们如何区分它是如何加载到寄存器中(取决于语法):
mov eax, dword ptr [bx]
此汇编程序示例演示了如何使用eax
寄存器指向的值加载bx
寄存器,与
int bx = 5; int *eax; ptr = &bx;
希望这有帮助, 最好的祝福, 汤姆。
答案 6 :(得分:1)
事实上,MASM 6+支持一种打字方式,因此您可以将MASM中的结构与C中的结构类似。但是您必须首先重新创建类型层次结构,并且您很快就会注意到使用MASM键入的好处在某种程度上是有限的(在那里,做到了)。我建议您使用Google MASM 6程序员参考PDF文件:它清楚地解释了MASM中的“HLL”好东西,包括打字,并包含了许多示例。 一个副本似乎可以在下面的链接中找到,但还有其他副本浮动。
http://www.microlab.teipat.gr/upload/arxeshy/Microsoft_MASM_Programmers_Guide_v6.zip