win32汇编-结构体

来源:互联网 发布:比特彗星tcp端口阻塞 编辑:程序博客网 时间:2024/05/23 13:38
汇编中定义结构体 格式如下:
结构名  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




定义一个WNDCLASS类型的变量
.
data?stWndClass WNDCLASS <>...




.datastWndClass WNDCLASS <1,1,1,1,1,1,1,1,1> 



.data?是为初始化的定义方法,.data是初始化的定义方法。


数据结构的引用:
 如果要使用 stWndClass中的lpfnWndProc字段,最直接的办法是:
mov eax,stWndClass.lpfnWndProc


   把lpfnWndProc字段的值放入eax中去
   假设 stWndClass在内存中的地址使403004h,这句会被编译成 mov eax,[403004h]
   因为lpfnWndProc是stWndClass中的第二个字段,一个字段是dword,已经占用了4字节。
   
   esi作指针寻址:
  
 mov esi,offset stWndClass   mov ax,[esi+WNDCLASS.lpfnWndProc]


   注意:第二句是[esi+WNDCLASS.lpfnWndProc],是数据类型名,而不是变量名,这里会编译成esi+偏移地址
   
   高级用法assume
   MASM有一个高级用法,用assume伪指令把寄存器预定义为结构指针,再进行操作。
mov esi,offset stWndClassassume esi:ptr WNDCLASSmov ax,[esi].lpfnWndProcassume esi:nothing


注意:不再使用esi寄存器作为指针的时候要用 assume esi:nothing取消定义。

结构体嵌套:
NEW_WNDCLASS struct
DwOption dword  ?
OldWndClass WNDCLASS <>
        NEW_WNDCLASS
     这里的 OldWndClass会直接被编译器展开。
 

原创粉丝点击