5.IA-32寄存器
寄存器(Register)是CPU內(nèi)部用來存放數(shù)據(jù)的一些小型存儲區(qū)域,它與RAM(Random?Access?Memory,隨機存儲器、內(nèi)存)略有不同。CPU訪問(Access)RAM中的數(shù)據(jù)時要經(jīng)過較長的物理路徑,所以花費的時間要長一些;而寄存器集成在CPU內(nèi)部,擁有非常高的讀寫速度。
IA-32是英特爾推出的32位元架構(gòu),屬于復(fù)雜的指令集架構(gòu),提供非常多的功能,并且支持多種寄存器。IA-32支持的寄存器類型:
基本程序運行寄存器
通用寄存器(General?Purpose?Registers?,32位,8個)
段寄存器(Segment?Registers,?16位,6個)
程序狀態(tài)與控制寄存器(Program?Status?and?Control?Registers?,32位,1個)
指令指針寄存器(Instruction?Pointer?,32位,1個)
?
?
1.通用寄存器
通用寄存器是一種通用型的寄存器,用于傳送和暫存數(shù)據(jù),也可參與算數(shù)邏輯運算,并保存運算結(jié)果。IA-32中每個通用寄存器的大小都是32位,即4個字節(jié),主要用來保存常量與地址等,由特定匯編指令操作特定寄存器。除常規(guī)用途外,某些寄存器還具有一些特殊功能:
?
EAX:(針對操作數(shù)和結(jié)果數(shù)據(jù)的)累加器
EBX:(DS段中的數(shù)據(jù)指針)基址寄存器
ECX:(字符串和循環(huán)操作的)計數(shù)器
EDX:(I/O指針)數(shù)據(jù)寄存器
以上4個寄存器主要用在算數(shù)運算(ADD、SUB、XOR、OR等)指令中,常常用來保存常量與變量的值。
此外,ECX與EAX也可以用于特殊用途。循環(huán)指令(LOOP)中,EXC用來循環(huán)計數(shù)(loop?count),每執(zhí)行一次循環(huán),ECX都會減1。EAX一般用在函數(shù)回值中,所有Win32API函數(shù)都會先把返回值保存到EAX再返回。
注意:
編寫Windows匯編程序時,Win32API函數(shù)在內(nèi)部會使用ECX與EDX,調(diào)用這些API時,ECX與EDX的值就會改變。所以,ECX與EDX中保存有重要數(shù)據(jù)時,調(diào)用API前要先把這些數(shù)據(jù)備份到其他寄存器或棧。
通用寄存器中其他幾個寄存器的名稱如下所示。
????EBP:(SS段中棧內(nèi)數(shù)據(jù)指針)擴展基址指針寄存器<棧針>。
????ESI:(字符串操作源指針)源變地寄存器。
????EDI:(字符串操作目標(biāo)指針)目的變址寄存器。
????ESP:(SS段中棧指針)棧指針寄存器。
以上4個寄存器主要用作保護(hù)內(nèi)存地址的指針。
????ESP只是棧區(qū)域的棧頂?shù)刂?#xff0c;某些指令(PUSH、POP、CALL、RET)可以直接用來操作ESP(棧區(qū)域管理是程序中相當(dāng)重要的部分,不要把ESP用作其他用途)。
????EBP表示棧區(qū)域的基地址,函數(shù)被調(diào)用時保存ESP的值,函數(shù)返回時再把值返回ESP。保證棧不會崩潰(這稱為棧幀(Stack?Frame)技術(shù),它是代碼逆向分析技術(shù)中的一個重要概念)ESI和EDI與特定指令(LODS、STOS、REP、MOVS等)一起使用,只要用于內(nèi)存復(fù)制。
2.段寄存器
IA-32的保護(hù)模式中,段是一種內(nèi)存保護(hù)技術(shù),它把內(nèi)存劃分為多個區(qū)域,并為每個區(qū)域賦予其實地址、范圍、訪問權(quán)限等,以保護(hù)內(nèi)存。此外,它還同分頁技術(shù)一起用于將虛擬內(nèi)存變更為實際物理內(nèi)存。段內(nèi)存記錄在SDT中,而段寄存器就持有這些SDT的索引(index)。共6種寄存器,分別為CS、SS、DS、ES、FS、GS,每個寄存器的大小為16位,即2個字節(jié)。另外,每個段寄存器指向的段描述符與虛擬內(nèi)存結(jié)合,形成一個線性地址(Linear?Address),借助分頁技術(shù),線性地址最終被轉(zhuǎn)換為實際的物理地址。
?
3.程序狀態(tài)與控制寄存器
EFLAGS:Flag?Register,標(biāo)志寄存器
IA-32中標(biāo)志寄存器的名稱為EFLAGS,其大小為4個字節(jié)(32位),由原來的16位FLAGS寄存器擴展而來。
EFLAGS寄存器的每位都有意義,每位的值或為1或為0,代表On/Off或者True、False。其中有些位由系統(tǒng)直接設(shè)定,有些則根據(jù)程序命令的執(zhí)行結(jié)果設(shè)置。
ZF:若運算結(jié)果為0,則其值為1,否則為0。
OF:有符號整數(shù)溢出時,OF值被置為1。此外,MSB改變時,其值也被設(shè)為1。
CF:無符號整數(shù)溢出時,其值為1。
4.指令寄存器
EIP:Instruction?Pointer,指令指針寄存器
指令指針寄存器保存著CPU要執(zhí)行的地址,大小為32位(4字節(jié)),由原16位IP寄存器擴展而來。程序運行時,CPU會讀取EIP中一條指令的地址,傳送指令地址到指令緩沖區(qū)后,EIP寄存器的值自動增加,增加的到校即是讀取指令的字節(jié)大小。這樣,CPU每次執(zhí)行完一條指令,就會通過EIP寄存器讀取并執(zhí)行下一條指令。(EIP無法被直接修改,只能通過其他指令如JMP、Jcc、CALL、RET等指令間接修改)。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的5.IA-32寄存器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。