•数据结构实际上是由多个字段组成的数据样板,相当于一种自定义的数据类型,数据结构中间的每一个字段可以是字节、字、双字、字符串或所有可能的数据类型。(据说人是由泥巴捏成的)
•比如在API函数RegisterClass 中要使用到一个叫做WNDCLASS的数据结构,Microsoft的手册上是如下定义的: struct  _WNDCLASS
typeof struct _WNDCLASS {
              UINT                    style;
              WNDPROC           lpfnWndProc;
              Int                        cbClsExtra;
              Int                        cbWndExtra;
              HINSTANCE        hInstance;
              HICON                 hIcon;
              HCURSOR            hCursor;
              HBRUSH              hbrBackground;
              LPCTSTR             lpszMenuName;
              LPCTSTR             lpszClassName;
       }WNDCLASS, *PWNDCLASS;

•注意,这是C语言格式的,这个数据结构包含了10个字段,字段的名称是style,lpfnWndProc和cbClsExtra等,前面的UINT和WNDPROC等是这些字段的类型,在汇编中,数据结构的写法如下:
结构名    struct
       字段1     类型              ?
       字段2     类型              ?
       ……
结构名    ends

WNDCLASS         struct
       Style                      DWORD        ?
       LpfnWndProc         DWORD        ?
       cbClsExtra            DWORD        ?
       cbWndExtra         DWORD        ?
       hInstance             DWORD        ?
       hIcon                    DWORD        ?
       hCursor                 DWORD        ?
       hbrBackground      DWORD        ?
       lpszMenuName       DWORD        ?
       lpszClassName        DWORD        ?
       WNDCLASS         ends

•和大部分的常量一样,几乎所有API所涉及的数据结构在Windows.inc文件中都已经有定义了。
•要注意的是,定义了数据结构实际上只是定义了一个样板,上面的定义语句并不会在哪个段中产生数据。(只是以一个模板的形式存在,今后通过这个样板声明定义结构变量才占用空间)
•和Word中使用各种信纸与文书等模板类似,定义了数据结构以后就可以多次在源程序中用这个样板当做数据类型来定义数据,使用数据结构在数据段中定义数据的方法如下:

 .data?
       stWndClass    WNDCLASS         <>
             ……
           .data
       stWndClass    WNDCLASS         <1,1,1,1,1,1,1,1,1,1,>
             ……
•这个例子定义了一个以WNDCLASS为结构的变量stWndClass。

•第一段的定义方法是未初始化的定义方法;
•第二段是在定义的同时指定结构中各字段的初始化值,各字段的初始值用逗号隔开,在这个例子中10个字段的初始值都指定为1。

•在汇编中,数据结构的引用方法有好几种,以上面的定义为例,如果要使用stWndClass中的lpfnWndProc字段,最直接的办法是:
–       mov  eax, stWndClass.lpfnWndProc
•它表示把lpfnWndProc字段的值放入eax中去,假设stWndClass在内存中的地址是403000h,这句指令会被编译成mov eax, [403004h],因为lpfnWndProc 是stWndClass 中的第二个字段,第一个字段是dword,已经占用了4字节的空间。

•在实际使用中,常常有使用指令存取数据结构的情况,如果使用 esi 寄存器做指针寻址,可以使用下列语句完成同样的功能:
–  mov  esi, offset stWndClass
–  move  ax, [esi + WNDCLASS.lpfnWndProc]
•注意:第二句是[esi + WNDCLASS.lpfnWndProc] 而不是[esi + stWndClass.lpfnWndProc],因为前者被编译成mov eax, [esi + 4],而后者被编译成mov eax, [esi + 403004h],后者的结果显然是错误的!

•MASM还有一个用法,可以用assume伪指令把寄存器预先定义为结构指针,再进行操作:
–       mov esi, offset stWndClass
–       assume esi: ptr WNDCLASS
–       move ax, [esi].lpfnWndProc
–       ……
–       assume esi:nothing
•注意:在不再使用esi寄存器做指针的时候要用assume esi:nothing取消定义。

•在实际使用中,常常有使用指令存取数据结构的情况,如果使用 esi 寄存器做指针寻址,可以使用下列语句完成同样的功能:
–  mov  esi, offset stWndClass
–  move  ax, [esi + WNDCLASS.lpfnWndProc]
•注意:第二句是[esi + WNDCLASS.lpfnWndProc] 而不是[esi + stWndClass.lpfnWndProc],因为前者被编译成mov eax, [esi + 4],而后者被编译成mov eax, [esi + 403004h],后者的结果显然是错误的!

•结构的定义也可以嵌套,如果要定义一个新的NEW_WNDCLASS结构,里面包含一个老的WNDCLASS结构和一个新的dwOption字段,那么可以如下定义:
NEW_WNDCLASS       struct
 
     DwOption           dword                 ?
     OldWndClass     WNDCLASS       <>
 
NEW_WNDCLASS       ends

•假设现在esi是指向一个NEW_WNDCLASS的指针,那么引用里面嵌套的oldWndClass中的lpfnWndProc字段时,就可以用下面的语句:
–  mov  eax, [esi].oldWndClass.lpfnWndProc
•结构的嵌套在Windows的数据定义中也常有,熟练掌握数据结构的使用对Win32汇编编程是很重要的!

win32 012 数据结构相关推荐

  1. linux 算法函数,数据结构——算法之(012)( linux C 全部字符串操作函数实现)...

    数据结构--算法之(012)( linux C 所有字符串操作函数实现) 题目:实现linux C下常用的字符串操作函数 题目分析: 一.面试中可能经常遇到这样的问题:比如strcpy.memcpy. ...

  2. 使用MASM04 - Win32汇编语言012

    使用MASM04 让编程改变世界 Change the world by program 调用API函数 习惯工作于DOS汇编的程序员同志都有一个愿望:如果说,能够以功能名称作为子程序名直接调用,他们 ...

  3. 在 C# 中通过 P/Invoke 调用Win32 DLL

    ,.NET Framework 1.0 或 1.1 版类库中存在任何 Windows 所没有的功能限制都不足为怪.毕竟,32 位的 Windows(不管何种版本)是一个成熟的操作系统,为广大客户服务了 ...

  4. lwip路由实现_基于LWIP协议栈对路由缓存数据结构实现改进设计

    LWIP(Light Weight Internet Protoco1)是瑞士计算机科学院(Swedish Institute of C++omputer Science)AdamDunkels等人开 ...

  5. Win32汇编笔记-消息基础

    WIN32的消息机制 windows系统是一个消息驱动的OS,操作通过处理各种消息来响应用户的操作. 对于每一个带有窗口的线程,系统都会给他分配一个自己的消息队列,用于处理消息派送(Dispatch) ...

  6. Win32汇编环境搭建教程(MASM32 SDK)

    一.说明 常用的32位汇编编译器有微软的MASM.Borland的TASM和NASM. 编译器 开发者 优点 缺点 MASM 微软 微软自家软件和系统兼容性好:支持invoke/.if等伪指令将汇编变 ...

  7. 非常好的dllimport 文章--在 C# 中通过 P/Invoke 调用Win32 DLL

    http://msdn.microsoft.com/zh-cn/library/aa686045.aspx 在 C# 中通过 P/Invoke 调用Win32 DLL 发布日期 : 1/13/2005 ...

  8. COMMCONFIG进行配置的WIN32 API

    掌握串行通信API函数的用法是掌握串行通信编程技术的关键. 在Win32中,系统将串行口与文件统一了起来, 对它们的打开.读写.关闭等操作都使用相同的API函数,但是它们之间又有差别,这些差别主要体现 ...

  9. C指针原理(23)-win32汇编及.NET调试

    2018-12-28 20:36:07 在WINDOWS系统能用到汇编的机会不多,基本都可以用C或C++代劳,更何况现在MICROSOFT的Visual Studio 系列工具非常强大,WINDOWS ...

最新文章

  1. 关于ActionContext.getContext()的使用方法心得
  2. 重新精读《Java 编程思想》系列之组合与继承
  3. android requestFocus的使用
  4. SparkShell中提交任务java.net.ConnectException: Call From henu4/192.168.248.244 to henu2:9000 failed on co
  5. 利用Chrome开发者工具分析C4C Opportunity搜索的前端性能
  6. 铜仁学院计算机报名,铜仁学院2012年3月全国计算机等级考试报名时间通知
  7. 划分vlan实验心得体会_思科:相同vlan,不同交换机之间的通信
  8. 尚未提交线上版本_ABRSM 线上演奏考试报名指引(目前考试仅限英国 amp; 部分国家及地区)...
  9. redis用zset做延时消息
  10. Python 基础知识 D5
  11. POJ NOI MATH-7647 余数相同问题
  12. PetShop 4.0 官方详解
  13. BC 2015在百度之星程序设计大赛 - 预赛(1)(KPI-树董事长)
  14. 商住楼和住宅楼的区别
  15. 【MISC怼题入门系列】BUU-MISC-page1
  16. PAT Basic 1031
  17. 【EMNLP2020】忒修斯之船启发下的知识蒸馏新思路 - 微软研究院
  18. 基于Sequoia DB巨杉数据库的投资组合评比器(设计思路)
  19. (转)WorldQuant :如何缔造量化金融王国
  20. 【数据库】MySQL的sql语句详解

热门文章

  1. 百度人脸识别API调用实现
  2. 人机版五子棋两种算法概述
  3. 科学计算机复利现值怎么计算公式,怎么用科学计算器算年金现值和复利现值是那个......
  4. 色域空间 sRGB Adobe RGB Pro Photo RGB
  5. 语音增强 理论与实践 pdf_初中英语语音教学策略研究 (结题报告)
  6. 运算符的优先级(从高到低)
  7. java生成二维码扫描跳转到指定的路径URL
  8. vuex的基本应用(vuex的购物车案例)
  9. TPC-H和TPC-DS
  10. 13-MyBatis 使用了哪些设计模式?在源码中是如何体现的?