最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

第六周 程序與處理器控制指令

2021-05-10 19:00 作者:康康Loong  | 我要投稿

大家好,又是我,沉迷學(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ū)的影響

? 處理器控制指令



第六周 程序與處理器控制指令的評論 (共 條)

分享到微博請遵守國家法律
汉川市| 交口县| 托克托县| 祁门县| 金堂县| 城口县| 汕尾市| 五华县| 肃北| 开阳县| 广丰县| 碌曲县| 南木林县| 玉山县| 都昌县| 方正县| 凤冈县| 鄂托克前旗| 平邑县| 青海省| 绥江县| 温泉县| 阿图什市| 平塘县| 若尔盖县| 日照市| 巴东县| 百色市| 阜城县| 澄江县| 文化| 手机| 孝昌县| 龙岩市| 延吉市| 阿拉善盟| 昌宁县| 兴国县| 二连浩特市| 罗定市| 娱乐|