繁体   English   中英

在汇编中帮助win32 api

[英]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程序员?
帮忙,很困惑。

编辑 :这是我参考的教程的链接:

iczelion的win32 asm教程3

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'可以是byteworddword或(在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM