寄存器
一個典型的CPU由運算器、控制器、寄存器等器件組成,這些器件靠內部總線相連。(外部總線是上一篇博客說的內存總線,數據總線,控制總線)
- 內部總線實現CPU內部各個器件之間的聯系。
- 外部總線實現CPU和主板上其它器件的聯系。
CPU中主要的部件是寄存器,寄存器是CPU中我們可以使用指令讀寫的部件(通過改變各種寄存器的內容來實現對CPU的控制)
不同的CPU寄存器的個數也不同,8086CPU有14個寄存器 它們的名稱為:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
1、通用寄存器
a.簡介
8086CPU所有的寄存器都是16位的,可以存放兩個字節。(1Byte=8bit)
AX、BX、CX、DX 通常用來存放一般性數據被稱為通用寄存器。
一個16位寄存器所能存儲的數據的最大值為:216-1。
示例:
數據:20000
二進制表示:0100111000100000
在寄存器AX中的存儲:
四個寄存器都可以分為兩個獨立的8位寄存器使用。
AX可以分為AH和AL;
BX可以分為BH和BL;CX可以分為CH和CL;
DX可以分為DH和DL。
AX的低8位(0位~7位)構成了AL寄存器,高8位(8位~15位)構成了AH寄存器,它們都是可以獨立使用的8位寄存器。一個8位寄存器所能存儲的數據的最大值是28-1。
b.匯編指令
匯編指令不區分大小寫(和mysql一樣大小寫不敏感)
丟失(不進位):丟失指的是進位制不能在 8 位寄存器中保存,但是 CPU 不是並真的不丟棄 這個進位值,這個問題以后再說。
2、物理地址
CPU訪問內存單元時要給出內存單元的地址。所有的內存單元構成的存儲空間是一個一維的線性空間。
每一個內存單元在這個線性空間中都有唯一的地址,這個唯一的地址稱為物理地址。
16位CPU的特征:
- 運算器一次最多可以處理16位的數據。
- 寄存器的最大寬度為16位。
- 寄存器和運算器之間的通路是16位的
因為8086CPU是16位的,所以它采用了一個機智的方法(地址加法器):在內部用兩個16位地址合成的方法來形成一個20位的物理地址。
小Tips:更多猛擊這里
CPU最大能查找多大范圍的地址叫做尋址能力 ,CPU的尋址能力以字節為單位 ,如32位尋址 的CPU可以尋址2的32次方大小的地址也就是4G,這也是為什么32位的CPU最大能搭配4G內 存的原因 ,再多的話CPU就找不到了。 16位寄存器,用二進制表示最小的數是0000000000000000,最大的數是1111111111111111。 換算成十進制數就是0-65535,加上零就是65536(2^16)。 也就是說一共可以存放65536個不同的地址。 每一個地址在內存中占一個字節(Byte)。 64KB = 65536byte,so 16位結構,表現出的尋址能力是64K。 20位的尋址能力:2^20/1024/1024 = 1MB 地址總線:屬於一種電腦總線 (一部份),是CPU用來溝通某些單元想要存取(讀取/寫入)電腦內存元件/地方的實體位址。更多去看上一篇博客
地址加法器合成物理地址的方法:物理地址=段地址×16+偏移地址
一個16進制的數*16(向左移1位) ==> 一個二進制(向左移4位)
舉例說明物理地址=段地址×16+偏移地址
8086CPU就是這樣一個只能提供兩張3位數據紙條的CPU。
比如我們只能通過紙條來通信,讀者問我圖書館的地址,我只能將它寫在紙上告訴讀者。
顯然我必須有一張可以容納 4 位數據的紙條才能寫下2826這個數據:
不巧的是,沒有能容納4位數據的紙條,僅有兩張可以容納3位數據的紙條。
這樣我只能以這種方式告訴讀者2826這個數據:
給它兩張紙條,讓他把第一張紙條乘以10再加上第二張紙條的值就是我們要給它的物理地址(當然我們的是16進制的)
-
段地址
在編程時我們可以根據需要,將若干地址連續的內存單元看作一個段,用段地址×16定位段的起始地址(基礎地址),用偏移地址定位相應段中的內存單元。
小結:
1、CPU訪問內存單元時,必須向內存提供內存單元的物理地址。
8086CPU在內部用段地址和偏移地址移位相加的方法形成最終的物理地址
(1)段地址×16 必然是 16的倍數,所以一個段的起始地址也一定是16的倍數;
(2)偏移地址為16位,16 位地址的尋址能力為 64K,所以一個段的長度最大為64K。也就是說如果偏移地址都是最大64K,那么有16個段(因為20位的尋址能力為1MB)
2、CPU可以用不同的段地址和偏移地址形成同一個物理地址。
3、給定一個段地址,僅通過變化偏移地址來進行尋址,最多可以定位多少內存單元?
結論:偏移地址16位,變化范圍為0~FFFFH,僅用偏移地址來尋址最多可尋64K個內存單元。
比如:給定段地址1000H,用偏移地址尋址,CPU的尋址范圍為:10000H~1FFFFH。
4、在8086PC機中,存儲單元的地址用兩個元素來描述。即段地址和偏移地址。
“數據在21F60H內存單元中。”對於8086PC機的兩種描述:
(a)數據存在內存2000:1F60單元中;
(b)數據存在內存的2000段中的1F60H單元中。
可根據需要,將地址連續、起始地址為16的倍數的一組內存單元定義為一個段。
答案
1、給定段地址為0001H,僅通過變化偏移地址尋址,CPU的尋址范圍是0010H到1000FH 2、有一個數據存放在內存20000H單元中,現給定段地址為SA,若想用偏位地址尋到此單元,則SA應滿足,最小為1001H,最大為2000H 解:物理地址=段地址*16+偏移地址 20000H=SA*16+偏移地址 由於16為十進制,轉換為十六進制=10H 最小偏移地址=0H 最大偏移地址=FFFFH 最小SA=(20000H-FFFFH)/10H=20000H/10H-FFFFH/10H=2000H-FFFH=1001H 最大SA=(20000H-0H)/10H=20000H/10H-0H/10H=2000H-0H=2000H 3、當sa<1001H 或者sa>2000H 將無法尋到20000H單元
3、段寄存器
段寄存器就是提供段地址的
8086CPU有4個段寄存器:
- CS(代碼段)
- DS(數據段)
- SS(堆棧段)
- ES(附加段)
當8086CPU要訪問內存時,由這4個段寄存器提供內存單元的段地址。
CS和IP是8086CPU中最關鍵的寄存器,它們指示了CPU當前要讀取指令的地址(其他的段+指針寄存器以后再說,)。
- CS為代碼段寄存器;
- IP為指令指針寄存器
8086PC的工作過程
(1)從CS:IP指向內存單元讀取指令,讀取的指令進入指令緩沖器;
(2)IP = IP + 所讀取指令的長度,從而指向下一條指令;
(3)執行指令。 轉到步驟 (1),重復這個過程。
在 8086CPU 加電啟動或復位后( 即 CPU剛開始工作時)CS和IP被設置為CS=FFFFH,IP=0000H,即在8086PC機剛啟動時,
CPU從內存FFFF0H單元中讀取指令執行,FFFF0H單元中的指令是8086PC機開機后執行的第一條指令。
CS和IP:
CPU將CS、IP中的內容當作指令的段地址和偏移地址,用它們合成指令的物理地址,到內存中讀取指令碼,執行。
如果說,內存中的一段信息曾被CPU執行過的話,那么,它所在的內存單元必然被CS:IP指向過。
修改CP和IP的指令:
在CPU中,我們能夠用指令讀寫的部件只有寄存器,我們可以通過改變寄存器中的內容實現對CPU的控制。
CPU從何處執行指令是由CS、IP中的內容決定的,程序員可以通過改變CS、IP中的內容來控制CPU執行目標指令。
那么問題來了,我們要怎樣修改CS和IP的值呢?
首先我們來思考一下,如何修改AX中的值?
mov 指令
如:mov ax,123
mov指令可以改變8086CPU大部分寄存器的值,被稱為傳送指令。
但mov指令不能改變CS、IP的值,CPU為我們提供了另外一個指令:jmp(轉移指令)
使用方法:
# 同時修改CS和IP的值 # 使用方法:jmp 段地址:偏移地址 # 功能:用指令中給出的段地址修改CS,偏移地址修改IP。 jmp 2AE3:3 # CS的地址-->3ae3 , 偏移地址 --> 0003 jmp 3:0B16 # CS的地址-->0003 , 偏移地址 --> 0b16 # 僅修改IP的內容: # jmp 某一合法寄存器 # 功能:用寄存器中的值修改IP。 jmp ax (類似於 mov IP,ax) # 修改IP的值為寄存器中的值 jmp bx
內存中存放的機器碼和對應匯編指令情況: (初始:CS=2000H,IP=0000H),寫出執行順序。
答案:
(1)mov ax,6622 (2)jmp 1000:3 (3)mov ax,0000 (4)mov bx,ax (5)jmp bx (6)mov ax,0123H (7)轉到第(3)步執行
小結:
1、段地址在8086CPU的寄存器中存放。當8086CPU要訪問內存時,由段寄存器提供內存單元的段地址。8086CPU有4個段寄存器,其中CS用來存放指令的段地址。
2、CS存放指令的段地址,IP存放指令的偏移地址。
8086機中,任意時刻,CPU將CS:IP指向的內容當作指令執行。
3、8086CPU的工作過程:
- 從CS:IP指向內存單元讀取指令,讀取的指令進入指令緩沖器;
- IP指向下一條指令;
- 執行指令。(轉到步驟(1),重復這個過程。)
4、8086CPU提供轉移指令(jmp)修改CS、IP的內容。
答案:
下面3條指令執行后,CPU幾次修改IP?都是在什么時候?最后IP中的值是多少?
mov ax,bx sub ax,ax jmp ax 首先根據 代碼 我們可以看到 mov ax,bx 我們將bx的值存入ax中,暫且不管bx的值為多少我們就認為bx中有一個數據 sub ax,ax 然后我們重新給ax賦值 ax = ax - ax ,所有ax的值應該為 0 jmp ax 當jmp指令,指向的是一個通用寄存器ax,代表的意思為修改 IP 的值 IP的值為ax 即 IP 的值應為0 所以CPU只修改了1次IP 執行到 jmp ax 時 修改了 IP中的值 為 0