天天看點

彙編語言--寄存器(cpu工作原理)

本文主要将介紹的是8086 cpu中的寄存器,

寄存器就是個存儲資訊的單元或者說是器件又或者說是容器而已,就比如記憶體也是一個存儲媒體或者說是存儲單元而已,其實寄存器從了解上來說和記憶體差不多,

隻不過寄存器(這裡讨論的寄存器都是 cpu 中的寄存器,不包括外設上的寄存器)位于cpu内部,寄存器是 cpu 中的稀有資源,而對于一個彙程式設計式員來說,cpu 中主要可以使用的也就是寄存器而已,彙程式設計式員可以使用指令來讀寫 cpu 中的寄存器,進而可以實作對于 cpu 的控制,當然,不同的 cpu ,寄存器的個數和結構都是不一樣的,比如 8086 cpu 中,寄存器的個數也就 14 個而已,并且 8086 cpu 中所有的寄存器的結構為 16 位,即一個寄存器中可以存放下2b即2個位元組,而到了 80386 cpu 中,寄存器的個數也比 8086 增多了。

8086  cpu 中寄存器總共為 14 個,且均為 16 位 。

即 ax,bx,cx,dx,sp,bp,si,di,ip,flag,cs,ds,ss,es 共 14 個。

而這 14 個寄存器按照一定方式又分為了通用寄存器,控制寄存器和段寄存器。

通用寄存器:

ax,bx,cx,dx 稱作為資料寄存器:

ax (accumulator):累加寄存器,也稱之為累加器;

bx (base):基位址寄存器;

cx (count):計數器寄存器;

dx (data):資料寄存器;

sp 和 bp 又稱作為指針寄存器:

sp (stack pointer):堆棧指針寄存器;

bp (base pointer):基指針寄存器;

si 和 di 又稱作為變址寄存器:

si (source index):源變址寄存器;

di (destination index):目的變址寄存器;

控制寄存器:

ip (instruction pointer):指令指針寄存器;

flag:标志寄存器;

段寄存器:

cs (code segment):代碼段寄存器;

ds (data segment):資料段寄存器;

ss (stack segment):堆棧段寄存器;

es (extra segment):附加段寄存器;

通用寄存器

從上面可以知道,在 8086 cpu 中,通用寄存器有 8 個,分别是 ax,bx,cx,dx,sp,bp,si,di ,

至于為什麼給它們取名做通用寄存器,那是因為,這些個寄存器每一個都有自己專門的用途,

比如 cx 作為計數寄存器,則是在使用 loop 指令循環時用來指定循環次數的寄存器,

如果它們每一個都隻有一個專用的作用,那就它們隻能稱之為專用寄存器了,

正是因為這些個寄存器還可以用來傳送資料和暫存資料,是以才稱它們為通用寄存器 。

下面就按順序來一一介紹這幾個通用寄存器了:

資料寄存器(ax,bx,cx,dx):

資料寄存器有 ax,bx,cx,dx 四個組成,由于在 8086 之前的 cpu 為 8 位 cpu,是以為了相容以前的 8 位程式,在

8086 cpu 中,每一個資料寄存器都可以當做兩個單獨的寄存器來使用,由此,每一個 16 位寄存器就可以當做 2 個獨立的 8

位寄存器來使用了 。

ax 寄存器可以分為兩個獨立的 8 位的 ah 和 al 寄存器;

bx 寄存器可以分為兩個獨立的 8 位的 bh 和 bl 寄存器;

cx 寄存器可以分為兩個獨立的 8 位的 ch 和 cl 寄存器;

dx 寄存器可以分為兩個獨立的 8 位的 dh 和 dl 寄存器;

除了上面 4 個資料寄存器以外,其他寄存器均不可以分為兩個獨立的 8 位寄存器 ;

注意在上面标志中的“獨立”二字,這兩個字表明 ah 和 al 作為 8 位寄存器使用時,

可以看做它們是互不相關的,也就是看做兩個完全沒有聯系的寄存器 x 和 y 即可,

ax 寄存器:

ax 的另外一個名字叫做累加寄存器或者簡稱為累加器,其可以分為 2 個獨立的 8 位寄存器 ah 和 al;在寫彙程式設計式時,ax 寄存器可以說是使用率最高的寄存器,

既然 ax 是資料寄存器的話,那麼理所當然,其可以用來存放普通的資料。

bx 寄存器:

首先可以明确的是,bx 作為資料寄存器,表明其是可以暫存一般的資料,除了暫存一般性資料的功能外,bx 作為通用寄存器的一種,bx 主要還是用于其專屬功能 – 尋址(尋址實體記憶體位址)上,bx 寄存器中存放的資料一般是用來作為偏移位址使用的。

cx 寄存器:

cx 寄存器作為資料寄存器的一種,其同樣具有和 ax,bx 一樣的特點,即可以暫存一般性的資料,cx 也是有其專門的用途的,cx 中的 c 被翻譯為 counting 也就是計數器的功能,當在彙編指令中使用循環 loop 指令時,可以通過 cx 來指定需要循環的次數,而 cpu 在每一次執行 loop 指令的時候,都會做兩件事:

一件就是令 cx = cx – 1,即令 cx 計數器自動減去 1;還有一件就是判斷 cx 中的值,如果 cx 中的值為 0 則會跳出循環,而繼續執行循環下面的指令,

當然如果 cx 中的值不為 0 ,則會繼續執行循環中所指定的指令 。

dx 寄存器:

dx 寄存器作為資料寄存器的一種,同樣具有和 ax,bx,cx 一樣的特點,即可以暫存一般性的資料

8086相關部件的邏輯結構:

彙編語言--寄存器(cpu工作原理)

位址加法器采用:實體位址=段位址 * 16 + 偏移位址 的方法計算實體位址

8086cpu的工作過程可以簡單描述如下:

(1)從cs:ip指向的記憶體單元讀取指令,讀取的指令進入指令緩沖器

(2)ip=ip+所讀的指令的長度,進而指向下一條指令

(3)執行指令,轉到步驟(1),重複這個過程

檢視cpu和記憶體,用機器指令和彙編指令程式設計

1、預備知識-debug的使用

debug是一個dos實用程式,是供程式員使用的程式調試工具,可以用它檢查記憶體中任何地方的位元組以及修改任何地方的位元組。它可以用于逐指令執行

某個程式以驗證程式運作的正确性,也可以追蹤執行過程、比較一個指令執行前後的值以及比較與移動記憶體中資料的範圍,讀寫檔案與磁盤扇區。

debug的指令較多,有20多個,這裡将使用到的一些debug指令的解釋如下:

-r:檢視、改變cpu寄存器的内容

-d:檢視記憶體中的内容

-e:改寫記憶體中的内容

-u:将記憶體中的機器指令翻譯成彙編指令

-t:執行一條機器指令

-a:以彙編指令的格式在記憶體中寫入一條機器指令

在【開始】菜單中的【運作】對話框,輸入"cmd"回車,可以使用alt+enter将視窗轉變為全屏

輸入debug指令

(1)使用r指令檢視、改變cpu寄存器的内容

彙編語言--寄存器(cpu工作原理)

注意cs和ip的值,cs=1388,ip=0100,即記憶體1388:0100處的指令為cpu目前要讀取、執行的指令

彙編語言--寄存器(cpu工作原理)

(2)使用d指令檢視記憶體中的内容

彙編語言--寄存器(cpu工作原理)

d 段位址:偏移位址  debug将列出從指定記憶體單元開始的128個記憶體單元的内容

彙編語言--寄存器(cpu工作原理)

還可以用指定d指令的檢視範圍,此時采用"d段位址:起始偏移位址 結尾偏移位址"的格式

比如要看1000:0--1000:9中的内容

彙編語言--寄存器(cpu工作原理)

(3)使用e指令改寫記憶體中的内容

彙編語言--寄存器(cpu工作原理)

用e指令向記憶體中寫入機器碼:

彙編語言--寄存器(cpu工作原理)

用u指令檢視記憶體中機器碼的含義:

彙編語言--寄存器(cpu工作原理)

用t指令執行記憶體中的機器碼:

彙編語言--寄存器(cpu工作原理)

使用t指令繼續執行:

彙編語言--寄存器(cpu工作原理)

用a指令在記憶體中寫入機器指令:

上面使用e指令寫入機器指令,不是很友善,最好能直接以彙編指令的形式寫入指令,于是出現了下面的a指令:

彙編語言--寄存器(cpu工作原理)

用a指令向從1000:0開始的記憶體單元中寫入指令

實驗任務

(1)使用debug,将下面的程式段寫入記憶體,逐條執行,觀察每條指令執行後,cpu中相關寄存器中内容的變化

彙編語言--寄存器(cpu工作原理)

繼續閱讀