在汇编中帮助win32 api

时间:2010-01-29 20:36:50

标签: c assembly masm

为什么程序集中的结构声明与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程序员使用吗? 帮忙,很困惑。

已修改:以下是我所参考的教程的链接:

iczelion's win32 asm tutorial 3

7 个答案:

答案 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”可以是byteword,{{{ 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