4

为什么汇编中的结构声明与 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的win32 asm教程3

4

7 回答 7

7

DWORDS 是 32 位窗口上的 32 位类型,结构的 C 版本中的所有类型也是如此。因此两者是兼容的。

于 2010-01-29T20:43:35.773 回答
5

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

C/C++ 类型与其他语言的类型一样,受到诸如字节序、符号位的位置、可能的强制转换、转换和赋值等规则的约束。您提供的结构的 C 版本比汇编语言版本,但兼容。

于 2010-01-29T20:48:11.610 回答
4

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

于 2010-01-29T20:42:58.113 回答
2

曾经(16 位 Windows)这些类型具有不同的大小。在迁移到 Win32 期间,它们都以 32 位数据类型结束。因此,aDWORD至少在某种程度上与所有这些都兼容。

然而,与流行的看法相反,汇编语言确实(或至少可以)具有类型,甚至是相当公平的类型安全性。举例来说,考虑一下当您执行以下操作时会发生什么:

mov lpszMenuName[ecx], 0

lpszMenuName定义为 aDWORD时,汇编器不会接受这一点,因为“0”可能是 a 、bytea word、 adword或(在 64 位世界中) a qword。为了让它工作,你必须(基本上)添加一个类型转换:

mov byte ptr lpszMenuName[ecx], 0

所以汇编器知道你想写一个字节。或者,您可以定义lpszMenuName为:

lpszMenuName ptr byte

在这种情况下,汇编器将知道它应该将其视为指向一个字节,而无需每次都明确说明。

于 2010-01-29T20:59:34.373 回答
1

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

于 2010-01-29T20:42:33.540 回答
1

在汇编中,无论高级结构是否具有指针或整数,实际情况是它们相关的高级数据类型是 BYTE、WORD 和 DWORD,在您的情况下,结构都是 32 位,因此是 DWORD(一个 WORD 是 16 位, DWORD 是 32 位)。不要误以为汇编中的结构与 C 中的结构不同,它们非常相似。汇编器具有原始数据类型,无论指针、结构等如何,它们的不同之处在于它是如何加载到寄存器中的(取决于语法):

mov eax, dword ptr [bx]

这个汇编程序示例演示了使用eax寄存器指向的值加载bx寄存器,实际上与

诠释 bx = 5;
诠释 *eax;
指针 = &bx;

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-29T21:22:47.893 回答
1

事实上,MASM 6+ 支持一种类型的类型,因此您可以在 MASM 中使您的结构类似于您在 C 中的结构。但是您必须首先重新创建类型层次结构,并且您很快就会注意到用 MASM 打字会受到某种程度的限制(去过那里,做过)。我建议您 Google MASM 6 Programmer's Reference PDF 文件:它相当清楚地解释了 MASM 中的“HLL”好东西,包括打字,并包含许多示例。下面的链接似乎提供了一份副本,但还有其他的。

http://www.microlab.teipat.gr/upload/arxeshy/Microsoft_MASM_Programmers_Guide_v6.zip

于 2010-01-31T11:56:45.737 回答