天天看點

計算機中常用寄存器功能,(轉)彙編中各寄存器的作用

反彙編裡rep stos dword ptr es:[edi] 是做什麼的?

參考資料:1.http://www.cnblogs.com/awpatp/archive/2012/08/05/2623628.html

2.http://stackoverflow.com/questions/4024492/can-anyone-help-me-interpret-this-simple-disassembly-from-windbg

3.http://www.cs.ubbcluj.ro/~dadi/ac/doc/ng1cf0a.html

4.http://www.cs.ubbcluj.ro/~dadi/ac/doc/ng15a5f.html

彙編當中 dword ptr [ ] 是什麼意思?

dword 雙字 就是四個位元組

ptr pointer縮寫 即指針

[]裡的資料是一個位址值,這個位址指向一個雙字型資料

比如mov eax, dword ptr [12345678] 把記憶體位址12345678中的雙字型(32位)資料賦給eax

再比如

MOV EAX, DWORD PTR SS:[EBP-1CH]

MOV是一個指派語句,這句話的意思是:将EBP寄存器的值減1CH,然後在SS(堆棧段)尋址,找到EBP-1CH這個位址的值,然後将這個值轉換成 DWORD類型,也就是32位,取4位元組,然後存在EAX這個寄存器裡。

寄存器 英文名稱:Register

寄存器定義:寄存器是中央處理器内的組成部份。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、資料和位址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程式計數器(PC)。在中央處理器的算術及邏輯部件中,包含的寄存器有累加器(ACC)。寄存器是CPU内部的元件,寄存器擁有非常高的讀寫速度,是以在寄存器之間的資料傳送非常快。

寄存器用途

1.可将寄存器内的資料 執行算術及邏輯運算;

2.存于 寄存器内的位址 可用來 指向記憶體的某個位置,即尋址;

3.可以用來 讀寫資料到電腦的周邊裝置。

8086 有14個16位寄存器,這14個寄存器按其用途可分為(1)通用寄存器、(2)指令指針、(3)标志寄存器和(4)段寄存器等4類。

(1)通用寄存器有8個, 又可以分成2組,一組是資料寄存器(4個),另一組是指針寄存器及變址寄存器(4個).

資料寄存器分為:

AH&AL=AX(accumulator):累加寄存器,常用于運算;在乘除等指令中指定用來存放操作數,另外,所有的I/O指令都使用這一寄存器與外界裝置傳送資料.

BH&BL=BX(base):基址寄存器,常用于位址索引;

CH&CL=CX(count):計數寄存器,常用于計數;常用于儲存計算值,如在移位指令,循環(loop)和串處理指令中用作隐含的計數器.

DH&DL=DX(data):資料寄存器,常用于資料傳遞。

他們的特點是,這4個16位的寄存器可以分為高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。這2組8位寄存器可以分别尋址,并單獨使用。

另一組是指針寄存器和變址寄存器,包括:

SP(Stack Pointer):堆棧指針,與SS配合使用,可指向目前的堆棧位置;

BP(Base Pointer):基址指針寄存器,可用作SS的一個相對基址位置;

SI(Source Index):源變址寄存器可用來存放相對于DS段之源變址指針;

DI(Destination Index):目的變址寄存器,可用來存放相對于 ES 段之目的變址指針。

這4個16位寄存器隻能按16位進行存取操作,主要用來形成操作數的位址,用于堆棧操作和變址運算中計算操作數的有效位址。

(2) 指令指針IP(Instruction Pointer)

指令指針IP是一個16位專用寄存器,它指向目前需要取出的指令位元組,當BIU(總線接口部件,Bus Interface Unit)從記憶體中取出一個指令位元組後,IP就自動加1,指向下一個指令位元組。注意,IP指向的是指令位址的段内位址偏移量,又稱偏移位址(Offset Address)或有效位址(EA,Effective Address)。

(3)标志寄存器FR(Flag Register)

8086有一個18位的标志寄存器FR,在FR中有意義的有9位,其中6位是狀态位,3位是控制位。分别是:OF:溢出标志位,DF:方向标志位,IF:中斷允許标志位,TF:跟蹤标志位,SF:符号标志位,ZF:零标志位,AF:輔助進位标志位,PF:奇偶标志位,CF:進位标志位

4)段寄存器(Segment Register)

為了運用所有的記憶體空間,8086設定了四個段寄存器,專門用來儲存段位址:

CS(Code Segment):代碼段寄存器;

DS(Data Segment):資料段寄存器;

SS(Stack Segment):堆棧段寄存器;

ES(Extra Segment):附加段寄存器。

當一個程式要執行時,就要決定程式代碼、資料和堆棧各要用到記憶體的哪些位置,通過設定段寄存器 CS,DS,SS 來指向這些起始位置。通常是将DS固定,而根據需要修改CS。是以,程式可以在可尋址空間小于64K的情況下被寫成任意大小。是以,程式和其資料組合起來的大小,限制在DS 所指的64K内,這就是COM檔案不得大于64K的原因。8086以記憶體做為戰場,用寄存器做為軍事基地,以加速工作。

以上是8086寄存器的整體概況, 自80386開始,PC進入32bit時代,其尋址方式,寄存器大小, 功能等都發生了變化:

=============================以下是80386的寄存器的一些資料=========================

寄存器都是32-bits寬。

A、通用寄存器

下面介紹通用寄存器及其習慣用法。顧名思義,通用寄存器是那些你可以根據自己的意願使用的寄存器,修改他們的值通常不會對計算機的運作造成很大的影響。通用寄存器最多的用途是計算。

EAX:通用寄存器。相對其他寄存器,在進行運算方面比較常用。在保護模式中,也可以作為記憶體偏移指針(此時,DS作為段寄存器或選擇器)

EBX:通用寄存器。通常作為記憶體偏移指針使用(相對于EAX、ECX、EDX),DS是預設的段寄存器或選擇器。在保護模式中,同樣可以起這個作用。

ECX:通用寄存器。通常用于特定指令的計數。在保護模式中,也可以作為記憶體偏移指針(此時,DS作為寄存器或段選擇器)。

EDX:通用寄存器。在某些運算中作為EAX的溢出寄存器(例如乘、除)。在保護模式中,也可以作為記憶體偏移指針(此時,DS作為段寄存器或選擇器)。

同AX分為AH&AL一樣,上述寄存器包括對應的16-bit分組和8-bit分組。

B、用作記憶體指針的特殊寄存器

變址寄存器: ESI:通常在記憶體操作指令中作為“源位址指針”使用。當然,ESI可以被裝入任意的數值,但通常沒有人把它當作通用寄存器來用。DS是預設段寄存器或選擇器。

變址寄存器: EDI:通常在記憶體操作指令中作為“目的位址指針”使用。當然,EDI也可以被裝入任意的數值,但通常沒有人把它當作通用寄存器來用。DS是預設段寄存器或選擇器。

指針寄存器: EBP:這也是一個作為指針的寄存器。通常,它被進階語言編譯器用以建造‘堆棧幀'來儲存函數或過程的局部變量,不過,還是那句話,你可以在其中儲存你希望的任何資料。SS是它的預設段寄存器或選擇器。

指針寄存器: ESP:寄存器EBP、ESP、BP和SP稱為指針寄存器(Pointer Register),主要用于存放堆棧記憶體儲單元的偏移量,用它們可實作多種存儲器操作數的尋址方式,為以不同的位址形式通路存儲單元提供友善。

BP為基指針(Base Pointer)寄存器,用它可直接存取堆棧中的資料;SP為堆棧指針(Stack Pointer)寄存器,用它隻可通路棧頂。

注意,這三個寄存器沒有對應的8-bit分組。換言之,你可以通過SI、DI、BP作為别名通路他們的低16位,卻沒有辦法直接通路他們的低8位。

C、段選擇器

CPU内部的段寄存器:CS——代碼段寄存器(Code Segment Register),其值為代碼段的段值;DS——資料段寄存器(Data Segment Register),其值為資料段的段值;ES——附加段寄存器(Extra Segment Register),其值為附加資料段的段值;SS——堆棧段寄存器(Stack Segment Register),其值為堆棧段的段值;FS——附加段寄存器(Extra Segment Register),其值為附加資料段的段值;GS——附加段寄存器(Extra Segment Register),其值為附加資料段的段值。

* 注意 一定不要在初學彙編的階段把這些寄存器弄混。他們非常重要,而一旦你掌握了他們,你就可以對他們做任意的操作了。段寄存器,或選擇器,在沒有指定的情況下都是使用預設的那個。這句話在現在看來可能有點稀裡糊塗,不過你很快就會在後面知道如何去做。

D、指令指針寄存器

EIP 這個寄存器非常的重要。這是一個32位寬的寄存器,同CS一同指向即将執行的那條指令的位址。不能夠直接修改這個寄存器的值,修改它的唯一方法是跳轉或分支指令。(CS是預設的段或選擇器)

總結:

4個資料寄存器(EAX、EBX、ECX和EDX)2個變址和指針寄存器(ESI和EDI) 2個指針寄存器(ESP和EBP)6個段寄存器(ES、CS、SS、DS、FS和GS)1個指令指針寄存器(EIP) 1個标志寄存器(EFlags)