本文摘自http://blog.csdn.net/lr2131/article/details/6247159,非常感謝博主:從頭再來 的知識分享!(自己做了部分修改)
第二章 寄存器
一、 通用寄存器
1. 8086CPU的所有寄存器都是16位的,可以存放兩個字節。AX、BX、CX、DX這4個寄存器通常用來存放一般性的數據,被稱爲通用寄存器。
2. 爲保證和8086之前的8位CPU兼容,8086CPU的AX、BX、CX、DX這4個寄存器都可分爲兩個可獨立使用的8位寄存器來用(AH、AL,BH、BL,CH、CL,DH、DL)。
二、 字在寄存器中的存儲
1. 一個字是16位,可以存在一個16位寄存器中,這個字的高位字節和低位字節自然就存在這個寄存器的高8位寄存器和低8位寄存器中。
三、 幾條彙編指令
1. 在寫一個彙編指令或一個寄存器的名稱時不區分大小寫。
2. 對8位寄存器(XH、XL)操作時,CPU會把XH和XL作爲獨立的8位寄存器來使用,如果XL寄存器運算溢出時不會將進位寫到XH中,而當在對16位寄存器操作時,低8位數據的進位是會寫到高8位數據中的。
3. 注意指令的兩個操作對象的位數應當是一致的。
舉例:
以上這幾條彙編指令都是錯誤的。
四、 物理地址
1. 所有的內存單元構成的存儲空間是一個一維的線性空間,每一個內存單元在這個空間中都有唯一的地址,我們將這個唯一的地址稱爲物理地址。
2. CPU通過地址總線送入存儲器的,必須是一個內存單元的物理地址。
五、 8086CPU給出物理地址的方法
1. 8086CPU有20位的地址總線,可以傳送20位地址,達到1MB尋址能力。
2. 8086CPU是16位結構,在內部一次性處理、傳輸、暫時存儲的地址爲16位。
3. 8086CPU通過將2個16位地址合成的方法來形成一個20位的物理地址:
物理地址 =段地址 x 16 + 偏移地址 (因爲16即2的4次方,將某數左移4位,即該項數乘以2的4次方)
基地址 =段地址 x 16
六、 段的概念
1. “段地址”包含着段的概念,但內存並不是被劃分成一個一個的段,內存並沒有分段,斷的劃分來自CPU,由於8086CPU用基礎地址(段地址x16)+偏移地址 = 物理地址的方式給出內存單元的物理地址,使得我們可以用分段的方式管理內存。
2. 在編程時可以根據需要,將若干地址連續的內存單元看作一個段,用段地址x16定位段的起始地址(基礎地址),用偏移地址定位段中的內存單元。
3. 段地址x16必然是16的倍數,所以一個段的起始地址也一定是16的倍數,偏移地址爲16位,16位地址的尋址能力爲64KB,所以一個段的長度最大爲64KB。
4. CPU可以用不同的段地址和偏移地址形成同一個物理地址。
5. 由於一個物理地址可以映射多個段地址和偏移地址的組合,所以不應該只給出物理地址,準確的寫法是段地址:偏移地址。
七、 段寄存器
段地址是CPU中的誰提供的呢?
由CPU中的段寄存器提供。
8086CPU有4個段寄存器:CS、DS、ES、SS;
1. 8086CPU在訪問內存時要由相關部件提供內存單元的段地址和偏移地址,送入地址加法器合成物理地址。
2. 8086CPU在訪問內存時,由CS、DS、SS、ES這4個段寄存器提供內存單元的段地址。
八、 CS和IP
1. CS和IP是8086CPU中兩個最關鍵的寄存器,它們指示了CPU當前要讀取指令的地址,即CS:IP
CS中存放段地址,IP中存放偏移地址。
2. CS爲代碼段寄存器,IP爲指令指針寄存器,在任意時刻,CPU將從CS:IP指向的內容開始,讀取一條指令並執行。
注意上圖中的IP值的變化。
結合以上幾幅圖,得到下面的結論:
8086CPU的工作過程簡要的描述爲:
(1) 從CS:IP指向的內存單元讀取指令,讀取的指令進入指令緩衝器;
(2)IP=IP+所讀取指令的長度,從而指向下一條指令;
(3)執行指令,轉到步驟(1),反覆這個過程。(注意(2)和(3)的順序)
3. 在8086CPU上電啓動或復位後,CS=FFFFH,IP=0000H,也即是FFFF0H單元中的指令是8086PC機開機執行的第一條指令。
九、 修改CS、IP的指令
1. 在CPU中,程序員能夠用指令讀寫的部件只有寄存器,程序員可以通過改變寄存器中的內部實現對CPU的控制。
2. CPU從何處執行指令是由CS、IP中的內容決定的,程序員可以通過改變CS、IP中的內容來控制CPU執行目標指令。
3. 8086CPU大部分寄存器的值,都可以用mov指令來改變,但mov指令不能用於設置CS、IP的值,能夠改變CS、IP的內容的指令被統稱爲轉移指令。
4. 最簡單的轉移指令是jmp,形式:jmp段地址:偏移地址。
5. 若想僅修改IP的內容,可用“jmp某一合法寄存器”的指令完成。類似於mov IP,ax。(並不是真正擁有mov IP,ax 這條指令.)
十、 代碼段
1. 在編程時,可以根據需要,將一組內存單元定義爲一個段,我們可以將長度爲N(N<=64KB)的一組代碼,存在一組地址連續、起始地址爲16的倍數的內存單元中,我們可以認爲,這段內存是用來存放代碼的,從而定義了一個代碼段。
2. 要讓CPU執行我們編寫的代碼,就必須要讓CS:IP指向我們的代碼,CPU只會認爲CS:IP指向的內存單元中的內容爲指令,且是要執行的代碼。
十一、 實驗1查看CPU和內存,用機器指令和彙編指令編程
1. Debug是DOS、Windows都提供的實模式(8086方式)程序的調試工具。使用它,可以查看CPU各種寄存器中的內容、內存的情況和在機器碼級跟蹤程序的運行。
2. Debug的功能:
1) R:查看、改變寄存器的內容
2) D:查看內存中的內容
3) E:改寫內存中的內容
4) U:將內存中的機器指令翻譯成彙編指令
5) T:執行一條機器指令
6) A:以彙編指令的格式在內存中寫入一條機器指令
7) Q:退出Debug
3. Debug是在DOS方式下使用的程序,在進入Debug前,應先進入到DOS方式。
4. Debug命令的典型使用範例:
1) –r 查看CPU中各寄存器的值
2) –r ax 在顯示了ax中值後提示用戶輸入要修改的新值
3) –d 列出debug預設的地址處的內容
4) –d 1000:9列出10009H處的連續128字節的內存中的內容(即一直到10088)
5) –”e 起始地址 數據 數據 ……“的格式進行逐個修改內存中的內容
如:e 1000:0 0 1 2 3“a+b” 4 5 6 7 8 9 ‘c’一次性逐個修改內存
6) –u 1000:10 查看彙編指令(即查看寫入的或內存中原有的機器碼所對應的彙編指令)