第2章 寄存器(CPU工作原理)
2.1 通用寄存器
8086CPU的所有寄存器都是16位,可以存放兩個位元組。AX、BX、CX、DX四個寄存器通常用來存放一般性的資料,被稱為通用寄存器。
一個16位寄存器可以儲存一個16位的資料。
那麼一個16位寄存器所能儲存的資料的最大值為多少呢?
8086CPU的上一代CPU中的寄存器都是8位的,為了保證相容,使原來基於上代CPU編寫的程式稍加修改就可以運行在8086之上,8086CPU的AX、BX、CX、DX四個寄存器都可分為兩個可獨立使用的8位寄存器來使用:
AX可分為AH和AL;
BX可分為BH和BL;
CX可分為CH和CL;
DX可分為DH和DL;
2.3 彙編指令
彙編指令舉例:
mov ax,18 將18送入寄存器AX AX=18
mov ah,78 將78送入積存器AH AH=78
add ax,8 將寄存器AX中的數值加上8 AX=AX+8
mov ax,bx 將寄存器BX中的資料送入寄存器AX AX=BX
add ax,bx 將AX和BX中的數值相加,結果存在AX中 AX=AX+BX
在寫一條彙編指令或一個寄存器的名稱時不區分大小寫,如:mov ax,18和MOV AX,18的含義相同;bx和BX的含義相同。
注意:如果單獨把AH和AL做為兩個獨立的8位寄存器來用,那麼它們兩個就是兩個不相關的寄存器,不要錯誤的認為,諸如add al,93H的指令產生的進位會儲存在ah中,add al,93H進行的是8位元運算。
如果執行add ax,93H,低8位的進位會儲存在ah中,CPU在執行這條指令時認為只有一個16位寄存器ax,進行的16位元運算。指令add ax,93H執行後,ax中的值為:0158H。此時,使用的寄存器是16位寄存器ax,add ax,93H相當於將ax中的16位元據00c5H和另一個16位元據009CH相加,結果是16位的0158H。
在進行資料傳送或運算時,要注意指令的兩個操作對象的位元應當是一致的,例如:
mov ax,bx
mov bx,cx
mov ax,18H
mov al,18H
add ax,bx
add ax,20000
等都是正確的指令,而
mov ax,bl (在8位寄存器和16位寄存器之間傳送資料)
mov bh,ax (在16位寄存器和8位寄存器之間傳送資料)
mov al,20000 (8位寄存器最大可存放值為255的資料)
add al,100H (將一個高於8位的資料加到一個8位寄存器中)
等都是錯誤的指令,錯誤的原因都是指令的兩個操作對象的位元不一致。
在8086CPU加電啟動或複位後(即CPU剛開始工作時)CS和IP被設定為CS=F000H,IP=FFFFH,即在8086PC機剛啟動時,CPU從記憶體FFFF0H單元中讀取指令執行,FFFFOH單元中的指令是8086PC機開機後執行的第一條指令。
現在,我們更清楚了CS和IP的重要性,它們的內容提供了CPU要執行指令的地址。
mov指令不能用於設定CS、IP的值,原因很簡單,因為8086CPU沒有提供這樣的功能。8086CPU為CS、IP提供了另外的指令來改變它們的值。能夠改變CS、IP的內容的指令被統稱為轉移指令。
我們現在介紹一個最簡單的可以修改CS、IP的指令:jmp指令。
若想同時修改CS、IP的內容,可用指令“jmp 段地址: 位移地址”完成,如:
jmp 2AE3:3,執行後:CS=2AE3H,IP=0003H,CPU將從2AE33H處讀取指令。
jmp 3:0B16,執行後:CS=0003H,IP=0B16H,CPU將從00B46H處讀取指令。
若想僅修改IP的內容,可用指令“jmp 某一合法寄存器”完成,如:
jmp ax,指令執行前:ax=1000H,CS=2000H,IP=0003H
指令執行後:ax=1000H,CS=2000H,IP=1000H
指令“jmp 某一合法寄存器”的功能為:用寄存器中的值修改IP。
jmp ax,在含義上類似於mov IP,ax這樣的指令。
CPU只認被CS:IP指向的記憶體單元中的內容為指令,所以,要讓CPU執行我們放在程式碼片段中的指令,必須要將CS:IP指向所定義的程式碼片段中的第一條指令的首地址。
對於上面的例子,我們將一段代碼存放在123BOH-123BAH記憶體單元中,將其定義為程式碼片段,如果要讓這段代碼得到執行,可設CS=123BH,IP=0000H。
段地址在8086CPU的段寄存器中存放。當8086CPU要訪問地址時,由段寄存器提供記憶體單元的段地址。8086CPU有4個段寄存器,其中CS用來存放指令的段地址。
CS存放指令的段地址,IP存放指令的位移地址。
8086機中,任意時刻,CPU將CS:IP指向的內容當作指令執行。
8086CPU的工作過程:
1:從CS:IP指向記憶體單元讀取指令,讀取的指令進入指令緩衝器;
2:IP指向下一條指令;
3:執行指令。(轉到步驟1,重複這個過程。)
查看CPU和記憶體,用機器指令和彙編指令編程
1:預備知識:Debug的使用
(1)什麼是Debug?
Debug是DOS,Windows都提供的實模式(8086方式)程式的調試工具,使用它,可以查看 CPU各種寄存器中的內容、記憶體的情況和在機器碼層級跟蹤程式的運行。
(2)我們用到的Debug功能
用Debug的R命令查看、改變CPU寄存器的內容;
用Debug的D命令查看記憶體中的內容;
用Debug的E命令改寫記憶體中的內容;
用Debug的U命令將內容中的機器指令翻譯成彙編指令;
用Debug的T命令執行一條機器指令;
用Debug的A命令以彙編指令的格式在記憶體中寫入一條機器指令;
(3)進入Debug
Debug是在DOS方式下使用的程式。我們進入Debug前,應先進入到DOS方式,用以下方式可 以進入DOS:
1:重新啟動電腦,進入DOS方式,此時進入的是實模式的DOS;
2:在Windows中進入DOS方式,此時進入的是虛擬8086模式的DOS;
下面說明在Windos2000中進入Debug的一種方法,在Windows98中進入的方法與此類似。
開始-運行-輸入command
進入DOS方式後,如果顯示為視窗方式,可以按下Alt+Enter鍵將視窗變成全屏方式,然後 運行Debug程式。
具體使用方法看P46。