CPU通用寄存器

轉載,供參考

 

引言
要想真正的瞭解計算機,首先要了解的便是CPU,CPU是計算機的核心部件,因爲計算機的所有指令都是由CPU處理的,而CPU的核心部件之一就是寄存器。所以瞭解寄存器和寄存器是如何工作的才能真正明白計算機的工作原理。

8/16/32位通用寄存器
計算機中最經典的指令就是移動指令,如:mov ecx,eax。這條指令的意思就是將eax寄存器的值移動到ecx寄存器中。

在32位操作系統中包含如下8個通用寄存器:eax,ecx,edx,ebx,esp,ebp,esi,edi。

mov指令可以任意移動這8個寄存器,在mov ecx,eax中,後面的是源,後面的是目標,中間是逗號,不區分大小寫。寄存器之間可以相互的移動。

如果計算機只有移動指令的話,那麼什麼事也幹不了了。

mov是操作碼,兩個寄存器是操作數,操作碼除了mov之外還有很多,你可以替換:加(ADD)、減(SUB)、與(AND)、或(OR)、異或(XOR)、非(NOT)。

比如: add eax,ecx

當然了,操作碼不僅僅只有這幾個,還有很多很多,只要搞清楚操作數是任意兩個寄存器,當然可以是同一個寄存器。

比如:or esi,esi指令的意思是將esi “或” esi並將結果賦給esi。操作數除了寄存器之外,還可以是一個立即數(imm),只要保證32即可。

歷史原因
由於歷史原因,早期的計算機科學家在設計時,最早是運行在8位的操作系統中,爲了保證其兼容性,所以8個寄存器是分段設計的。

比如算盤,我們可以只用一半,或者四分之一。

eax可以分成4個部分:eax共0~31(32位),其中0~7位叫作AL,8~15位叫作AH。整個0~15位又稱爲AX。

AL:low表示低位,AH:high表示高位。ecx,edx,ebx寄存器也是一樣的,如圖2-1所示:


圖2-1:EAX寄存器
 

以上的四個寄存都可以分成三段。

ESP,EBP,ESI,EDI,這四個寄存器只分成兩段,比如:ESP整體0~31位稱爲ESP,0~15位稱爲SP。

通過以下,我們可以看出,32位的寄存器有8個,分別是:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI,每個寄存器都有一個編號,分別是:0號,1號,2號,3號......如表2-2所示:

寄存器    編號(二進制)    編號(十進制)
32位    16位    8位          
EAX    AX    AL    0000    0
ECX    CX    CL    0001    1
EDX    DX    DL    0010    2
EBX    BX    BL    0011    3
ESP    SP    AH    0100    4
EBP    BP    CH    0101    5
ESI    SI    DH    0110    6
EDI    DI    BH    0111    7
32 位寄存器有自己的編號,16 位寄存器也有屬於自己的獨立的編號。當然,他們是重疊的,當改變了 32 位的寄存器,相應的 16 位寄存器也會跟着改變。


同樣,也有 8 位的寄存器,第 0 號 AL,第 1 號,CL,DL,BL,AH,CH,DH,BH。順序不能亂。當然還有兩個寄存器:EIP 和 EFLAGS(又稱爲 EFL),8 號和 9 號寄存器,EIP 有 16 位,叫做 IP。EFL 的 16 位稱爲 FL。這兩個寄存器使用相對較少。

Q/A
Q:在使用DTDebug進行調試時,發現EIP的值不斷在發生變化,我們不但要有命令去操作這些寄存器,還需要區別當前用的是哪一條命令,下一次再調用哪一條命令?

A:CPU具有判斷指令長度和預處理指令的功能,每一條指令都有字節長度,EIP的計算方法是:下一條指令=當前指令地址+當前指令字節長度。

Q:爲什麼通用寄存的指令順序是EAX,ECX,EDX,EBX......而不是EAX,EBX,ECX,EDX... ...,按順序不是更容易記住嗎?

A:其實從記憶的角度來看,確實按字母的順序更方便於我們記憶,但是Intel的技術員不這麼認爲,他們就是這麼定義寄存器的的順序的。瞭解寄存的順序和編號,對彙編指令和硬編碼尤爲重要。

總結
通用寄存器即CPU常用的寄存器。Intel手冊給出了通用寄存器的功能:通用目的寄存器(General-Purpose Register)主要實現邏輯和算術運算、地址計算和內存指針。

通用寄存器結構圖如下:


圖212:通用寄存器結構
 

爲什麼上圖看上去比較奇怪,有的寄存器被分成一塊一塊?其實都是歷史遺留問題,在早期的技術還沒有現在成熟時,8 個通用寄存器寬度是 8 位(這裏指的是二進制的 8 位):AL,AH,CL,CH,DL,DH,BL,BH。後來 cpu 技術逐漸發展,由 8 位發展成 16 位,於
是寄存器由 8 位演變成 16 位:AX,CX,DX,BX,SP,BP,SI,DI。但是爲了兼容前面的 8 位技術,將之前的 8 個 8 位寄存器封裝到 AX,CX,DX,BX 寄存器中。技術發展的腳步是不會停歇的,之後將16位寄存都擴充了一倍,於是32位寄存器又相繼出現了,當然這裏只截止32位,64位和128位寄存器留給大家思考。

32位通用目的寄存器的指定用途如下:

EAX:累加器(Accumulator)
ECX:計數器(Counter)
EDX:I/O指針
EBX:DS段的數據指針
ESP:堆棧(Stack)指針
EBP:SS段的數據指針
ESI:字符串操作的源(Source)指針:SS段的數據指針
EDI:字符串操作的目標(Destination)指針:ES段的數據指針。
   以上只是讓大家對寄存器的縮寫的含義瞭解一下,畢竟使用一樣的東西,不明白其中的道理,實在太不高明,而且這東西是老外發明的,按中式邏輯很難猜測出來。

彙編就是”寄存器與寄存器“或者”寄存器與內存“之間來回移動數據。

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