CPU結構:
一典型的CPU主要有寄存器、運算器、控制器等器件構成,它們通過內部總線相連,進行數據傳輸。第一章中的總線相應為(CPU的)外部總線。
- 寄存器進行信息存儲;
- 運算器進行信息處理;
- 控制器控制各種器件進行工作。
8086是16位結構的CPU,這說明:
- 寄存器的最大寬度為16位;
- 運算器一次最多可以處理16位的數據;
- 運算器和寄存器之間的通路為16位。
也就是說,16位結構CPU意味着,在8086CPU內部,能夠一次性處理、傳輸、暫時存儲的信息的最大長度為16位。
通用寄存器:
用於存放一般性的數據的寄存器,稱為通用寄存器。8086CPU所有的寄存器都是16位的,可以存放兩個字節,一個字。包含AX、BX、CX、DX,四個通用寄存器。
一個16位寄存器可以分為兩個8位寄存器,AX可以分為AH(8-15)和AL(0-7)。
需要注意以下兩點:
- 單純賦值給AL時,如果產生溢出,並不會向AH進位,而是進位直接消失。
- 8086采用的是小端法,一個完整的存儲地址中,低位在小地址,高位在大地址。(兩位為一個相對整體)
幾條匯編指令:
首先匯編指令和寄存器名稱均不區分大小寫,mov 和 MOV,AX和ax 均等價
- mov ax,bx AX=BX
- add ax,bx AX=AX+BX
- sub ax,bx AX=AX-BX
寫匯編指令時,要注意指令的兩個操作對象位數必須一致
比如,mov ax,bx mov al,bh mov ah,bh mov al,9H都是正確的
而, mov ax,bl mov bh,ax mov al,100H都是錯誤的
8086CPU給出物理地址的方法:
我們在第一章中知道,地址總線的寬度為20位,但是8086CPU內部一次只能傳送16位的數據,那么CPU內外如何交互地址呢?
8086CPU在內部用兩個16位地址合成,經過地址加法器產生一個20位的地址,再通過地址總線與存儲單元進行交互。
這兩個16位地址分別為段地址(SA)和偏移地址(EA),物理地址 = 段地址 * 16 + 偏移地址 其中,段地址*16 也稱為基礎地址
或許有一個不太恰當的比喻。在書店,書被分成許多類,有文學類、工學類、理學類、農學類等等,每一個大類之中有許多本書,每一本書有自己獨特的編號。
那么這個段地址 *16之后便代表某一類某一類書籍,然后再根據偏移地址,找到具體的哪一本書。
使用段地址 * 16可以確定一個起始地址,很顯然這個起始地址一定是16的倍數,用十六進制表示就是最后一位一定是0。當段地址固定時,16位的偏移地址的尋址能力為64KB,所以一個段的最大長度為64KB。
對於同一個地址,可以使用不同的段地址和偏移地址來描述。例如:
- 21F60H = 2000H 1F60H
- 21F60H = 2100H 0F60H
21F60H內存單元的一種表示為 2000:1F60 (段地址:偏移地址)
段寄存器:
存儲段地址的寄存器稱為段寄存器,8086CPU包括4個段寄存器,CS、DS、SS、ES
CS和IP:
CS(Code Segment)代碼段寄存器,IP(Instruct Pointer)指令指針寄存器,CS存儲代碼段地址,IP存儲偏移地址。任意時刻,CPU將CS:IP指向的內容當作指令執行。
指令實現過程:
- 從CS:IP指向的內存單元讀取指令,讀取的指令進入指令緩沖器
- IP=IP+所讀取指令的長度,從而指向下一條指令
- 執行指令,跳轉到1,重復這個過程
8086CPU不允許像通用寄存器一樣直接修改段寄存器的值,有兩種方法可以修改CS:IP的指令
第一種jmp轉移指令:
- 同時修改CS和IP,例如jmp 2AE3:3,執行后:CS = 2AE3H,IP=0003H jmp 段地址:偏移地址 == mov CS 段地址;mov IP 偏移地址;
- 僅修改IP, 執行前ax=1000H,jmp ax,執行后:IP=1000H jmp ax(合法寄存器) == mov IP ax
第二章debug修改指令:
詳見Debug專題