一、關于寄存器
寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中會默認使用它,其它情況很少使用到,暫時可以不用理會。
EAX是WIN32 API 默認的返回值存放處。
ECX是LOOP指令自動減一的寄存器。
ESP是堆棧指針。
EBP經常用來在堆棧中尋址。
ESI好像常常用在指針尋址中,EDI不大清楚。
二、關于內存尋址
WIN32中內存是平坦的,對于每個程序來說都可以使用2G范圍的地址,但各個程序之間并不會干擾,這是因為各個程序所使用到的物理內存被Windows自行安排,不會互相覆蓋,而且一個程序不會隨意地訪問到另一個程序的地址空間。
三、關于堆棧
Windows為每個程序安排了堆棧段,它是從高地址向低地址延伸的,之所以采用這種方式,是因為這樣可以使堆棧指針始終指向最近入棧的元素的起始地址,這樣的話,為訪問這個元素提供了非常便利的方式。
ESP作為堆棧指針始終指向棧頂,如果看一下PUSH和POP的操作就可以明白這句話:
PUSH: ESP <-- ESP-4 (ESP+3,ESP) <-- 入棧元素
POP: 出棧元素 <-- (ESP+3,ESP) ESP <-- ESP+4
因為PUSH和POP自動修改了ESP的值,使它始終指向棧頂了。當然也可以自己來修改ESP的值,例如我們可以:
sub esp,4 ;這樣就把棧頂指針向下移動了。
這種操作常常用在局部變量的分配中,在子程序中使用到局部變量時,就在堆棧中為它們提供空間,這樣可以使子程序退出時收回局部變量占用的空間,有利于子程序的模塊化。
我們可以用ESP來尋址堆棧中的元素,比如ESP指向當前棧頂元素的起始地址,ESP-4指向前一個元素的起始地址,不過因為ESP常常在變化,這樣用ESP在堆棧中尋址的話不方便,所以我們就用EBP來代替ESP尋址,首先把EBP入棧保存,然后把ESP賦值給EBP,這樣就可以用EBP來尋址堆棧中的數據了。我用一個例子來說明堆棧的變化。
push 0x00000001;1
push ebp ;2
mov ebp,esp ;3
push 0x12345678 ;4
mov eax,dword ptr[ebp+4] ;5
mov ebx,dword ptr[ebp-4] ;6
mov ax,word ptr[ebp-2] ;7
mov al,byte ptr[ebp-1] ;8
mov al,byte ptr[ebp-3] ;9
mov ax,word ptr[ebp-3] ;10
5 eax=0x00000001
6 ebx=0x12345678
7 ax=0x1234
8 al=0x12
9 al=0x56
10 ax=0x3456
堆棧使用在子程序的實現中,當調用子程序時,首先把參數入棧,然后把返回IP入棧,然后轉移到子程序處,如果有局部變量,則下移ESP,然后初始化該局部變量,這樣用到EBP來尋址局部變量,參數的尋址同樣要用到EBP。
四、簡單的幾個關鍵字
ptr 顯式指定后面的數據的類型
offset 全局變量的地址
addr 局部變量的地址,也可以用在全局變量上
local 定義局部變量
proc 定義子程序
proto 聲明子程序
五、例子
名稱
|
表示方式
|
縮寫
|
長度
(
字節
)
|
字節
|
Byte
|
db
|
1
|
字
|
word
|
dw
|
2
|
雙字(double word)
|
dword
|
dd
|
4
|
三字(far word)
|
fword
|
df
|
6
|
四字(quad word)
|
qword
|
dq
|
8
|
10字節BCD碼(ten byte)
|
tbyte
|
dt
|
10
|
有符號字節(sign byte)
|
sbyte
|
|
1
|
有符號字(sign word)
|
sword
|
|
2
|
有符號雙字(sign dword)
|
sdword
|
|
4
|
單精度浮點數
|
Real4
|
|
4
|
雙精度浮點數
|
Real8
|
|
8
|
10字節浮點數
|
Real10
|
|
10
|
ebp
偏移
|
內容
|
ebp+4
|
由call指令推入的返回地址。
|
ebp
|
push ebp指令推入的原ebp值,然后新的ebp就等于當前的esp寄存器的值。
|
ebp-4
|
第一個局部變量@loc1:dword (4個字節)
|
ebp-6
|
第二個局部變量@loc2:word (2個字節)
|
ebp-7
|
第三個局部變量@loc3:byte (1個字節)
|
發表評論
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

評論