混子匯編語言學(xué)習(xí)之02筆記

第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ù)、想法、感悟、情感!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容