在CPU中,程序員能夠用指令讀寫的部件只有寄存器,程序員可以通過改變寄存器中的內容實現對CPU的控制。CPU從何處執行指令是由CS、IP中的內容決定的,程序員可以通過改變CS、IP中的內容來控制CPU執行目標指令。
我們如何改變CS、IP的值呢?顯然,8086CPU必須提供相應的指令。我們如何修改AX中的值?可以用mov指令,如mov ax,123將ax中的值設為123,顯然,我們也可以用同樣的方法設置其他寄存器的值,如mov bx,123,mov cx,123,mov dx,123等。其實,8086CPU大部分寄存器的值,都可以用mov指令來改變,mov指令被稱為傳送指令。
但是,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處讀取指令。
"jmp 段地址:偏移地址"指令的功能為:用指令中給出的段地址修改CS,偏移地址修改IP。
若想僅修改IP的內容,可用形如"jmp 某一合法寄存器"的指令完成,如
jmp ax,指令執行前:ax=1000H,CS=2000H,IP=0003H |
"jmp 某一合法寄存器"指令的功能為:用寄存器中的值修改IP。
jmp ax,在含義上好似:mov IP,ax。
注意,我們在適當的時候,會用已知的匯編指令的語法來描述新學的匯編指令的功能。采用一種"用匯編解釋匯編"的方法來使讀者更好地理解匯編指令的功 能,這樣做有助於讀者進行知識的相互融會。要強調的是,我們是用"已知的匯編指令的語法"進行描述,並不是用"已知的匯編指令"來描述,比如,我們用 mov IP,ax來描述jmp ax,並不是說真有mov IP,ax這樣的指令,而是用mov指令的語法來說明jmp指令的功能。我們可以用同樣的方法描述jmp 3:01B6的功能:jmp 3:01B6 在含義上好似mov CS,3 mov IP,01B6。
內存中存放的機器碼和對應的匯編指令情況如圖2.27所示,設CPU初始狀態:CS=2000H,IP=0000H,請寫出指令執行序列。思考后看分析。
![]() |
圖2.27 內存中存放的機器碼和對應的匯編指令 |
分析:
CPU對圖2.27中的指令的執行過程如下。
(1) 當前CS=2000H,IP=0000H,則CPU從內存2000H×16+0=20000H處讀取指令,讀入的指令是:B8 22 66(mov ax,6622H),讀入后IP=IP+3=0003H;
(2) 指令執行后,CS=2000H,IP=0003H,則CPU從內存2000H×16+0003H =20003H處讀取指令,讀入的指令是:EA 03 00 00 10(jmp 1000:0003),讀入后IP=IP+5=0008H;
(3) 指令執行后,CS=1000H,IP=0003H,則CPU從內存1000H×16+0003H =10003H處讀取指令,讀入的指令是:B8 00 00(mov ax,0000),讀入后IP=IP+3=0006H;
(4) 指令執行后,CS=1000H,IP=0006H,則CPU從內存1000H×16+0006H =10006H處讀取指令,讀入的指令是:8B D8(mov bx,ax),讀入后IP=IP+2=0008H;
(5) 指令執行后,CS=1000H,IP=0008H,則CPU從內存1000H×16+0008H =10008H處讀取指令,讀入的指令是:FF E3(jmp bx),讀入后IP=IP+2=000AH;
(6) 指令執行后,CS=1000H,IP=0000H,CPU從內存10000H處讀取指令……
經分析后,可知指令執行序列為:
(1) mov ax,6622H
(2) jmp 1000:3
(3) mov ax,0000
(4) mov bx,ax
(5) jmp bx
(6) mov ax,0123H
(7) 轉到第3步執行