第2章 寄存器
開章:
前面有博世面試的時候,就問過一個問題,為什么要有寄存器?當時自己也沒有說清楚,看完這一章相關(guān)的內(nèi)容,明白了寄存器是什么,干什么的,終于清晰了!
1、寄存器
CPU由運算器、控制器、寄存器等器件構(gòu)成,這些器件靠片內(nèi)總線相連。
- 運算器進行信息處理;
- 控制器控制各種器件進行工作;
- 寄存器進行信息存儲;
8086CPU有14個寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW都是16位。寄存器是什么:寄存器是暫存指令、數(shù)據(jù)和地址的一種部件,是程序員可以改變其中內(nèi)容來控制CPU的部件。
通俗易懂理解:
寄存器就是你的口袋。身上只有那么幾個,只裝最常用或者馬上要用的東西。
內(nèi)存就是你的背包。有時候拿點什么放到口袋里,有時候從口袋里拿出點東西放在背包里。
2、通用寄存器
通用寄存器:通常用來存放一般性的數(shù)據(jù),有AX、BX、CX、DX,它們可分為兩個可獨立使用的8位寄存器。
由于8086CPU上一代的寄存器是8位的,為了保持向下兼容,這里16位的寄存器可以拆開成兩個8位寄存器使用,如下圖所示。
在進行數(shù)據(jù)傳送或運算時,要注意指令的兩個操作對象的位數(shù)應(yīng)當是一致的。
就是如下所示:
3、簡單的幾條匯編指令

- mov 指令就是類似于C語言中的賦值的概念
- add指令就是加法運算
- 運算都是從右往左運算的
- 匯編指令助記符是不區(qū)分大小寫的
- 在運算中要注意儲存的范圍大小,計算的結(jié)果如果超出了,保留的是沒有超出的部分。
4、物理地址
概念:所有的內(nèi)存單元構(gòu)成的存儲空間是一個一維的線性空間,每一個內(nèi)存單元在這個空間中都有唯一的地址,我們將這個唯一的地址稱為物理地址。就是類似門牌號,編號。
8086CPU給出物理地址的方法
背景:8086CPU有20位地址總線,可以傳送20位地址,達到 1MB尋址能力。但是8086CPU又是16位結(jié)構(gòu),在內(nèi)部一次性處理、傳輸、暫時存儲的地址為16位,內(nèi)部是不能直接傳輸20位的地址信息的。
故8086CPU采用一種在內(nèi)部用兩個16位地址合成的方法來形成一個20位的物理地址。
內(nèi)部邏輯如下圖:
如圖2.6所示,當8086CPU要讀寫內(nèi)存時:
(1) CPU中的相關(guān)部件提供兩個16位的地址,一個稱為段地址,另一個稱為偏移地址:(2)段地址和偏移地址通過內(nèi)部總線送入一個稱為地址加法器的部件;
(3)地址加法器將兩個16位地址合成為一個20位的物理地址;
(4)地址加法器通過內(nèi)部總線將20位物理地址送入輸入輸出控制電路;(5)輸入輸出控制電路將20位物理地址送上地址總線;
(6)20位物理地址被地址總線傳送到存儲器。
記住公式:物理地址=段地址x16+偏移地址
提供地址方法的本質(zhì)
“段地址x16+偏移地址=物理地址”的本質(zhì)含義是:CPU在訪問內(nèi)存時,用一個基礎(chǔ)地址(段地址x16)和一個相對于基礎(chǔ)地址的偏移地址相加,給出內(nèi)存單元的物理地址。
更一般地說,8086CPU的這種尋址功能是“基礎(chǔ)地址+偏移地址=物理地址”尋址模式的一種具體實現(xiàn)方案。8086CPU中,段地址x16可看作是基礎(chǔ)地址。
最終也就是:物理地址 = 基礎(chǔ)地址 + 偏移地址
5、段寄存器
我們可以將一段內(nèi)存定義為一個段,用一個段地址指示段,用偏移地址訪問段內(nèi)的單元,可以用分段的方式來管理內(nèi)存。段寄存器是用來提供內(nèi)存單元的端地址的。
內(nèi)存并沒有分段,段的劃分來自于CPU,由于8086CPU用“基礎(chǔ)地址(段地址x16)+偏移地址=物理地址”的方式給出內(nèi)存單元的物理地址,使得我們可以用分段的方式來管理內(nèi)存。
- 用一個段存放數(shù)據(jù),將它定義為“數(shù)據(jù)段”;
- 用一個段存放代碼,將它定義為“代碼段”;
- 用一個段當作棧,將它定義為“棧段”。
注意:
一個段的起始地址一定是16的倍數(shù);
偏移地址為16位,變化范圍為0-FFFFH,所以一個段的長度最大為64KB。
CPU可以用不同的段地址和偏移地址形成同一個物理地址。
段寄存器:8086CPU有4個段寄存器:CS、DS、SS、ES,提供內(nèi)存單元的段地址。
CS和IP
CS為代碼段寄存器,IP為指令指針寄存器,
CPU將CS、IP中的內(nèi)容當作指令的段地址和偏移地址,用它們合成指令的物理地址,
CPU將CS:IP指向的內(nèi)容當作指令執(zhí)行。(即PC)
看明白下面例子即可理解:
工作原理簡述:
(1) 從CS:IP指向的內(nèi)存單元讀取指令,讀取的指令進入指令緩沖器;
(2)IP-IP+所讀取指令的長度,從而指向下一條指令;
(3)執(zhí)行指令。轉(zhuǎn)到步驟(1),重復(fù)這個過程。
在8086CPU .加電啟動或復(fù)位后(即CPU 剛開始工作時)CS和IP被設(shè)置為CS=FFFFH,IP=0000H,即在8086PC機剛啟動時,CPU 從內(nèi)存FFFFOH單元中讀取指令執(zhí)行,F(xiàn)FFFOH單元中的指令是8086PC機開機后執(zhí)行的第一條指令。
8086CPU提供轉(zhuǎn)移指令修改CS、IP的內(nèi)容。(記住例子即可)
同時修改CS:IP
jmp 段地址:偏移地址:用指令中給出的段地址修改CS,偏移地址修改IP。
只修改其中的IP
jmp 某一合法寄存器:僅修改IP的內(nèi)容。
- 不支持單獨修改CS
8086CPU不支持將數(shù)據(jù)直接送入段寄存器的操作,這屬于8086CPU硬件設(shè)計。
參考資料 王爽《匯編語言第三版》,小甲魚視頻,博客分享
歡迎關(guān)注本人微信公眾號:那個混子
記錄自己學(xué)習(xí)的過程,分享樂趣、技術(shù)、想法、感悟、情感!





