1. 程式人生 > >彙編 第二章 暫存器

彙編 第二章 暫存器

在我看來,第二章中主要圍繞著6個暫存器展開闡述。它們分別是AX、BX、CX、DX、CS、IP

 

在此之前,通過本章的學習,使我對CPU這一概念又有了更深一步的認識。

1.CPU中字長與位寬的區別

通常情況下,用字長來描述CPU。例如,字長16,則稱16位CPU。那麼16位CPU有什麼具體的含義呢?

(1)表明運算器一次最多可以處理16位的資料;(2)暫存器的最大寬度是16位;(3)暫存器和運算器之間的通路是16位。

概括地來講,就是通過字長這一指標可以反映出CPU內部運算處理的速度(這與本章中的實體地址與邏輯地址有著密切的關係,下文中會提到)。在這裡老師在課堂上提到了位寬這一名詞,須與字長區分開來。位寬是指CPU通過外部資料匯流排與記憶體之間一次能夠傳送的資料位

。例如,8086——16位CPU(字長是16位,位寬也是16位),80386——32位CPU(字長32位,位寬16位),Pentium——32位CPU(字長32位,位寬64位)。

2.ISA(位元組集編碼)

ISA,一個處理器支援的指令和指令的位元組級編碼(與之後的CS,IP暫存器有關)。

*通過課前的quiz小練習我進一步瞭解到不同的CPU生產廠商在生產CPU時如果遵照相同的ISA,則認為這些CPU在ISA級別上是相容的。而不同的CPU的差異也主要體現在處理的字長及速度、工作模式、指令集的豐富程度這三方面。我們平時最常見到的x86系列也稱IA32指令集(Intel32位體系結構),包括真實模式和保護模式。

 

再說到第二章的主題暫存器,在8086CPU中所有暫存器都是16位的,可以存放兩個位元組

1.通用暫存器(AX、BX、CX、DX)。在CPU內部運算時,它們通常被用來儲存運算元和中間結果。為了保證相容,使原來基於上代CPU編寫的程式稍加修改就可以執行在8086之上,便有了高8位、低8位的暫存器的出現。

以暫存器AX為例,如圖所示,分為AH(高8位)和AL(低8位)。此時需要注意AX與AH(AL)暫存器所能表示的整數範圍是不一樣的。AX暫存器是16位的。它所能表示的無符號整數的範圍是0~(2^16)-1,而AL(AH)所能表示的無符號整數範圍是0~(2^8)-1(其他三個通用暫存器亦是如此)。

之後又介紹了兩條基本的彙編指令:mov、add(在本章學習中,mov與add 指令還只是在CPU內部進行相關操作)。在指令使用時需要注意:

(1)計算結果是否超出寄存位數,若超出要“丟失”進位值。同時,注意AL的進位值不能寫入AX中,這也更好地體現了AH與AL是兩個獨立使用的暫存器。

(2)指令的兩個操作物件應要保證位數一致。若出現mov al,2000、mov ax,bh等情況均是錯誤的。

2.CS與IP暫存器。CS——程式碼暫存器和IP——指令指標暫存器是8086CPU中兩個最關鍵的暫存器,其重要性在於提供了CPU要執行指令的地址。這也隨之帶來了問題:8086的暫存器是16位的,而外部地址匯流排寬度為20位,16位的暫存器無法表示20位地址線寬度。

於是,設計者由此想出解決方法:採用一種在內部用兩個16位地址合成的方法來形成一個20位的實體地址。在8086CPU中的具體形式為:

實體地址=段地址*16+偏移地址  CS中的內容即為段地址,IP中的內容即為偏移地址,CS和IP的值合在一起,CS:IP恰好構成計算機中下一條將要執行的指令的邏輯地址

*通過課前的quiz小練習,我理解了實體地址與邏輯地址之間的區別與聯絡:

邏輯地址——用[段地址:偏移地址]的形式表示,其中[段地址*16]是這個邏輯段的起始實體地址,偏移地址可理解為記憶體單元相對於段起始實體地址的位移量。

實體地址——每一個記憶體單元在一個一維線性空間中的唯一地址,而這個一維線性空間是所有的記憶體單元構成的儲存空間。

對於8086CPU給出的實體地址方法,仔細學習後還得出了以下一些結論:

1)CPU可以用不同的段地址和偏移地址形成同一個實體地址。

2)如果給定一個段地址,僅用偏移量來定址最多可尋2^16B即64KB個記憶體單元。

3)記憶體並沒有分段,只是8086CPU給出的實體地址方法使得我們可以用分段的形式來管理記憶體。正因如此,之後我們在程式設計時也可以根據需要,將若干地址連續的記憶體單元看作一個段,該段的起始地址為段地址*16。不過需要注意兩點,一個段的起始地址一定為16的倍數,一個段的最大長度為64KB(因為偏移地址為16位,決定了其定址能力)。

再回到CS和IP這兩個暫存器上,CPU從何處執行指令是由CS、IP中的內容決定的。由此我們可以通過改變CS、IP中的內容來控制暫存器。那麼,如何來控制呢?8086CPU通過轉移指令修改CS、IP的內容。在本章中我學習了兩種方法:

1)jmp段地址:偏移地址  ——段地址修改CS中的內容,偏移地址修改IP中的內容

2)jmp 某一合法暫存器 ——用暫存器中的值修改IP內容

最後是CPU是進行讀取、執行指令的工作原理:

(1)從CS:IP指向的記憶體單元讀取指令;

(2)IP=IP+所讀取指令的長度,從而指向下一條指令;(如何知道所取指令的長度:CPU從記憶體中取出一系列位元組並設定一個待分析的位置,從此位置逐位元組分析得出該條指令的長度)

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