win32 012 資料結構

2021-06-21 23:57:45 字數 3748 閱讀 5275

資料結構實際上是由多個字段組成的資料樣板,相當

於一種自定義的資料型別,資料結構中間的每乙個字

段可以是位元組、字、雙字、字串或所有可能的資料

型別。(據說人是由泥巴捏成的) •

•比如在api

函式registerclass

中要使用到乙個叫做

wndclass

的資料結構,

microsoft

的手冊上是如下

定義的:

struct  _wndclass

typeof struct _wndclass wndclass, *pwndclass;

•注意,這是

c語言格式的,這個資料結構包含了

10個字段

,欄位的名稱是

style

,lpfnwndproc

和cbcl***tra

等,前面的

uint

和wndproc

等是這些欄位的型別,在彙編中

,資料結構的寫法如下:

結構名struct

欄位1型別?

欄位2型別?

……結構名

ends

wndclass         struct

style

dword?

lpfnwndproc

dword?

cbcl***tra

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

彙編程式設計是很重要的!

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...

資料結構 資料結構演算法

分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...

資料結構 01 資料與資料結構

1.資料data 資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。2.資料元素data elements 資料元素是組成資料的 有一定意義的基本單位,在計算機中通常作為整體進行處理。3.資料物件data object 資料物件是性質相同的資料元素的...