第二章暫存器知識總結
一、什麼是暫存器:
(1)暫存器是cpu的主要部件,是程式設計師可以用指令讀寫的部件。
(2)8086cpu有14個暫存器:AX,BX,CX,DX(通用暫存器)SI,DI,SP,BP(基址和變址暫存器)IP,(指令指標和標誌暫存器)CS,SS,ES,DS(段暫存器)
(3)通用暫存器:AX,BX,CX,DX。這4個暫存器可以分為兩個可獨立使用的8位暫存器(最大可以存放值為255的資料)來使用。其中0~7位為低位位元組(L),8~15位為高位位元組(H)。 一般用16進位制來表示一個數據。⚠️(為了區分二進位制,十進位制,十六進位制。二進位制表示的資料後面加B,十進位制表示的資料後面什麼都不加,十六進位制表示的資料後面加H。)
二、字在暫存器中的儲存:8086cpu可以一次性處理位元組和字兩種尺寸的資料
(1)位元組:記憶體劃分的基本單位:由8個bit位組成,可以放在8位暫存器中。
(2)字:由兩個位元組組成,可以放在16位暫存器中。
(3)雙字:四個位元組。
(4)四字:八個位元組。
三、幾條彙編指令:
1.mov(MOV):
2.add(ADD):
注意⚠️: 1.進位導致的最高位的丟失。(這裡的丟失不是cpu真的丟棄這個進位制)
2.低位與高位暫存器是兩個不同的暫存器,相互是獨立的。
3.在進行資料傳送或運算時要注意指令的兩個操作物件的位數是一致的。
四、8086cpu給出實體地址(所有記憶體單元構成的儲存空間是一個一維的線性空間,每一個記憶體單元在這個空間都有唯一的地址)的方法:
8086cpu有20位地址匯流排,但其又是16位結構。所以解決方案:實體地址=段地址*16+偏移地址。
段地址*16:左移4位(2進位制)。
原理:一個數據的二進位制形式左移n位相當於該資料乘以2的n次方。
一個x進位制的資料左移1位相當於乘以x。
本質含義:cpu訪問記憶體時,用一個基礎地址(段地址*16)和一個相對於基礎地址的偏移地址相加,給出記憶體單元的實體地址。
段的概念:記憶體並沒有分段,段的劃分來自於cpu,段的劃分是靈活的。
將若干地址連續的記憶體單元看成一個段。
注意⚠️:
1.段地址*16必然是16的倍數,所以一個段的起始地址也一定是16的倍數。
2.一個段的長度最大為64KB。(2的16次方)
五、cs和ip
cs:程式碼段暫存器(段地址)
ip:指令指標暫存器(偏移地址)
cs:ip:指令的實體地址=cs*16+ip
六、計算器工作過程:
第1步: CPU基於CS:IP,計算出實體地址,然後到相應的記憶體單元讀取指令,送到指令緩衝區。
第2步: CPU自動修改IP的值,IP = IP + 所讀取指令的長度,從而為下一條指令讀取做準備;
第3步: 執行指令。 轉第1步,重複此過程。
注意事項⚠️:(1) CPU從何處執行指令是由CS和IP中的內容決定的。
(2) 程式設計師可以通過改變CS、IP中的內容來控制CPU執行目標指令。
(3) IP和CS值的修改不能通過mov指令實現,需藉助轉移指令(如jmp, call等)。
jump:
1.同時修改CS、IP的內容:jmp 段地址: 偏移地址
2.只修改IP的內容:用指令中暫存器的值修改IP。
錯題:
1.intel公司的x86系列和安騰(IA-64)系列cpu,其硬體構架不同,所支援的指令及指令的位元組集編碼也不同。(32位cpu支援的指令集比16位cpu支援的指令集要豐富)
2.不同的cpu廠商在生產cpu是如果遵從相同的ISA,則認為這些cpu在ISA級別上是相容的。