彙編寄存器詳解

1、 16位寄存器組 
數據寄存器、變址寄存器統稱爲通用寄存器。 
在AX中,”x”表示的意思是mix,“混合”的意思。對AX指的是AH和AL兩個混合的總稱。 在EAX中,”E”表示的意思是Extended,“擴展”的意思。4個16位寄存器又可分割成8個獨立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每個寄存器都有自己的名稱,可獨立存取

8086的寄存器爲16位,有14個,可分爲三部分: 

(1) 8個通用寄存器: 數據寄存器 AX—Accumulator Register,累加寄存器。算術運算的主要寄存器。 BX—Base Register,基址寄存器 CX—Count Register,計數寄存器,串操作、循環控制的計數器 DX—Data Register,數據寄存器 地址指針寄存器 SI—Source Index Register,源變址寄存器 DI—Destination Index Register,目的變址寄存器 SP—Stack Pointer Register,堆棧寄存器 BP—Base Pointer Register,基址指針寄存器

(2) 4個段寄存器: CS—Code Segment Register,代碼段寄存器 DS—Data Segment Register,數據段寄存器 ES—Extra Segment Register,附加段寄存器 SS—Stack Segment Register,堆棧段寄存器 

(3) 2個控制寄存器: IP—Instruction Pointer,指令指針,即PC(Program counter),程序計數器 PSW—Processor State Word,微處理器狀態字 其中PSW包括有9個標誌位: CF—Carry Flag,進位標誌 PF—Parity Flag,奇偶標誌 AF—Auxiliary Carry Flag,輔助進位標誌 ZF—Zero Flag,零標誌 SF—Sign Flag,符號標誌 TF—Trap Flag,陷阱標誌 IF—Interrupt Enable Flag,中斷允許標誌 DF—Direction Flag,方向標誌 OF—Overflow Flag,溢出標誌

2、 32位寄存器組 
32位CPU的寄存器是32位的,並且32位的寄存器組增加了一些新的寄存器。對32位的通用寄存器EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP的低16位數據進行存取不影響高16位,所以,這些通用寄存器的低16位依舊用16位的AX、BX、CX、DX、SI、DI、SP、BP寄存器來表示。

32位的EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP與8086中的16位的AX、BX、CX、DX、SI、DI、SP、BP功能相似。 
32位CPU所含有的寄存器有: 
(1) 8個通用寄存器: 
數據寄存器 
EAX—Extended Accumulator Register,擴展的累加寄存器 
EBX—Extended Base Segment Register,擴展的基址寄存器 
ECX—Extended Count Segment Register,擴展的計數寄存器 
EDX—Extended Data Segment Register,擴展的數據寄存器

地址指針寄存器 
ESI—Extended Source Index Register,擴展的源變址寄存器 
EDI—Extended Destination Index Register,擴展的目的變址寄存器 
ESP—Extended Stack Pointer Register,擴展的堆棧寄存器 
EBP—Extended Base Pointer Register,擴展的基址指針寄存器 
(2) 6個段寄存器: 
CS—Code Segment Register,代碼段寄存器 
DS—Data Segment Register,數據段寄存器 
SS—Stack Segment Register,堆棧段寄存器 
FS—Flag Segment Register,標誌段寄存器 
FS寄存器指向當前活動線程的TEB結構(線程結構)。 
FS:[0]的地址指向的是TEB結構,這個結構的開頭是一個NT_TIB結構,NT_TIB結構的0x18偏移處是一個Self指針,指向這個結構自身,也就是指向TEB結構的開頭。 
GS—Global Segment Register,全局段寄存器

(3) 2個控制寄存器: 
EIP—Extended Instruction Pointer,擴展的指令指針,即PC(Program counter),程序計數器。 
PSW—Processor State Word,微處理器狀態字 
其中PSW包括有9+4個標誌位: 
CF—Carry Flag,進位標誌 
PF—Parity Flag,奇偶標誌 
AF—Auxiliary Carry Flag,輔助進位標誌 
ZF—Zero Flag,零標誌 
SF—Sign Flag,符號標誌 TF—Trap Flag, 
陷阱標誌 IF—Interrupt Enable Flag, 
中斷允許標誌 DF—Direction Flag, 
方向標誌 OF—Overflow Flag, 
溢出標誌 IOPL—I/O Privilege Level, 
I/O特權標誌 NT—Nested Task, 
嵌套任務標誌 RF—Restart Flag,重啓動標誌 
VM—Virtual 8086 Mode,虛擬8086方式標誌

3、註釋 
(1)、數據寄存器 
數據寄存器可分爲8位的寄存器,作爲通用寄存器,可存儲算術邏輯運算的操作數和運算結果。 
AX,Accumulator,通累加器,用累加器進行的操作可能需要更少時間。可用於乘、 除、輸入/輸出等操作,使用頻率很高; 
BX,Base,基址寄存器,雖然屬於數據寄存器,但它經常用作地址寄存器。 
CX,Count,計數寄存器,經常用作一個循環的計數,在循環語句中,默認CX的內容爲循環次數。在位操作中,當移多位時,要用CX的低8位CL來指明移位的位數。 
DX,Data,數據寄存器,在進行乘、除運算時,它可作爲默認的操作數參與運算,但在I/O指令中,DX用於表示I/O的端口地址。 
在16位CPU中,AX、BX、CX和DX不能作爲基址和變址寄存器來存放存儲單元的地址,

(2)、地址指針寄存器 
地址指針寄存器不可分割成8位寄存器。作爲通用寄存器,也可存儲算術邏輯運算的操作數和運算結果。 
SI,Source,源地址寄存器,在字符串操作指令中,提供源操作數的段內偏移地址,在其他指令中,可用作地址寄存器。 
DI,Destination,目標地址寄存器,在字符串操作指令中,提供目的操作數的段內偏移地址,在其他指令中,可用作地址寄存器。

BP,Base,基址指針寄存器,可以指定段內偏移地址,將BP用作地址寄存器時,其默認的段地址爲SS。

SP,Stack,堆棧指針寄存器,用於保存堆棧段的段內偏移地址,段地址由SS提供。

(3)、段寄存器 
段寄存器是根據內存分段的管理模式而設置的。內存單元的物理地址由段寄存器的值和一個偏移量組合而成的,這樣可用兩個較少位數的值組合成一個可訪問較大物理空間的內存地址。 
CPU內部的段寄存器: 
CS,Code,代碼段寄存器,用於存放當前執行程序的段地址,IP爲指令指針。 
DS,Data,數據段寄存器,用於存放當前數據段的段地址。 
ES,Extra,附加段寄存器,用於存放當前附加數據段的段地址 
SS,Stack,堆棧段寄存器,用於存放當前堆棧段的段地址。 
FS,Flag,標誌段寄存器,FS寄存器指向當前活動線程的TEB結構(線程結構)。FS:[0]的地址指向的是TEB結構,這個結構的開頭是一個NT_TIB結構,NT_TIB結構的0x18偏移處是一個Self指針,指向這個結構自身,也就是指向TEB結構的開頭。 
GS,Global,全局段寄存器。 
32位CPU有兩個不同的工作方式:實方式和保護方式。在每種方式下,段寄存器的作用是不同的。有關規定簡單描述如下: 
實方式: 前4個段寄存器CS、DS、ES和SS與先前CPU中的所對應的段寄存器的含義完全一致,內存單元的邏輯 
地址仍爲“段值:偏移量”的形式。爲訪問某內存段內的數據,必須使用該段寄存器和存儲單元的偏移量。 
保護方式: 在此方式下,情況要複雜得多,裝入段寄存器的不再是段值,而是稱爲“選擇子”(Selector)的某個值。。

(4)、控制寄存器 
32位CPU把指令指針擴展到32位,並記作EIP,EIP的低16位與先前CPU中的IP作用相同。 IP,Instruction,指令指針寄存器,用於保存下一條即將要執行的指令的段內偏移地址。一般要通過轉移指令、子程序調用、返回指令等才能改變IP的值。 PSW,Processor State Word,微處理器狀態字,其中DF、IF、TF標誌用於控制CPU操作,其他ZF、SF、AF、PF、CF、OF反映ALU前一次操作的結果狀態。 
反映ALU前一次操作的結果狀態的標誌位: CF,Carry,進位標誌,加減運算時,最高位有進(借)位時,CF=1 PF,Parity,奇偶標誌,操作結果的低8位中含有“1”的個數爲偶數個時,PF=1 AF,Auxiliary Carry,輔助進位標誌,加減運算時,D3位有進(借)位時,AF=1 ZF,Zero,零標誌,運算結果爲0時,ZF=1 SF,Sign,符號標誌,操作結果的符號,結果爲負,SF=1 OF,Overflow,溢出標誌,有符號數運算時是否溢出的標誌,溢出,則OF=1 
控制CPU的標誌位: DF,Direction,方向標誌,字符串操作中,DF=0時,地址寄存器(SI,DI)的內容遞增;DF=1時,(SI,DI)的內容遞減。

IF,Interrupt Enable,中斷允許標誌,IF=1時,CPU能夠響應可屏蔽中斷請求;IF=0時,則CPU不能響應中斷請求。 TF,Trap,陷阱標誌,TF=1時,則CPU處於單步執行方式,即每執行一條指令就自動執行一次類型1的內部中斷,這主要用於Debug中。 
32位標誌寄存器增加的標誌位:

IOPL,I/O Privilege Level,I/O特權標誌,I/O特權標誌用兩位二進制位來表示,也稱爲I/O特權級字段。該字段指定了要求執行I/O指令的特權級。 
如果當前的特權級別在數值上小於等於IOPL的值,那麼,該I/O指令可執行,否則將發生一個保護異常。 
NT,Nested Task,嵌套任務標誌,嵌套任務標誌NT用來控制中斷返回指令IRET的執行。NT=0,用堆棧中保存的值恢復EFLAGS、CS和EIP,執行常規的中斷返回操作;NT=1,通過任務轉換實現中斷返回。 
RF,Restart Flag,重啓動標誌,重啓動標誌RF用來控制是否接受調試故障。RF=0時,表示“接受”調試故障,否則拒絕之。 
在成功執行完一條指令後,處理機把RF置爲0,當接受到一個非調試故障時,處理機就把它置爲1。 
VM,Virtual 8086 Mode,虛擬8086方式標誌,VM=1,表示處理機處於虛擬的8086方式下的工作狀態,否則,處理機處於一般保護方式下的工作狀態。

4、 32位地址的尋址方式

最後說一下32位地址的尋址方式。在前面我們學習了16位地址的尋址方式,一共有5種,在32位微機系統

中,又提供了一種更靈活、方便但也更復雜的內存尋址方式,從而使內存地址的尋址範圍得到了進一步擴大。

在用16位寄存器來訪問存儲單元時,只能使用基地址寄存器(BX和BP)和變址寄存器(SI和DI)來作爲

偏移地址的一部分,但在用32位寄存器尋址時,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、

EDX、ESI、EDI、EBP、和ESP)都可以是偏移地址的一個組成部分。

當用32位地址偏移量進行尋址時,偏移地址可分爲3部分:

1. 一個32位基址寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)。

2. 一個可乘以1、2、4、8的32位變址寄存器(EAX、EBX、ECX、EDX、ESI、EDI和EBP)。

3. 一個8位~32位的偏移常量。

比如,指令:mov ebx, [eax+edx*2+300]

Eax就是基址寄存器,edx就是變址寄存器,300H就是偏移常量。

上面那3部分可進行任意組合,省去其中之一或之二。

下面列舉幾個32位地址尋址指令:

Mov ax, [123456]

Mov eax, [ebx]

Mov ebx, [ecx*2]

Mov ebx, [eax+100]

Mov ebx, [eax*4+200]

Mov ebx, [eax+edx*2]

Mov ebx, [eax+edx*4+300]

Mov ax, [esp]

由於32位尋址方式能使用所有的通用寄存器,所以,和該有效地址相組合的段寄存器也就有新的規定,具體

規定如下:

1. 地址中寄存器的書寫順序決定該寄存器是基址寄存器還是變址寄存器。

如:[ebx+ebp]中的ebx是基址寄存器,ebp是變址寄存器,而[ebp+ebx]中的ebp是基址寄存器,ebx是變

址寄存器,可以看出,左邊那個是基址寄存器,另一個是變址寄存器。

2. 默認段寄存器的選用取決於基址寄存器。

3. 基址寄存器是ebp或esp時,默認的段寄存器是SS,否則,默認的段寄存器是DS。

4. 在指令中,如果顯式地給出段寄存器,那麼顯式段寄存器優先。

下面列舉幾個32位地址尋址指令及其內存操作數的段寄存器。

指令列舉:          訪問內存單元所用的段寄存器

mov ax, [123456]    ;默認段寄存器爲DS。

mov ax, [ebx+ebp]    ;默認段寄存器爲DS。

mov ebx, [ebp+ebx]    ;默認段寄存器爲SS。

mov ebx, [eax+100]    ;默認段寄存器爲DS。

mov edx, ES:[eax*4+200]    ;顯式段寄存器爲ES。

mov [esp+edx*2], ax    ;默認段寄存器爲SS。

mov ebx, GS:[eax+edx*8+300]    ;顯式段寄存器爲GS。

mov ax, [esp]    ;默認段寄存器爲SS。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章