汇编中的win32 api帮助

Posted

技术标签:

【中文标题】汇编中的win32 api帮助【英文标题】:help on win32 api in assembly 【发布时间】:2010-01-29 20:36:49 【问题描述】:

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

【问题讨论】:

win32 不适合 asm 程序员,没有 win32 asm 文档。 它是一个 C API,所以你可以很容易地调用函数。你只需要确切地知道你在做什么。 nos:简单的谷歌搜索会证明你错了。 【参考方案1】:

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

【讨论】:

注意:类型大小(如果您使用 16、32 或 64 位整数等)在 limits.h 中定义。此大小因平台和操作系统(如果存在)而异,但通常定义为与系统的寄存器宽度相同。 实际上是 所有 版本的 Windows 上的 32 位类型,16 位、32 位和 64 位版本的 Windows 都将 DWORD 视为 32 位无符号整数。 WORD 通常定义为 16 位,其中包含双字 (DWORD) 32。但是,这并不能保证在所有平台(Linux、*ix、嵌入式系统等)上。跨度> 【参考方案2】:

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

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

【讨论】:

不兼容是什么意思?它似乎正在工作 我说“不是不兼容”。请原谅我的双重否定,但这意味着它兼容的。已在文本中更正。【参考方案3】:

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

【讨论】:

【参考方案4】:

曾经(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

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

【讨论】:

“在迁移到 Win32 的过程中,它们都以 32 位数据类型结束”你有任何链接/引用 @Dr. Deo:您是否要求提供参考,表明它们现在都是 32 位类型,或者其中一些曾经是 16 位类型?【参考方案5】:

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

【讨论】:

【参考方案6】:

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

mov eax, dword ptr [bx]

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

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

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

【参考方案7】:

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

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

【讨论】:

以上是关于汇编中的win32 api帮助的主要内容,如果未能解决你的问题,请参考以下文章

如何修改汇编win32中 static控件的字体颜色

Windows API编程的作品目录

WIN32 汇编直接CALL 与间接CALL ?

请问如何用win32汇编语言遍历所有驱动器和所有文件夹

Win32 API 中的 ReadFile 函数

如何在 win32API 中更改静态窗口的背景颜色? [复制]