(微機(jī)原理與接口技術(shù))chapter06程序控制指令_第1頁(yè)
(微機(jī)原理與接口技術(shù))chapter06程序控制指令_第2頁(yè)
(微機(jī)原理與接口技術(shù))chapter06程序控制指令_第3頁(yè)
(微機(jī)原理與接口技術(shù))chapter06程序控制指令_第4頁(yè)
(微機(jī)原理與接口技術(shù))chapter06程序控制指令_第5頁(yè)
已閱讀5頁(yè),還剩46頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、( (微機(jī)原理與接口技術(shù)微機(jī)原理與接口技術(shù))chapter06)chapter06程程序控制指令序控制指令7例例 1指出短轉(zhuǎn)移指令怎樣控制從程序的一個(gè)局部轉(zhuǎn)指出短轉(zhuǎn)移指令怎樣控制從程序的一個(gè)局部轉(zhuǎn)到另一局部,也說(shuō)明了和轉(zhuǎn)移指令一起的標(biāo)到另一局部,也說(shuō)明了和轉(zhuǎn)移指令一起的標(biāo)號(hào)存儲(chǔ)器地址的符號(hào)名的用法號(hào)存儲(chǔ)器地址的符號(hào)名的用法0000 33 DB0002 B8 00010005 03 C3JMP SHORT NEXTXOR BX, BX0022 EB DEADD AX, BX0007 EB 17JMP STARTMOV AX, 1MOV BX, AX0020 8B D8START:NEXT:89例

2、例 2例例2給出了與例給出了與例1相同的根本程序,只是轉(zhuǎn)移相同的根本程序,只是轉(zhuǎn)移的距離大些的距離大些字母字母R指示指示0200H為可重定位的轉(zhuǎn)移地址為可重定位的轉(zhuǎn)移地址 可重定義的可重定義的0200H地址只由匯編程序內(nèi)部使地址只由匯編程序內(nèi)部使用用實(shí)際匯編成的機(jī)器語(yǔ)言指令為實(shí)際匯編成的機(jī)器語(yǔ)言指令為E9 F6 01,沒(méi)有沒(méi)有出現(xiàn)在匯編程序列表中出現(xiàn)在匯編程序列表中 對(duì)應(yīng)這個(gè)轉(zhuǎn)移的實(shí)際位移量是對(duì)應(yīng)這個(gè)轉(zhuǎn)移的實(shí)際位移量是01F6H100000 33 DB0002 B8 00010005 03 C3JMP NEXTXOR BX, BX0022 E9 0002 RADD AX, BX0007 E9

3、0200 RJMP STARTMOV AX, 1MOV BX, AX0200 8B D8START:NEXT:1112例例 3遠(yuǎn)轉(zhuǎn)移指令有時(shí)用遠(yuǎn)轉(zhuǎn)移指令有時(shí)用FAR PTR偽指令作為說(shuō)明偽指令作為說(shuō)明 獲得遠(yuǎn)轉(zhuǎn)移的另一種方法是定義標(biāo)號(hào)為獲得遠(yuǎn)轉(zhuǎn)移的另一種方法是定義標(biāo)號(hào)為遠(yuǎn)標(biāo)號(hào)遠(yuǎn)標(biāo)號(hào)標(biāo)號(hào)標(biāo)號(hào)UP用用EXTRN UP: FAR定義為遠(yuǎn)標(biāo)號(hào)定義為遠(yuǎn)標(biāo)號(hào)當(dāng)對(duì)程序文件進(jìn)行連接時(shí),連接程序把標(biāo)號(hào)當(dāng)對(duì)程序文件進(jìn)行連接時(shí),連接程序把標(biāo)號(hào)UP的的地址插入地址插入JMP UP指令,也把段地址插入指令,也把段地址插入JMP START指令指令130000 33 DB0002 B8 00010005 03 C3JMP

4、 NEXTXOR BX, BX0202 EA 0002 - RADD AX, BX0007 E9 0200 RJMP FAR PTR STARTMOV AX, 1MOV BX, AX0200 8B D8START:NEXT:EXTRN UP: FARJMP UP0207 EA 0000 - E14使用存放器操作數(shù)的轉(zhuǎn)移使用存放器操作數(shù)的轉(zhuǎn)移轉(zhuǎn)移指令也可以用轉(zhuǎn)移指令也可以用16位或位或32位存放器作為操作數(shù)位存放器作為操作數(shù)自動(dòng)將指令設(shè)置為間接轉(zhuǎn)移自動(dòng)將指令設(shè)置為間接轉(zhuǎn)移轉(zhuǎn)移地址在轉(zhuǎn)移指令指定的存放器內(nèi)轉(zhuǎn)移地址在轉(zhuǎn)移指令指定的存放器內(nèi)這與近轉(zhuǎn)移的位移量不同,存放器的內(nèi)容直接傳這與近轉(zhuǎn)移的位移量不

5、同,存放器的內(nèi)容直接傳送到指令指針中送到指令指針中例如例如JMP AX 指令指令,當(dāng)出現(xiàn)轉(zhuǎn)移時(shí)把當(dāng)出現(xiàn)轉(zhuǎn)移時(shí)把AX的內(nèi)容復(fù)制的內(nèi)容復(fù)制到到IP中中15例例 4給出了怎樣訪問(wèn)代碼段中的轉(zhuǎn)移表給出了怎樣訪問(wèn)代碼段中的轉(zhuǎn)移表這個(gè)程序從鍵盤讀入鍵值,然后修正這個(gè)程序從鍵盤讀入鍵值,然后修正ASCII碼。碼。AL中的中的00H,01H或或02H分別對(duì)應(yīng)分別對(duì)應(yīng)1,2或或3如果鍵入如果鍵入1,2或或3,AH去除為去除為00H因?yàn)檗D(zhuǎn)移表中包含因?yàn)檗D(zhuǎn)移表中包含16位的偏移地址,為了存取位的偏移地址,為了存取轉(zhuǎn)移表中轉(zhuǎn)移表中16位的地址,位的地址,AX中的內(nèi)容被加倍中的內(nèi)容被加倍成成0,2或或4然后,轉(zhuǎn)移表的起

6、始地址裝入然后,轉(zhuǎn)移表的起始地址裝入SI,與,與AX相加相加形成指向轉(zhuǎn)移目標(biāo)的地址形成指向轉(zhuǎn)移目標(biāo)的地址MOV AX, SI指令從轉(zhuǎn)移表中獲取地址,這樣指令從轉(zhuǎn)移表中獲取地址,這樣JMP AX指令就能轉(zhuǎn)移到存儲(chǔ)在轉(zhuǎn)移表中指令就能轉(zhuǎn)移到存儲(chǔ)在轉(zhuǎn)移表中1,2或或3的地址的地址161718使用變址尋址方式的間接轉(zhuǎn)移使用變址尋址方式的間接轉(zhuǎn)移例例 5例例5用用JMP TABLE SI指令替換例指令替換例4的的JMP AX指令指令192021條件轉(zhuǎn)移和條件設(shè)置指令條件轉(zhuǎn)移和條件設(shè)置指令808680286微處理器的條件轉(zhuǎn)移指令都是短轉(zhuǎn)移,微處理器的條件轉(zhuǎn)移指令都是短轉(zhuǎn)移,這就把條件轉(zhuǎn)移的范圍限制在這就把條

7、件轉(zhuǎn)移的范圍限制在+127到到-128字節(jié)以內(nèi)字節(jié)以內(nèi)80386以上的微處理器,條件轉(zhuǎn)移是短轉(zhuǎn)移或是近以上的微處理器,條件轉(zhuǎn)移是短轉(zhuǎn)移或是近轉(zhuǎn)移,因此允許這些微處理器有條件地轉(zhuǎn)移到當(dāng)轉(zhuǎn)移,因此允許這些微處理器有條件地轉(zhuǎn)移到當(dāng)前代碼段內(nèi)的任何位置前代碼段內(nèi)的任何位置2223注意注意條件轉(zhuǎn)移指令測(cè)試以下標(biāo)志位條件轉(zhuǎn)移指令測(cè)試以下標(biāo)志位:符號(hào)符號(hào)(S), 零零(Z),進(jìn)位進(jìn)位(C),奇偶奇偶(P)和溢出和溢出(O)在無(wú)符號(hào)數(shù)集合中,在無(wú)符號(hào)數(shù)集合中,F(xiàn)FH255大于大于00H,而,而有符號(hào)數(shù)有符號(hào)數(shù)FFH-1小于小于00H比較有符號(hào)數(shù)時(shí)用比較有符號(hào)數(shù)時(shí)用JG, JL, JGE, JE和和JNE指令指

8、令 比較無(wú)符號(hào)數(shù)時(shí)用比較無(wú)符號(hào)數(shù)時(shí)用JA, JB, JAE, JBE, JE和和JNE指令指令2425例例 6使用使用JCXZ條件轉(zhuǎn)移指令搜素表內(nèi)的條件轉(zhuǎn)移指令搜素表內(nèi)的0AH26條件設(shè)置指令條件設(shè)置指令80386和更高檔型號(hào)的微處理器中,條件設(shè)置指令和更高檔型號(hào)的微處理器中,條件設(shè)置指令或者把一個(gè)字節(jié)設(shè)置為或者把一個(gè)字節(jié)設(shè)置為01H,或者把該字節(jié)去除為,或者把該字節(jié)去除為00H,這取決于條件測(cè)試的結(jié)果,這取決于條件測(cè)試的結(jié)果例如例如SETNC MEM指令,如果進(jìn)位位清指令,如果進(jìn)位位清0,這條指,這條指令將令將01H放入存儲(chǔ)單元放入存儲(chǔ)單元MEM;如果進(jìn)位位置位,;如果進(jìn)位位置位,那么放入那

9、么放入00H 程序執(zhí)行程序執(zhí)行SETNC MEM指令后,在后面的某個(gè)地指令后,在后面的某個(gè)地方就可以測(cè)試方就可以測(cè)試MEM的內(nèi)容,以便判定在前面的內(nèi)容,以便判定在前面SETNC MEM指令執(zhí)行的那一點(diǎn)進(jìn)位位是否清指令執(zhí)行的那一點(diǎn)進(jìn)位位是否清02728LOOP指令指令是是CX減減1和和JNZ組合而成的條件轉(zhuǎn)移指令組合而成的條件轉(zhuǎn)移指令LOOP使使CX內(nèi)容減內(nèi)容減1,如果,如果CX內(nèi)容不為零,轉(zhuǎn)移內(nèi)容不為零,轉(zhuǎn)移到標(biāo)號(hào)指示的地址;如果到標(biāo)號(hào)指示的地址;如果CX為零那么執(zhí)行下一條為零那么執(zhí)行下一條指令指令在在80386Pentium 4微處理器中微處理器中,LOOP指令使指令使CX或或ECX減減12

10、9例例 7查看查看174頁(yè)的例頁(yè)的例30條件條件 Loop指令指令LOOPE (等于那么循環(huán)等于那么循環(huán)): 如果如果CX不等于零而且等不等于零而且等于條件成立,那么于條件成立,那么LOOPE指令轉(zhuǎn)移指令轉(zhuǎn)移LOOPNE (不等于那么循環(huán)不等于那么循環(huán)): 如果如果CX不等于零而不等于零而且不等于條件存在,且不等于條件存在,LOOPNE指令轉(zhuǎn)移指令轉(zhuǎn)移31控制匯編語(yǔ)言程序的流程控制匯編語(yǔ)言程序的流程.IF, .ELSE, .ELSEIF和和.ENDIF和和 .WHILE- .ENDW這些語(yǔ)句用于為這些語(yǔ)句用于為MASM6.*指示特殊的匯編語(yǔ)言命指示特殊的匯編語(yǔ)言命令令32IF 的例子的例子參見(jiàn)

11、表參見(jiàn)表參見(jiàn)第參見(jiàn)第175頁(yè)的頁(yè)的參見(jiàn)第參見(jiàn)第176頁(yè)的頁(yè)的參見(jiàn)第參見(jiàn)第176頁(yè)的頁(yè)的 DO-WHILE的例子的例子參見(jiàn)第參見(jiàn)第177頁(yè)的頁(yè)的參見(jiàn)第參見(jiàn)第178頁(yè)的頁(yè)的參見(jiàn)第參見(jiàn)第179頁(yè)的頁(yè)的 REPEAT-UNTIL的例子的例子參見(jiàn)第參見(jiàn)第180頁(yè)的頁(yè)的參見(jiàn)第參見(jiàn)第181頁(yè)的頁(yè)的33過(guò)程過(guò)程過(guò)程或子程序是存儲(chǔ)器中可重復(fù)使用的一段軟件,過(guò)程或子程序是存儲(chǔ)器中可重復(fù)使用的一段軟件,而且是經(jīng)常要用的而且是經(jīng)常要用的CALL 指令連接到過(guò)程,而指令連接到過(guò)程,而RET(返回返回)指令從過(guò)程指令從過(guò)程返回返回當(dāng)程序執(zhí)行期間調(diào)用過(guò)程時(shí),在堆棧中存儲(chǔ)返回當(dāng)程序執(zhí)行期間調(diào)用過(guò)程時(shí),在堆棧中存儲(chǔ)返回地址地址

12、CALL 指令將其后的指令的地址返回地址壓指令將其后的指令的地址返回地址壓入堆棧入堆棧34RET指令從堆棧彈出地址,因此能夠返回到指令從堆棧彈出地址,因此能夠返回到CALL之后之后的指令的指令過(guò)程要以過(guò)程要以PROC 偽指令開(kāi)始并且以偽指令開(kāi)始并且以ENDP偽指令結(jié)束偽指令結(jié)束兩個(gè)偽指令與過(guò)程的名字一起出現(xiàn)兩個(gè)偽指令與過(guò)程的名字一起出現(xiàn)PROC偽指令后面是過(guò)程的類型偽指令后面是過(guò)程的類型:NEAR或或FARNEAR或或FAR過(guò)程后面可以用過(guò)程后面可以用USES語(yǔ)句,語(yǔ)句,USES語(yǔ)句使語(yǔ)句使進(jìn)入過(guò)程后將一些存放器內(nèi)容自動(dòng)壓入堆棧,退出過(guò)進(jìn)入過(guò)程后將一些存放器內(nèi)容自動(dòng)壓入堆棧,退出過(guò)程前自動(dòng)彈出

13、堆棧程前自動(dòng)彈出堆棧35段內(nèi)和段間兩種過(guò)程的區(qū)別段內(nèi)和段間兩種過(guò)程的區(qū)別RET指令的不同指令的不同: 近返回指令用操作碼近返回指令用操作碼C3H, 而遠(yuǎn)而遠(yuǎn)返回指令用操作碼返回指令用操作碼CBH近返回從堆棧彈出近返回從堆棧彈出16位數(shù)字,把它放入指令計(jì)數(shù)位數(shù)字,把它放入指令計(jì)數(shù)器,實(shí)現(xiàn)從當(dāng)前代碼段的過(guò)程返回器,實(shí)現(xiàn)從當(dāng)前代碼段的過(guò)程返回遠(yuǎn)返回是從堆棧返回遠(yuǎn)返回是從堆棧返回32位數(shù)字,并且放入位數(shù)字,并且放入IP和和CS,實(shí)現(xiàn)從過(guò)程返回到任何存儲(chǔ)單元實(shí)現(xiàn)從過(guò)程返回到任何存儲(chǔ)單元 例例11參見(jiàn)第參見(jiàn)第182頁(yè)頁(yè)36CALL指令指令把程序流程傳遞到被調(diào)用的過(guò)程把程序流程傳遞到被調(diào)用的過(guò)程CALL指令

14、不同于轉(zhuǎn)移指令,因?yàn)橹噶畈煌谵D(zhuǎn)移指令,因?yàn)镃ALL在堆棧內(nèi)在堆棧內(nèi)保存返回地址保存返回地址執(zhí)行執(zhí)行RET指令時(shí),控制返回到緊跟在指令時(shí),控制返回到緊跟在CALL指令之指令之后的那條指令后的那條指令近近CALL指令指令:有有3字節(jié)長(zhǎng),對(duì)于字節(jié)長(zhǎng),對(duì)于808680286微處理微處理器,包含器,包含32KB的位移量或距離的位移量或距離;80386以上的微以上的微處理器按保護(hù)模式操作時(shí)用處理器按保護(hù)模式操作時(shí)用32位的位移量,允許位的位移量,允許2GB的距離的距離37遠(yuǎn)遠(yuǎn)CALL指令指令: 5字節(jié)的指令,操作碼后面跟隨字節(jié)的指令,操作碼后面跟隨IP和和 CS存放器的值存放器的值遠(yuǎn)遠(yuǎn)CALL指令轉(zhuǎn)移到

15、由第指令轉(zhuǎn)移到由第25字節(jié)指示的指令地址字節(jié)指示的指令地址之前,先將之前,先將IP和和CS的內(nèi)容壓入堆棧的內(nèi)容壓入堆棧保護(hù)模式中的遠(yuǎn)保護(hù)模式中的遠(yuǎn)CALL指令,尋址指令,尋址6個(gè)字節(jié)的內(nèi)容,個(gè)字節(jié)的內(nèi)容,前前4個(gè)字節(jié)是個(gè)字節(jié)是EIP,后,后2個(gè)字節(jié)是個(gè)字節(jié)是CS383940使用存放器操作數(shù)的使用存放器操作數(shù)的CALL指令指令CALL BX指令就是這樣的例子指令就是這樣的例子這條指令將這條指令將IP的內(nèi)容壓入堆棧,然后轉(zhuǎn)移到當(dāng)前的內(nèi)容壓入堆棧,然后轉(zhuǎn)移到當(dāng)前代碼段位于代碼段位于BX存放器中的偏移地址處存放器中的偏移地址處此類指令可以使用一個(gè)此類指令可以使用一個(gè)16位偏移地址,該地址存位偏移地址,

16、該地址存放在除段存放器以外的任何放在除段存放器以外的任何16位存放器中位存放器中 例例12參見(jiàn)第參見(jiàn)第184頁(yè)例頁(yè)例41使用間接存儲(chǔ)器尋址的使用間接存儲(chǔ)器尋址的CALL指令指令當(dāng)程序需要從不同的子程序中選擇一個(gè)時(shí),用間當(dāng)程序需要從不同的子程序中選擇一個(gè)時(shí),用間接存儲(chǔ)器尋址的接存儲(chǔ)器尋址的CALL是有實(shí)際意義的是有實(shí)際意義的例例 13參見(jiàn)第參見(jiàn)第184頁(yè)例頁(yè)例42RET指令指令返回指令從堆棧中取出返回指令從堆棧中取出16位數(shù)字放回位數(shù)字放回IP返回指令從堆棧中取出返回指令從堆棧中取出32位數(shù)字放入位數(shù)字放入IP和和CS80386Pentium4微處理器按微處理器按保護(hù)模式保護(hù)模式操作時(shí)操作時(shí),

17、遠(yuǎn)遠(yuǎn) 返返回從堆棧中取回回從堆棧中取回6個(gè)字節(jié);前個(gè)字節(jié);前4個(gè)字節(jié)包含個(gè)字節(jié)包含EIP的新的新值,后兩個(gè)字節(jié)包含值,后兩個(gè)字節(jié)包含CS的新值的新值80386Pentium4微處理器按微處理器按保護(hù)模式保護(hù)模式操作時(shí)操作時(shí), 近近 返返回從堆棧取回回從堆棧取回4個(gè)字節(jié),并且放入個(gè)字節(jié),并且放入EIP中中43例例 14參見(jiàn)第參見(jiàn)第186頁(yè)的例頁(yè)的例44中斷概述中斷概述中斷或者是硬件產(chǎn)生的中斷或者是硬件產(chǎn)生的CALL由硬件信號(hào)從外部由硬件信號(hào)從外部驅(qū)動(dòng),或者是軟件產(chǎn)生的驅(qū)動(dòng),或者是軟件產(chǎn)生的CALL由執(zhí)行指令內(nèi)由執(zhí)行指令內(nèi)部驅(qū)動(dòng)或者是由某些內(nèi)部事件引發(fā)部驅(qū)動(dòng)或者是由某些內(nèi)部事件引發(fā)中斷向量中斷向量

18、共有共有256個(gè)不同的中斷向量,每個(gè)中斷向量包含了個(gè)不同的中斷向量,每個(gè)中斷向量包含了一個(gè)中斷效勞程序的地址一個(gè)中斷效勞程序的地址當(dāng)微處理器按實(shí)模式操作時(shí),中斷向量是當(dāng)微處理器按實(shí)模式操作時(shí),中斷向量是4個(gè)字節(jié)個(gè)字節(jié)的數(shù)字,存儲(chǔ)在存儲(chǔ)器的第一個(gè)的數(shù)字,存儲(chǔ)在存儲(chǔ)器的第一個(gè)1024單元單元在保護(hù)模式中,用中斷描述符表替代向量表,每在保護(hù)模式中,用中斷描述符表替代向量表,每個(gè)中斷用個(gè)中斷用8個(gè)字節(jié)的中段描述符說(shuō)明個(gè)字節(jié)的中段描述符說(shuō)明45中斷指令中斷指令實(shí)模式中,這些指令中的每一個(gè)從向量表獲取向?qū)嵞J街?,這些指令中的每一個(gè)從向量表獲取向量,然后調(diào)用過(guò)程,該過(guò)程存放在向量指向的那量,然后調(diào)用過(guò)程,該過(guò)程存放在向量指向的那個(gè)位置個(gè)位置保護(hù)模式中,這些指令中的每一個(gè)從中斷描述符保護(hù)模式中,這些指令中的每一個(gè)從中斷描述符表中獲取中斷描述符。這些描述符指定了中斷效表中獲取中斷描述符。這些描述符指定了中斷效勞程序的地址勞程序的地址I

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論