第六周 程序與處理器控制指令
大家好,又是我,沉迷學(xué)習(xí)無法自拔的小笨蛋康sir。
這個文集(點(diǎn)我)將會同步更新我觀看吳寧老師的《微機(jī)原理與接口技術(shù)》教學(xué)視頻寫的筆記,學(xué)習(xí)筆記,大概每周一章。
有問題大家可以在評論下面留言討論,歡迎糾錯!
歡迎收藏閱讀,動動小手給個硬幣點(diǎn)個贊。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——@正能量的康sir
也可移步我的博客(https://blog.csdn.net/qq_33956508)會更新一些其它技術(shù)類文章。

程序控制類指令的本質(zhì)是:控制程序的執(zhí)行方向
決定程序執(zhí)行方向的因素:CS,IP
修改IP,會使程序改變在當(dāng)前代碼段中的執(zhí)行順序
同時修改CS,IP會使程序走向另一個代碼段執(zhí)行
? ? ? ?

? ? ? ?
程序控制類指令以“隱含”的方式修改CS 和IP,以實(shí)現(xiàn)控制程序走向的目的(Intel指令集不允許由指令直接修改CS 和IP)
通過修改IP或CS和IP,實(shí)現(xiàn)程序的三種基本控制結(jié)構(gòu):順序,選擇(分支),循環(huán)
學(xué)習(xí)程序控制類指令需要重點(diǎn)關(guān)注:如何實(shí)現(xiàn)對CS和IP的修改?
程序控制類指令:
轉(zhuǎn)移指令
循環(huán)控制
過程調(diào)用
中斷控制
第29講 無條件轉(zhuǎn)移指令
轉(zhuǎn)移指令
作用:通過修改指令的偏移地址或段地址及偏移地址實(shí)現(xiàn)程序的轉(zhuǎn)移
分類:
無條件轉(zhuǎn)移指令:無條件轉(zhuǎn)移到目標(biāo)地址
條件轉(zhuǎn)移指令:當(dāng)具備一定條件(通常指狀態(tài)標(biāo)志位)時轉(zhuǎn)移到目標(biāo)地址
無條件轉(zhuǎn)移指令
格式:JMP OPRD
OPRD是目標(biāo)地址??梢耘cJMP在同一代碼段 或 與JMP不在同一代碼段
可以實(shí)現(xiàn)在當(dāng)前代碼段內(nèi)或段間轉(zhuǎn)移
(1)無條件段內(nèi)轉(zhuǎn)移
轉(zhuǎn)移的目標(biāo)地址在當(dāng)前代碼段內(nèi),段地址不改變
目標(biāo)地址是16位偏移地址。
指令中直接給出目標(biāo)地址(段內(nèi)直接轉(zhuǎn)移)
由指令中的寄存器或存儲器操作數(shù)指出目標(biāo)地址(段內(nèi)間接轉(zhuǎn)移)
①段內(nèi)直接轉(zhuǎn)移:轉(zhuǎn)移的目標(biāo)地址由指令直接給出
格式:JMP Label;Label是標(biāo)號,標(biāo)號第四章會講。
Label和JMP之間沒有任何說明,說明這里L(fēng)abel是個近地址標(biāo)號(段內(nèi)地址,說明這是段內(nèi)直接轉(zhuǎn)移)。
下一條要執(zhí)行指令的偏移地址=當(dāng)前IP+位移量
? ? ? ?

? ? ? ?
②段內(nèi)間接轉(zhuǎn)移:轉(zhuǎn)移的目標(biāo)地址存放在某個16位寄存器或存儲器的某兩個單元中
例子:
MOV BX,1200H
JMP BX
執(zhí)行完后IP=1200H
例2:
MOV BX,1200
JMP WORD PTR[BX]
? ? ? ?

? ? ? ?
總之,JMP后面無論什么表現(xiàn)形式,都是轉(zhuǎn)移的目標(biāo)地址
(2)無條件段間轉(zhuǎn)移
轉(zhuǎn)移的目標(biāo)地址不在當(dāng)前代碼段內(nèi)。
目標(biāo)地址為32位,包括段地址和偏移地址。
指令中直接給出目標(biāo)地址(段間直接轉(zhuǎn)移)
由指令中的32位存儲器操作數(shù)指出目標(biāo)地址(段間間接轉(zhuǎn)移)
①段間直接轉(zhuǎn)移:轉(zhuǎn)移的目標(biāo)地址由指令直接給出
JMP FAR Label;FAR說明這里L(fēng)abel是遠(yuǎn)地址標(biāo)號(段外地址)
? ? ? ?

? ? ? ?
②段間間接轉(zhuǎn)移
段間間接尋址:轉(zhuǎn)移的目標(biāo)地址由指令中的32 位操作數(shù)給出 ;32位目標(biāo)地址須存放于內(nèi)存中
例:JMP DWORD PTR[BX];DWORD,double world,說明[BX]是32位存儲器操作數(shù)
? ? ? ?

? ? ? ?
無條件轉(zhuǎn)移指令例
CS: IP
(1) 2000H: 0100H MOV AX,1200H
(2) 2000H: 0103H JMP NEXT
┅
(m) 2000H: 0120H NEXT: MOV BX,1200H
(m+1) JMP BX
┅
(5) 2000H: 1200H
無條件轉(zhuǎn)移指令例2
MOV SI,1122H
MOV WORD PTR[SI],0120H
ADD SI,2
MOV WORD PTR[SI],0122H
JMP WORD PTR[SI];轉(zhuǎn)移1124H,IP=0122H
如果將最后一句換成
JMP DWORD PTR[SI-2];轉(zhuǎn)移到1122H,因?yàn)镈WORD,32位,所以CS=0122H,IP=0120H
? ? ? ?

? ? ? ?
第30講 條件轉(zhuǎn)移指令
在滿足一定條件下,程序轉(zhuǎn)移到目標(biāo)地址繼續(xù)執(zhí)行
條件轉(zhuǎn)移指令均為段內(nèi)短轉(zhuǎn)移,即轉(zhuǎn)移范圍為:-128----- +127
? ? ? ?

? ? ? ?
表中:
除了JCXZ是基于CX的狀態(tài)之外,其他的都是基于一個或兩個標(biāo)志位的狀態(tài)
表中“/”前后的指令含義相同,表示方式不同
基于1個標(biāo)志位狀態(tài)實(shí)現(xiàn)轉(zhuǎn)移的指令(這里“/”前后命令相反)
? JC/JNC:判斷CF的狀態(tài)。常用于兩個無符號數(shù)大小比較
? JZ/JNZ:判斷ZF的狀態(tài)。常用于循環(huán)體的結(jié)束判斷
? JO/JNO:判斷OF的狀態(tài)。常用于有符號數(shù)溢出的判斷
? JP/JPE:判斷PF的狀態(tài)。用于判斷運(yùn)算結(jié)果低8位中1的個數(shù)是否為偶數(shù)
? JS /JNS:判斷SF的狀態(tài)。常用于判斷數(shù)的性質(zhì)
基于2個或3個標(biāo)志位狀態(tài)實(shí)現(xiàn)轉(zhuǎn)移的指令:
? JA/JAE/JB/JBE:判斷CF或CF+ZF的狀態(tài)。常用于無符號數(shù)大小的比較
? JG/JGE/JL/JLE:判斷SF+OF或SF+OF+ZF的狀態(tài)。常用于有符號數(shù)大小的比較
基于CX內(nèi)容轉(zhuǎn)移的指令
? JCXZ:可根據(jù)指令執(zhí)行后CX的結(jié)果實(shí)現(xiàn)轉(zhuǎn)移
轉(zhuǎn)移指令例
統(tǒng)計(jì)內(nèi)存數(shù)據(jù)段中以TABLE為首地址的100個8位帶符號數(shù)中 正數(shù)、負(fù)數(shù)和零元數(shù)的個數(shù)。
基本思路:
可先將存放統(tǒng)計(jì)值的單元(或寄存器)清零
讀取一個數(shù),通過標(biāo)志位的狀態(tài)判斷數(shù)的性質(zhì)
最高位為1,則為負(fù)數(shù)
最高位為0,則為正數(shù)或零
如何既不改變數(shù)本身, 又能影響標(biāo)志位從而 獲得數(shù)的性質(zhì)?(數(shù)和本身按位相與 或者 相或)
? ? ? ?

? ? ? ?
程序代碼
START:XOR AL,AL
MOV PLUS,AL
MOV MINUS,AL
MOV ZERO,AL
LEA SI,TABLE
MOV CL,100
CLD
CHECK:LODSB;(串裝入,將SI的內(nèi)容,寫入AL中,再將SI+1.沒有重復(fù)前綴,所以不會循環(huán))
OR AL,AL
JS X1;SF符號標(biāo)志位 最高位是1(負(fù)數(shù))則跳到X1
JZ X2;ZF零標(biāo)志位 上一步最高位是0留下的數(shù)里,結(jié)果是0的
INC PLUS
JMP NEXT
X1:INC MINUS
JMP NEXT
X2:INC ZERO
NEXT:DEC CL
JNZ CHECK;CL不為零跳轉(zhuǎn)CHECK
HLT
第31講 循環(huán)控制指令
循環(huán)范圍:
? 以當(dāng)前IP為中心的-128~+127范圍內(nèi)循環(huán)。
? 循環(huán)次數(shù)由CX寄存器指定。
? 循環(huán)指令:
無條件循環(huán)指令:LOOP
條件循環(huán)指令:LOOPZ、LOOPNZ
(1)無條件循環(huán)指令
? 格式: LOOP LABEL
? 循環(huán)條件: CX ≠ 0
操作:完全相當(dāng)于
DEC CX
JNZ 符號地址
條件循環(huán)指令
? 功能:先使CX-1,再根據(jù)CX中的值及ZF值來決定是否繼續(xù)循環(huán)
? 格式:
? LOOPZ Label: 繼續(xù)循環(huán)的條件:CX≠0,且ZF=1
? LOOPNZ Label: 繼續(xù)循環(huán)的條件:CX≠0,且ZF=0
例:在以DATA為首地址的內(nèi)存數(shù)據(jù)段中,存放有200個16位有符號數(shù),
試找出其中最大和最小的符號數(shù),并分別放在MAX和MIN為首的內(nèi)存單元中。
? 題目分析:
? 先取數(shù)據(jù)塊中第1個數(shù),將其同時暫存于MAX和MIN中;
? 循環(huán)讀取其它數(shù)并分別與MAX和MIN中的數(shù)進(jìn)行比較
? 若大于則取代原MAX中的數(shù);若小于MIN內(nèi)容,則將新數(shù)放于MIN中。直到結(jié)束。
注:有符號數(shù)比較應(yīng)采用JG和JL等用于符號數(shù)的條件轉(zhuǎn)移指令
START:LEA SI,DATA
MOV CX,200
CLD
LODSW; 讀取SI為首地址的兩個單元內(nèi)容到AX
MOV MAX,AX
MOV MIN,AX
DEC CX
NEXT: LODSW
CMP AX,MAX
JG LARGE;大于轉(zhuǎn)移
CMP AX,MIN
JL SMALL;小于轉(zhuǎn)移
JMP GOON
LARGE:MOV MAX,AX
JMP GOON ;
SMALL:MOV MIN,AX
GOON:LOOP NEXT
HLT
第32講 過程調(diào)用指令
? 過程調(diào)用指令
? 用于調(diào)用一個子過程
? 與轉(zhuǎn)移指令的比較
? 子過程執(zhí)行結(jié)束后要返回原調(diào)用處,必須保護(hù)返回地址
? ? ? ?

? ? ? ?
調(diào)用指令的執(zhí)行過程
① 保護(hù)斷點(diǎn)。將調(diào)用指令的下一條指令的地址(斷點(diǎn))壓入堆棧
② 獲取子過程的入口地址。子過程第1條指令的偏移地址
③ 執(zhí)行子過程。功能實(shí)現(xiàn),參數(shù)的保存及恢復(fù)。(只有這一步是需要程序員做的)
④ 恢復(fù)斷點(diǎn),返回原程序。將斷點(diǎn)偏移地址由堆棧彈出
斷點(diǎn)保護(hù)和恢復(fù)由系統(tǒng)自動完成,但會影響堆棧的頂棧指針。
過程調(diào)用:
段內(nèi)調(diào)用
段內(nèi)直接調(diào)用
段內(nèi)間接調(diào)用
段間調(diào)用
段間直接調(diào)用
段間間接調(diào)用
(直接調(diào)用:指令中直接給出子過程的入口地址
間接調(diào)用:由內(nèi)存獲得子過程的入口地址)
1. 段內(nèi)調(diào)用
? 被調(diào)用程序與調(diào)用程序在同一代碼段
? 調(diào)用前只需保護(hù)斷點(diǎn)的偏移地址
? 格式: CALL NEAR PROCC;NEAR可以缺省,PROCC近過程名
? 執(zhí)行過程:
? 將斷點(diǎn)的偏移地址壓入堆棧
? 根據(jù)過程名找子程序入口
? ? ? ?

? ? ? ?
例
(1)CALL TIMER;直接調(diào)用。調(diào)用名字為TIMER 的子程序
(2)CALL WORD PTR[SI];間接調(diào)用。 子程序的入口地址在內(nèi)存中
設(shè):SI=1200H,CS=6000H
執(zhí)行第(2)條指令后:
CS = 6000H,IP = 3344H
? ? ? ?

? ? ? ?
2. 段間調(diào)用
? 子過程與原調(diào)用程序不在同一代碼段
調(diào)用前需保護(hù)斷點(diǎn)的 段基地址和偏移地址
? 先將斷點(diǎn)的CS內(nèi)容壓棧,再壓入IP內(nèi)容。
格式例:
CALL FAR TIMRE;調(diào)用名為TIMER的遠(yuǎn)過程
CALL DWORD PTR[SI];32位存儲器操作數(shù),表示遠(yuǎn)過程調(diào)用
? ? ? ?

? ? ? ?
3. 返回指令
? 功能:從堆棧中彈出斷點(diǎn)地址,返回原程序
? 格式:RET (return的縮寫)
子程序的最后一條指令必須是RET
第33講 中斷指令
中斷指令
? 中斷的概念某種異?;螂S機(jī)事件(中斷源)使處理器暫時停止正在運(yùn)行的程序,轉(zhuǎn)去執(zhí)行一段特殊處理程序,并在處理結(jié)束后返回原程序被中斷處繼續(xù)執(zhí)行的過程。
? 中斷指令:引起CPU產(chǎn)生一次中斷的指令
中斷與過程調(diào)用:
? 相似點(diǎn):從一個正在執(zhí)行的過程轉(zhuǎn)向另一個過程(處理程序),并在執(zhí)行
完后返回原程序繼續(xù)執(zhí)行
? 區(qū)別:
? 中斷是隨機(jī)事件或異常事件引起,調(diào)用是事先已在程序中安排好;
? 調(diào)用指令在指令中直接給出子程序入口地址,中斷指令只給出中斷向量碼,入口地址則在向量碼指向的內(nèi)存單元中。
? 調(diào)用可以是近過程調(diào)用或遠(yuǎn)過程調(diào)用,中斷處理程序均為遠(yuǎn)過程;
? 響應(yīng)中斷請求不僅要保護(hù)斷點(diǎn)地址,還要保護(hù) FLAGS內(nèi)容。
1. 中斷指令
格式:
INT n; 中斷類型碼n=0~255
說明: n х 4 ?存放中斷服務(wù)子程序入口地址的單元的偏移地址。該單元在數(shù)據(jù)段,段地址=DS
(去中斷向量表中查找,后面會學(xué)到.中斷向量表: 用于存放中斷服務(wù)程序入口地址)
? ? ? ?

? ? ? ?
中斷指令的執(zhí)行過程
① 將FLAGS壓入堆棧;
② 將INT指令的下一條指令的CS、IP壓棧;
③ 由n×4得到存放中斷向量的地址;
④ 將中斷向量(中斷服務(wù)程序入口地址)送CS和IP寄存器;
⑤ 轉(zhuǎn)入中斷服務(wù)程序。
(①-④自動完成,⑤程序員完成)
? ? ? ? ? ? ? ?

? ? ? ?
中斷指令例
執(zhí)行程序段:
CS IP
┇
6200H:010DH MOV SP,1200H
6200H:0110H INT 21H
6200H:0112H MOV AX,BX
┇
? ? ? ?

? ? ? ?
執(zhí)行INT 21H指令后
? IP=[21Hх4]
? CS==[(21Hх4)+2]
? ? ? ?

? ? ? ?
2. 中斷返回指令
? 格式:IRET
? 中斷服務(wù)程序的最后一條指令,負(fù)責(zé):
恢復(fù)斷點(diǎn)
恢復(fù)標(biāo)志寄存器內(nèi)容
第34講 處理器控制指令
這類指令用來對CPU進(jìn)行控制,如修改標(biāo)志寄存器,使CPU暫停,使CPU與外部設(shè)備同步等:
對標(biāo)志位的操作
與外部設(shè)備的同步
處理器控制指令的控制對象是CPU
均為零操作數(shù)格式指令
標(biāo)志位操作指令
置標(biāo)志位狀態(tài)
? ? ? ?

? ? ? ?
指令系統(tǒng)小結(jié)
指令系統(tǒng)
基本概念
指令中的操作數(shù)
8種尋址方式
指令系統(tǒng):數(shù)據(jù)傳送類,算術(shù)運(yùn)算類,邏輯運(yùn)算和移位,串操作,程序控制,處理器控制
理解:
? 指令應(yīng)有的格式
? 不同類型指令對操作數(shù)的要求
? 不同類型指令的執(zhí)行對標(biāo)志位產(chǎn)生的影響
? 指令的執(zhí)行原理:串操作指令,程序控制類指令
關(guān)注點(diǎn):
? 指令格式
? 單操作數(shù)指令,移位指令,串操作指令
? 操作數(shù)字長的一致性
? 一般情況下,條件轉(zhuǎn)移指令應(yīng)跟在對相應(yīng)標(biāo)志位影響的指令后
? 輸入輸出指令格式
? 程序控制類指令對堆棧區(qū)的影響
? 處理器控制指令