1.cpu的基本結構
cup的結構:
1】運算器 ->信息處理;
2】寄存器 ->信息儲存;
3】控制器 ->控制各類器件工做;
4】內部總線 ->鏈接cup內部各器件;
彙編程序主要和寄存器打交道;
寄存器是cpu中程序員能夠用指令讀寫的部件;能夠經過改變寄存器中的內容來實現對cpu的控制;
不一樣的cpu中寄存器的個數、結構不一樣;
例如:8086cpu中的寄存器有:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW;
2.通用寄存器
在8086cpu中,寄存器都是16位的;
AX、BX、CX、DX這4個寄存器用來存放通常性的數據,被稱爲通用寄存器;
爲了兼容舊的8位cpu程序,能夠將寄存器分紅兩個獨立的8位寄存器來使用;
例如:AX能夠分爲:
AH ->寄存器AX的高8位
AL ->寄存器AX的低8位
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
3.寄存器中的儲存
爲了保證兼容性,8086cpu能夠處理兩種尺寸的數據;
字節byte ->一個字節有8bit,能夠保存在8位寄存器中;
字word ->一個字有兩個字節16bit,這兩個字節分別稱爲這個字的高位字節和低位字節;
4.簡單的彙編指令
mov ->用來賦值
例如:下面的語句表示將18送入寄存器ax;
mov ax,18
add ->加運算
例如:將ax和bx的值相加,並將結果保存在寄存器ax中
add ax,bx
指令空格後面第一個表示存放值的寄存器,第二個表示運算的值;
彙編指令和寄存器名不分大小寫;MOV AX,8 等價於 mov ax,8;
注意事項:
1】 例如: 寄存器al的值爲c5H;
執行指令 add al 93H;
計算的結果爲158H;
但158H在8位寄存器中放不下;
此時al的值爲58H;
由於寄存器ax的低位被當成單獨的寄存器al使用,此時高位ah中不會保存al中存不下的值;
2】進行數據傳送或運算時,指令的兩個操做對象的位數應該一致;
例如:mov ax,bl 是不正確的指令,由於ax是16位寄存器,而bl是8位寄存器;
5.物理地址
每個內存單元都有一個惟一的地址,該地址稱爲物理地址;
cpu經過地址總線送入儲存器的必須是一個內存單元的物理地址;
在cpu向地址總線上發出物理地址以前,必需要在內部造成這個物理地址;
不一樣的cpu造成物理地址的方式可能不一樣;
1)16位cpu
8086cpu是16位cpu;
16位cpu的結構特性:
1】運算器一次最多能夠處理16位的數據;
2】寄存器的最大寬度爲16位;
3】計算器和運算器之間的通路爲16位;
也就是說,8086cpu能一次處理、傳輸、暫時儲存的信息最大長度爲16位;
內存單元的地址在送上地址總線以前,必須在cpu中處理、傳輸、暫時儲存;
2)物理地址造成的方式
以16位的8086cpu爲例;
8086cpu有20位的地址總線,尋址能力有1MB;
而8086cpu是16位的,一次只傳輸16位地址信息;直接使用會形成資源浪費;
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
如上圖所示,8086cpu的物理地址造成方式:
1】物理地址由段地址和偏移地址組成;
2】經過地址加法器,將16位的段地址和偏移地址合成一個20位的物理地址;
3】物理地址經過地址總線傳輸進行尋址;
4】計算公式爲:
物理地址 = 段地址 * 16 + 偏移地址;
5】段地址 * 16 至關於將段地址左移四位;
3)段的概念
cpu自己並不給內存分段;
編程時根據須要,能夠將若干連續的內存看作一個段;
段地址 * 16 來做爲段的起始地址;
偏移地址來定位段中的內存單元;
因爲段地址的起始位置是段地址 * 16 來獲取的,所以段地址的起始位置必然是16的倍數;
偏移地址有16位,也就是是尋址能力爲2的16次方即64kb,所以一個段的最大長度爲64kb;
8086cpu在訪問內存單元時,只在意物理地址,而不在意物理地址是如何組成的;
例如:訪問21F60H的內存單元,可有多種方式;
段地址:2000H + 偏移地址:1F60H;
段地址:2100H + 偏移地址:0F60H;
物理地址的描述方式
好比描述數據在21F60H內存單元中可有兩種表達方式:
1】數據在內存2000:1F60單元中;
2】數據在內存的2000H段中的1F60單元中;
6.段寄存器
段寄存器用來存放段地址;
8086cpu有4個段寄存器:CS、DS、SS、ES;
當8086cpu要訪問內存時,由這4個段寄存器提供段地址;
7.CS和IP
CS和IP是8086cpu中的兩個最關鍵的寄存器,用來指示cpu當前要讀取指令的地址;
cs是段寄存器,ip是指令指針寄存器;
在任意時刻,8086cpu將cs:ip指向的內容當作指令來執行;
例如:cs中的內容爲m,ip中的內容爲n,8086cpu將從內存 m*16+n 單元開始讀取下一條指令;
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
8086cpu的工做過程簡要描述:
1】從cs:ip指向的內存單元讀取指令,讀取的指令進入進入指令緩衝器;
2】ip=ip+所讀取指令長度,從而指向下一條指令;
3】執行指令,重複上述流程;
8086cpu剛啓動或復位時,cs=FFFFH,ip=0000H;
也就是說內存單元FFFF0H處的指令爲開機後執行的第一條執行指令;
數據和指令都是二進制碼,cpu區分兩者的方式爲將cs:ip執向的內容做爲指令;
也就是說執行過的指令都被cs:ip指向過;
1)修改cs、ip的指令
程序經過修改寄存器的值來控制cpu;
cpu從何處執行指令是由cs、ip來決定的;
能夠經過改變cs、ip的值來控制cpu執行目標指令;
8086cpu經過傳送指令mov來改變大多數寄存器的值;
但mov沒法修改cs、ip的值;
修改cs、ip值的指令稱爲轉移指令;
最簡單的轉移指令:jmp;
jmp 段地址:偏移地址 ->用指令中的段地址修改cs,用指令中的偏移地址修改ip;
例如:cpu從2AE33H處讀取指令
jmp 2AE3:3
jmp 某一合法寄存器 ->用寄存器中的值修改ip
例如:將寄存器ax中的值賦給ip
jmp ax
2)代碼段
對於8086cpu,能夠根據須要將一組內存單元定義爲一個段;
段的起始地址位16的倍數,且段的長度最大爲64k;
能夠將長度爲N(N<=64)的一組代碼存放在地址連續且起始地址爲16的倍數的內存單元中,這段內存是用來放代碼的,稱爲代碼段;
例如:
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
上面的指令長度爲10個字節;
能夠存放在123B0H到123B9H的內存單元中;
那麼123B0H到123B9H這段內存就是一個代碼段;
段地址爲123BH,長度爲10個字節;
若是要執行這段指令,必須用cs:ip指向所定義代碼段中第一條指令的首地址;
能夠設定cs=123BH,ip=0000H;