•
資料結構實際上是由多個字段組成的資料樣板,相當
於一種自定義的資料型別,資料結構中間的每乙個字
段可以是位元組、字、雙字、字串或所有可能的資料
型別。(據說人是由泥巴捏成的) •
•比如在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 資料物件是性質相同的資料元素的...