1、一個典型的CPU由運算器、控制器、寄存器等器件組成,這些器件靠內(nèi)部總線相連。
區(qū)別:
內(nèi)部總線實現(xiàn)CPU內(nèi)部各個器件之間的聯(lián)系。
外部總線實現(xiàn)CPU和主板上其它器件的聯(lián)系。
8086CPU有14個寄存器 它們的名稱為:
AX、BX、CX、DX、SI、DI、SP、BP、
IP、CS、SS、DS、ES、PSW。
8086CPU所有的寄存器都是16位的,可以存放兩個字節(jié),一個字節(jié)8位。
AX、BX、CX、DX 通常用來存放一般性數(shù)據(jù)被稱為通用寄存器。
一個16位寄存器所能存儲的數(shù)據(jù)的最大值為多少?
因為每一位存放的數(shù)據(jù)是0或1,那么最大的數(shù)值自然就是 1111 1111 1111 1111(2),也就是2^16-1。
2、通用寄存器(重點)
8086上一代CPU中的寄存器都是8位的,為保證兼容性,
這四個寄存器都可以分為兩個獨立的8位寄存器使用。
AX可以分為AH和AL;
BX可以分為BH和BL;
CX可以分為CH和CL;
DX可以分為DH和DL。
AX的低8位(0位~7位)構(gòu)成了AL寄存器,高8位(8位~15位)構(gòu)成了AH寄存器。
AH和AL寄存器是可以獨立使用的8位寄存器,如果當成是8位寄存器使用,那么他們就是獨立的,沒有任何關(guān)系。
一個8位寄存器所能存儲的數(shù)據(jù)的最大值是多少?二進制數(shù)值 1111 1111 ,也就是 2^8-1。
3、字在寄存器中的存儲
注意:在進行數(shù)據(jù)傳送或運算時,要注意指令的操作數(shù)的位數(shù)要匹配。
4、物理地址的表示(重點)
CPU訪問內(nèi)存單元時要給出內(nèi)存單元的地址,所有的內(nèi)存單元構(gòu)成的存儲空間是一個一維的線性空間。
我們將這個唯一的地址稱為物理地址。
不同的CPU有不同的形成物理地址的方式。
(1)16位結(jié)構(gòu)的CPU
8086內(nèi)部為16位結(jié)構(gòu),它只能傳送16位的地址,表現(xiàn)出的尋址能力卻只有64K。
8086外部有20位地址總線,可傳送20位地址,尋址能力為1M。
那么,8086CPU如何用內(nèi)部16位的數(shù)據(jù),轉(zhuǎn)換成20位的地址呢?
8086CPU采用一種在內(nèi)部用兩個16位地址合成的方法來形成一個20位的物理地址。
段地址+偏移地址 -> 地址加法器 -> 20位的物理地址。
地址加法器合成物理地址的方法:段地址×16+偏移地址=物理地址。
“段地址×16”有一個更為常用的說法就是數(shù)據(jù)左移4位。(二進制位)
二進制的數(shù)據(jù)左移4位,意味著乘以2^4=16。
這樣做的目的主要是為了彌補內(nèi)部總線16位的缺陷而設(shè)計的。
5、關(guān)于段空間
內(nèi)存沒有分段,段的劃分來自于CPU,
由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式給出內(nèi)存單元的物理地址,
使得我們可以用分段的方式來管理內(nèi)存。
以后,在編程時可以根據(jù)需要,將若干地址連續(xù)的內(nèi)存單元看作一個段,
用段地址×16定位段的起始地址(基礎(chǔ)地址),用偏移地址定位段中的內(nèi)存單元。
(1)段地址×16 必然是 16的倍數(shù),所以一個段的起始地址也一定是16的倍數(shù);
(2)偏移地址為16位,16 位地址的尋址能力為 64K,所以一個段的長度最大為64K。
CPU可以用不同的段地址和偏移地址形成同一個物理地址。
如果給定一個段地址,僅通過變化偏移地址來進行尋址,最多可以定位多少內(nèi)存單元?
因為偏移地址16位,變化范圍為0~FFFFH,僅用偏移地址來尋址最多可尋64K個內(nèi)存單元。
比如:給定段地址1000H,用偏移地址尋址,CPU的尋址范圍為:10000H~1FFFFH。
6、地址的描述
在8086PC機中,存儲單元的地址用兩個元素來描述。即段地址和偏移地址。
“數(shù)據(jù)在21F60H內(nèi)存單元中。”對于8086PC機的兩種描述:
(a)數(shù)據(jù)存在內(nèi)存2000:1F60單元中;
(b)數(shù)據(jù)存在內(nèi)存的2000段中的1F60H單元中。
可根據(jù)需要,將地址連續(xù)、起始地址為16的倍數(shù)的一組內(nèi)存單元定義為一個段。
7、段寄存器就是提供段地址的。
8086CPU有4個段寄存器: CS、DS、SS、ES。
CS和IP是8086CPU中最關(guān)鍵的寄存器,它們指示了CPU當前要讀取指令的地址。
CS為代碼段寄存器,IP為指令指針寄存器。
在 8086CPU 加電啟動或復(fù)位后( 即 CPU剛開始工作時)CS和IP被設(shè)置為CS=FFFFH,IP=0000H。
即在8086PC機剛啟動時,CPU從內(nèi)存FFFF0H單元中讀取指令執(zhí)行。
FFFF0H單元中的指令是8086PC機開機后執(zhí)行的第一條指令。
8、修改CS,IP
mov指令不能用于設(shè)置CS、IP的值,8086CPU沒有提供這樣的功能。
8086CPU為CS、IP提供了另外的指令來改變它們的值:轉(zhuǎn)移指令
JMP 段地址:偏移地址
JMP 2AE3:3
功能:用指令中給出的段地址修改CS,偏移地址修改IP。CS = 2AE3H, IP = 0003H。
僅修改IP的內(nèi)容:
jmp 某一合法寄存器
jmp ax (類似于 mov IP,ax)
功能:用寄存器中的值修改IP。
8086機中,任意時刻,CPU將CS:IP指向的內(nèi)容當作指令執(zhí)行。
9、關(guān)于debug指令(Win7沒有這個指令,XP才有)
R命令查看、改變CPU寄存器的內(nèi)容;
D命令查看內(nèi)存中的內(nèi)容;
E命令改寫內(nèi)存中的內(nèi)容;
U命令將內(nèi)存中的機器指令翻譯成匯編指令;
T命令執(zhí)行一條機器指令;
A命令以匯編指令的格式在內(nèi)存中寫入一條機器指令。