《微機(jī)原理 第三章6》由會員分享,可在線閱讀,更多相關(guān)《微機(jī)原理 第三章6(21頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,*,單擊此處編輯母版標(biāo)題樣式,3.2.5,調(diào)用,/,轉(zhuǎn)移,/,循環(huán)控制,/,中斷指令,轉(zhuǎn)移可分成兩類:段內(nèi)或段間轉(zhuǎn)移。,段內(nèi)轉(zhuǎn)移:只要改變,IP,寄存器的內(nèi)容,指在同一段的范圍之內(nèi)進(jìn)行轉(zhuǎn)移,即用新的轉(zhuǎn)移目標(biāo)地址代替原有的,IP,值。,段間轉(zhuǎn)移:要修改,IP,、,CS,寄存器的內(nèi)容,轉(zhuǎn)到另一段去執(zhí)行程序。,即,轉(zhuǎn)移目標(biāo)地址,=,新的段地址和偏移地址組成。,目標(biāo)地址可以是:直接方式,/,間接方式給出。,代碼段,代碼段,代碼段,代碼段,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,1,1.,子程序調(diào)用和返回指令,CALL,
2、label,主程序,RET,子程序,回到,CALL,指令后的指令處,返回地址,CALL 1000H,段內(nèi)直接,CALLEAX,段內(nèi)間接,CALL2500H,:,3600H,段間直接,CALLDWORD PTR DI,段間間接,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,2,放在子程序的末尾,使子程序在功能完成后返回調(diào)用程序繼續(xù)執(zhí)行。,*為能準(zhǔn)確返回 ,返回指令類型與調(diào)用指令類型相對應(yīng)。,在子程序調(diào)用時,需要保存返回地址,返回地址入棧,在子程序返回時:將返回地址出棧,段內(nèi)返回,出棧偏移地址,IP,IPSS:SP,,,SPSP,2,段間返回,出棧偏移地址,IP,和段地址,CS,I
3、PSS:SP,,,SPSP,2,CSSS:SP,,,SPSP,2,返回指令,RET,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,3,RET n,帶參數(shù)的返回指令:,RET,指令,可以帶有一個立即數(shù),i16,,則堆棧指針,SP,將增加,即,SPSP+i16,,,這個特點(diǎn)使得程序可以方便地廢除若干執(zhí)行,CALL,指令以前入棧的參數(shù),RET,返回指令有,4,種:,段內(nèi)返回 段間返回,段內(nèi)帶立即數(shù)返回 段間帶立即數(shù)返回,n,只能為偶數(shù),第,3,章,Pentium,的指令系統(tǒng),2024/11/21,4,(AX),(BX),(CX),(SP),code segment,main proc
4、 far,push ax,push bx,push cx,call sub,ret,main endp,sub proc near,ret 6,sub endp,code ends,(SP),堆棧段,(SP),(IP),第,3,章,Pentium,的指令系統(tǒng),2024/11/21,5,JMP1000H,;段內(nèi)直接,JMPCX,;段內(nèi)間接,JMP1000H,:,2000H,;段間直接,JMP DWORD PTR SI,;段間間接,JMP dest,;,必須指定轉(zhuǎn)移目標(biāo)地址,(,或轉(zhuǎn)向地址,),。,2.,無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令,JMP/J*,(其中,*代表各種條件),1),無條件轉(zhuǎn)移指令,J
5、MP,例:已知,(BX)=1000H,,,(SI)=2000H ,(DS)=2000H,(23000H)=0250H,(23002H)=2000H,JMP DWORD PTR BXSI,則:(,BX,),+,(,SI,),=3000H,(IP)=,(,PA,),=(16d,(DS)+(BX)+(SI)=(23000H)=0250H,(,CS,),=(PA+2)=2000H,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,6,JE/JZ,JNE/JNZ,JG/JNLE,JNG/JLE,JL/JNGE,JNL/JGE,JNA/JBE,JB/JNAE,JNB/JAE,JA/JNBE,J
6、S,JNS,JO,JNO,JP,NP,JCXZ,JECXZ,2),條件轉(zhuǎn)移指令,J*,根據(jù)單個條件標(biāo)志的設(shè)置情況轉(zhuǎn)移,根據(jù)兩個無符號數(shù)比較結(jié)果轉(zhuǎn)移,比較兩個帶符號數(shù),,并根據(jù)比較結(jié)果轉(zhuǎn)移,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,7,注意幾點(diǎn):,所有條件轉(zhuǎn)移指令都是相對轉(zhuǎn)移形式,段內(nèi)范圍。,當(dāng)需往一個較遠(yuǎn)地方進(jìn)行條件轉(zhuǎn)移時,,選用條件轉(zhuǎn)移轉(zhuǎn)到附近一個單元,,然后,再用無條件轉(zhuǎn)移轉(zhuǎn)到較遠(yuǎn)的目的地。,條件轉(zhuǎn)移指令中,相當(dāng)一部分指令是在比較完二個,數(shù)大小后,根據(jù)結(jié)果而決定是否轉(zhuǎn)移,,條件轉(zhuǎn)移指令不影響標(biāo)志位,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,8,按轉(zhuǎn)移
7、條件不同,條件轉(zhuǎn)移指令可以分為四大類:,以單個狀態(tài)標(biāo)志作為轉(zhuǎn)移條件助記符轉(zhuǎn)移條件,助記符,轉(zhuǎn)移條件,助記符,轉(zhuǎn)移條件,JZ/JE,ZF=1,JNZ/JNE,ZF=0,JS,SF=1,JNS,SF=0,JO,OF=1,JNO,OF=0,JP/JPE,PF=1,JNP/JPO,PF=0,JC,CF=1,JNC,CF=0,以,CX,的值為,0,作為轉(zhuǎn)移條件,助記符,轉(zhuǎn)移條件,JCXZ/JECXZ,(E)CX=0,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,9,助記符,轉(zhuǎn)移條件,JA/JNBE,CFZF=0,高于,/,不低于等于,JAE/JNB/JNC,CF=0,高于或等于,/,不低
8、于,/,無進(jìn)位,JB/JNAE/JC,CF=1,低于,/,不高于等于,/,有進(jìn)位,JBE/JNA,CFZF=1,低于或等于,/,不高于,以兩個無符號數(shù)比較的結(jié)果作為轉(zhuǎn)移條件,以兩個帶符號數(shù)比較的結(jié)果作為轉(zhuǎn)移條件,助記符,轉(zhuǎn)移條件,JG/JNLE,(,SFOF,),ZF=0,大于,/,不小于等于,JGE/JNL,SFOF=0,大于或等于,/,不小于,JL/JNGE,SFOF=1,小于,/,不大于等于,JLE/JNG,(,SFOF,),ZF=1,小于或等于,/,不大于,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,10,條件轉(zhuǎn)移指令應(yīng)用,例:比較二個數(shù)是否相等,如相等做動作,1,否
9、則,做動作,2,CMP AX,,,BX,JE action_1,Action_2:,action_1,:,或,CMP AX,,,BX,JNZ action_2,action_1:,action_2,:,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,11,例:,X,,,Y,放在,X,,,Y,單元里,,(,帶符號數(shù)判斷,),先判,X 50,,,YES too_high,,,NO,做,X-Y,溢出,overflow,,,否則求,|X-Y|result,程序,:,MOV AX,X CMP AX,50,JG too_high,;,大于轉(zhuǎn),too_high,SUB AX,Y,JO over
10、flow,;,溢出轉(zhuǎn),overflow,JNS nonneg,;S=0,轉(zhuǎn),nonneg,NEG AX,nonneg:MOV result,AX,too_high,:,overflow,:,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,12,例,:,在,M,中有一個首地址為,array,的,N,字?jǐn)?shù)組,要求測試其中正數(shù)、,0,及負(fù)數(shù)的個數(shù)。,(,帶符號數(shù)判斷,),正數(shù)個數(shù)放在(,DI,)中,0,的個數(shù)放在(,SI,)中,負(fù)數(shù)的個數(shù)放在,N-,(,DI,),-,(,SI,)送(,AX,),如果沒有負(fù)數(shù)轉(zhuǎn),skip,如果有負(fù)數(shù)轉(zhuǎn),neg_val,程序:,MOV CX,N,;,N,字
11、數(shù)組,MOV BX,0,MOV DI,BX,MOV SI,BX,AGAIN:CMP WORD PTR ARRARYBX,0,JLE LESS_OR_AG,INC DI;,正數(shù)個數(shù),JMP SHORT NEAT,LESS_OR_AG:JL NEAT,INC SI;0,的個數(shù),NEAT:ADD BX,2,DEC CX,JNZ AGAIN,MOV AX,N,SUB AX,DI,SUB AX,SI,JZ SKIP ;,沒有負(fù)數(shù),JMP NEAR PTR NEG_VAL ;,負(fù)數(shù),SKIP:,NEG_VAL:,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,13,3.,循環(huán)控制指令,循環(huán)控
12、制指令用于使一些程序段反復(fù)執(zhí)行,循環(huán)控制指令有三種:,(1),、,LOOP (Loop),循環(huán)指令,(2),、,LOOPE/LOOPZ,當(dāng)相等,/,為“,0”,循環(huán),(3),、,LOOPNE/LOOPNZ,當(dāng)不相等,/,不為“,0”,循環(huán),注意:,*,CX,中存放循環(huán)次數(shù),只能使用段內(nèi)直接尋址的,8,位位移量,(,-128127,),*,ECX,中存放循環(huán)次數(shù),只能使用段內(nèi)直接尋址的,16,位位移量(,-3276832767,),助記符,轉(zhuǎn)移條件,不轉(zhuǎn)移條件,LOOP,CX0,CX=0,LOOPZ,CX0,且,ZF=1,CX=0,或,ZF=0,LOOPNZ,CX0,且,ZF=0,CX=0,或,
13、ZF=1,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,14,LOOPxx,符號地址,執(zhí)行 操作,:,(,(E)CX,)(,(E)CX,),-1,此,操作不影響標(biāo)志,檢查轉(zhuǎn)移條件,xx,,滿足轉(zhuǎn)向目標(biāo)地址去執(zhí)行,;,不滿足執(zhí)行,LOOPxx,后一條指令,與條件轉(zhuǎn)移指令不同的是:,循環(huán)指令隱含,(E)CX),減操作。,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,15,例,:,求首地址為,ARRAY,的,M,個字之和,結(jié)果存入,TOTAL,。,MOV CX,M,MOV AX,0,MOV SI,AX,START_LOOP:,ADD AX,ARRAYSI,ADD SI
14、,2,LOOP START_LOOP,MOV TOTAL,AX,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,16,例:在,string,字符串中查找空格字符,串長度為,N,。,修改偏址,BX,Y,N,AL,關(guān)鍵字,CX,串長度,N,DS,:,BX,串首址,判,BX,是關(guān)鍵字?,(CX)(CX),-,1,找到處理,未找到處理,(CX)=0,?,Y,N,結(jié)束出口,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,17,用條件轉(zhuǎn)移:,JZ,MOV CX,,,N,MOV AX,SEG string,MOV DS,AX,LEA BX,,,string,MOV AL,20H,
15、next,:,CMP AL,,,BX,JZ find,INC BX,DEC CX,JNZ next,未找到處理,JMP exit,find,:找到處理,exit,:結(jié)束出口,用循環(huán)指令,:,LOOP NZ next,MOV CX,,,N,MOV AX,SEG string,MOV DS,AX,LEA BX,,,string,MOV AL,20H,next,:,CMP AL,,,BX,PUSHF,INC BX,POPF,LOOPNZ next,JZ find,未找到處理,JMP exit,find,:找到處理,exit,:結(jié)束出口,DEC BX,next,:,INC BX,CMP AL,,,BX
16、,LOOP NZ next,JZ find,未找到處理,JMP exit,find,:找到處理,exit,:結(jié)束出口,2024/11/21,18,思考:,去掉指令,JMP exit,,程序執(zhí)行結(jié)果會怎樣?,PUSH F,、,POPF,可否去掉?若要去掉,程序如何修改?,執(zhí)行完,LOOPNZ,后,可否根據(jù),CX=0,來,判斷查找結(jié)果,?,有人認(rèn)為,CX=0,,即,說明沒找到,,對嗎?,第,3,章,Pentium,的指令系統(tǒng),2024/11/21,19,循環(huán)指令說明:,LOOP,退出循環(huán)條件是(,CX,),=0,LOOPZ,和,LOOPNZ,提供了提前結(jié)束循環(huán)的可能,不一定要等到,(CX)=0,才退出循環(huán)。,在串中查找字符,查到了,就可退出,,可用,LOOPNZ,,,不相等時繼續(xù)查找。,比較兩串時,當(dāng)有字符不等,就可退出,說明兩字符串不等。,可用,LOOPZ,,,當(dāng)相等時繼續(xù)比較。,執(zhí)行完,LOOPNZ,或,LOOPZ,后,根據(jù),ZF,標(biāo)志的值判斷結(jié)果,對查找字符,,ZF=1,說明找到;否則沒有找到。,對串比較,,ZF=1,說明兩串相等;否則不等。,第,3,章,Pentium,的指令系統(tǒng),