代码之家  ›  专栏  ›  技术社区  ›  Dr Deo

程序集中的win32 api帮助

  •  4
  • Dr Deo  · 技术社区  · 15 年前

    为什么汇编中的结构声明不同于Win32 API文档中的结构声明(我来自C++,在汇编语言中尝试我的手)

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

    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   
    

    嘿,等等……我知道在我的离线版本的win32 api文档中,“wndclassex”结构声明为……

    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文档中的dword?
    我使用的是错误的文档还是什么?如果我是,有人能给我发一个针对asm程序员的win32 api文档的下载链接吗?
    救命,我很困惑。

    编辑 :以下是我所参考的教程的链接:

    iczelion's win32 asm tutorial 3

    7 回复  |  直到 15 年前
        1
  •  7
  •   anon    15 年前

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

        2
  •  5
  •   3Dave    15 年前

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

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

        3
  •  4
  •   AShelly    15 年前

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

        4
  •  2
  •   Jerry Coffin    15 年前

    曾经(16位窗口)这些类型有不同的大小。在迁移到win32期间,它们都以32位数据类型结束。这样,A DWORD 至少在某种程度上,与所有这些都兼容。

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

    mov lpszMenuName[ecx], 0
    

    lpszMenuName 定义为 双字 ,因为“0”可能是 byte A word A dword 或(在64位世界中)a qword . 要使其正常工作,必须添加(基本上)类型转换:

    mov byte ptr lpszMenuName[ecx], 0
    

    所以汇编程序知道您要写一个字节。或者,您可以定义 LPSZMN AS:

    lpszMenuName ptr byte
    

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

        5
  •  1
  •   Michael    15 年前

    wndproc、uint等在c头文件中定义,因此没有直接的asm等效项。它们都是32位系统上的双字大小的量,这就是本教程生成工作代码的原因。

        6
  •  1
  •   t0mm13b    15 年前

    在汇编中,不管高级结构是否有指针或整数,实际情况是它们关联的高级数据类型是字节、字和双字,在您的例子中,结构都是32位的,因此是双字(字是16位的,双字是32位的)。不要误认为组装中的结构与C中的结构不同,这是非常相同的。汇编程序具有原始数据类型,不管指针、结构等如何,将它们分开的是如何装入寄存器(取决于语法):

    mov eax, dword ptr [bx]
    

    此汇编程序示例演示如何加载 eax 注册时使用 bx 注册,实际上与

    int bx = 5;
    int *eax;
    ptr = &bx;
    

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

        7
  •  1
  •   filofel    15 年前

    事实上,masm 6+支持一种类型,因此您可以在masm中使用类似于c中的结构。但是您必须首先重新创建类型层次结构,并且很快就会注意到使用masm键入的好处在某种程度上是有限的(如果存在,就这样做了)。我建议你用谷歌搜索masm 6程序员的参考pdf文件:它相当清楚地解释了masm中的“hll”好东西,包括打字,并包括一些例子。 在下面的链接中似乎有一个副本可用,但还有其他副本在浮动。

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

    推荐文章