关于程序集中win32 api的帮助 为什么在汇编中的结构声明与Win32 API文档中的结构声明不同(我来自C++,并且在汇编语言上尝试我的手)

关于程序集中win32 api的帮助 为什么在汇编中的结构声明与Win32 API文档中的结构声明不同(我来自C++,并且在汇编语言上尝试我的手),c,assembly,masm,C,Assembly,Masm,例如,我从icezelion的教程(教程3)中获得了这个函数原型 嘿,等等……我知道“WNDCLASSEX”结构,在我的win32 api文档的脱机版本中,其声明为 typedef struct _WNDCLASSEX { // wc UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE

例如,我从icezelion的教程(教程3)中获得了这个函数原型

嘿,等等……我知道“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文档的下载链接吗?
救命啊,我糊涂了

已编辑:以下是指向我参考的教程的链接:


WNDPROC、UINT等在C头中定义,因此没有直接的ASM等效项。它们在32位系统上都是DWORD大小的量,这就是教程生成工作代码的原因。

所有这些不同C类型的大小都是DWORD。程序集不是强类型-它只知道每个变量的字节数。

DWORD是32位窗口上的32位类型,C版结构中的所有类型也是如此。因此,这两种语言是兼容的。

汇编语言是无类型的-DWORD和其他关键字仅表示应为特定实体保留的字节数。事实上,由于DWORD及其近亲并不表示操作码/助记符,它们实际上是宏预处理器的功能


C/C++类型与其他语言的类型一样,受诸如endian ness、符号位的位置、可以进行的强制转换、转换和赋值等规则的约束。您提供的结构的C版本比汇编语言版本更具体,但兼容。

一次性(16位窗口)这些类型有不同的大小。在迁移到Win32的过程中,它们最终都是32位数据类型。因此,
DWORD
至少在某种程度上与它们兼容

然而,与流行的观点相反,汇编语言确实(或至少可以)有类型,甚至有相当公平的类型安全性。例如,考虑一下当你做某事时会发生什么:

mov lpszMenuName[ecx], 0
如果将
lpszMenuName
定义为
DWORD
,则汇编程序将不接受这一点,因为“0”可以是
字节
、单词、DWORD或(在64位世界中)单词。要使其工作,您必须(本质上)添加类型转换:

mov byte ptr lpszMenuName[ecx], 0
所以汇编器知道你想写一个字节。或者,您可以将
lpszMenuName
定义为:

lpszMenuName ptr byte

在这种情况下,汇编程序将知道它应该将其视为指向一个字节,而不是每次都显式地声明。

在汇编中,无论高级结构是指针还是int,实际情况是它们关联的高级数据类型是byte、WORD和DWORD,结构均为32位,因此为DWORD(一个字为16位,DWORD为32位)。不要误以为汇编中的结构与C中的结构不同,它是非常相似的。汇编程序具有基本数据类型,无论指针、结构等如何,它们之间的区别在于如何加载到寄存器中(取决于语法):

希望这有帮助, 顺致敬意,
Tom.

事实上,MASM 6+支持一种类型,因此您可以让MASM中的结构与C中的结构类似。但是您必须首先重新创建类型层次结构,并且您很快就会注意到,使用MASM键入的好处在某种程度上是有限的(已经做到了,已经做到了)。我建议您用谷歌搜索MASM 6程序员参考PDF文件:它相当清楚地解释了MASM中的“HLL”优点,包括键入,并包括许多示例。 下面的链接上似乎有一个副本,但也有其他副本


win32不是为asm程序员准备的,它没有win32 asm文档。它是一个C API,因此您可以非常轻松地调用函数。你只需要确切地知道你在做什么。否:一个简单的谷歌搜索会证明你错了。你说它不兼容是什么意思?我说“不是不相容的”。请原谅我的双重否定,但这意味着它是相容的。已在文本中更正。“在迁移到Win32的过程中,它们都以32位数据类型结束”您有任何链接吗/citations@Dr.Deo:您是否要求提供一份参考资料,表明它们现在都是32位类型,或者其中一些曾经是16位类型?注意:类型大小(如果您使用的是16位、32位或64位整数等)在极限中定义。此大小因平台和操作系统(如果存在)而异,但通常定义为与系统的寄存器宽度相同。实际上,所有版本的Windows上的32位类型,16位、32位和64位版本的Windows都将DWORD视为32位无符号整数。字通常定义为16位,其中包含一个双字(DWORD)32。但是,并非所有平台(Linux、*ix、嵌入式系统等)都能保证这一点。
lpszMenuName ptr byte
mov eax, dword ptr [bx] int bx = 5; int *eax; ptr = &bx;