![第六章循環(huán)與分支程序_第1頁(yè)](http://file4.renrendoc.com/view/55f2938b9653287398c0d6bfc30538c9/55f2938b9653287398c0d6bfc30538c91.gif)
![第六章循環(huán)與分支程序_第2頁(yè)](http://file4.renrendoc.com/view/55f2938b9653287398c0d6bfc30538c9/55f2938b9653287398c0d6bfc30538c92.gif)
![第六章循環(huán)與分支程序_第3頁(yè)](http://file4.renrendoc.com/view/55f2938b9653287398c0d6bfc30538c9/55f2938b9653287398c0d6bfc30538c93.gif)
![第六章循環(huán)與分支程序_第4頁(yè)](http://file4.renrendoc.com/view/55f2938b9653287398c0d6bfc30538c9/55f2938b9653287398c0d6bfc30538c94.gif)
![第六章循環(huán)與分支程序_第5頁(yè)](http://file4.renrendoc.com/view/55f2938b9653287398c0d6bfc30538c9/55f2938b9653287398c0d6bfc30538c95.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六章循環(huán)與分支程序第1頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202326.1分支程序設(shè)計(jì)
6.1.1標(biāo)號(hào)標(biāo)號(hào):
用來(lái)說(shuō)明可執(zhí)行指令在匯編語(yǔ)言程序中的位置。和變量類(lèi)似,實(shí)質(zhì)上是一個(gè)地址值。可以作為轉(zhuǎn)移指令(或CALL)的操作數(shù)。屬性:段屬性、位移量屬性和距離屬性。注意:
如果一個(gè)標(biāo)號(hào)只在標(biāo)號(hào)定義的段中用JMP或條件轉(zhuǎn)移指令(或CALL)來(lái)訪問(wèn),需要將標(biāo)號(hào)的距離屬性定義為NEAR;如果一個(gè)標(biāo)號(hào)能被其他段中的JMP指令(或CALL)來(lái)訪問(wèn),那么需要將這個(gè)標(biāo)號(hào)的距離定義為FAR。第2頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202331、定義距離屬性為NEAR的標(biāo)號(hào)
1)隱式說(shuō)明:即在標(biāo)號(hào)后面加上冒號(hào),放在指令的前面。例如:L1:MOVAX,[SI]NEXT:MOCAX,BXL1和NEXT都是標(biāo)號(hào)名,它們的距離屬性均為NEAR。2)顯式說(shuō)明:即用LABEL偽指令或在EQU指令中用THIS操作符明顯的說(shuō)明。例如:L2LABELNEARMOVDX,CXL3EQUTHISNEARORDL,30H
標(biāo)號(hào)L2和L3的距離屬性均為NEAR。第3頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202342、定義距離屬性為FAR的標(biāo)號(hào)
例如:
L4
LABELFAR
MOVAX,CXL5EQUTHISFARORDL,30H3、同時(shí)定義距離屬性為FAR和NEAR的標(biāo)號(hào)例如:
L6
LABELFAR
L7:ANDAL,0FH或者:
L6EQUTHISFARL7:ANDAL,0FH第4頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202356.1.2無(wú)條件轉(zhuǎn)移指令
JMP指令(無(wú)條件轉(zhuǎn)移)格式:JMP目的操作數(shù)功能:JMP指令無(wú)條件地控制轉(zhuǎn)移至目標(biāo)單元(目的操作數(shù)).JMP指令具體格式有以下五種:1、段內(nèi)直接轉(zhuǎn)移格式:JMP標(biāo)號(hào)名;標(biāo)號(hào)為NEAR屬性這個(gè)標(biāo)號(hào)是在本段內(nèi)某一指令的前面,后面綴以冒號(hào)來(lái)定義其位置的(位移量)。第5頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/20236例如:
JMPL2∶L1:ADDAX,100L2:MOVCX,30∶JMPL12、段內(nèi)直接短轉(zhuǎn)移格式:JMPSHORT標(biāo)號(hào)名例如:∶
JMPSHORTL1L2:MOVDX,CX∶L1:ORDL,30H∶第6頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202373、段內(nèi)間接轉(zhuǎn)移格式:JMP地址表達(dá)式例如:
JMPBX
;把控制轉(zhuǎn)向CS:BX
JMPVAR_WORD;把控制轉(zhuǎn)向VAR_WORD存儲(chǔ)單元中存放的地址處4、
段間間接轉(zhuǎn)移格式:JMP雙字存儲(chǔ)變量功能:將控制轉(zhuǎn)移到雙字存儲(chǔ)變量指定的地址,即將雙字存儲(chǔ)變量第二個(gè)字作為段地址,第一個(gè)字為偏移地址處繼續(xù)執(zhí)行。第7頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202385、段間直接轉(zhuǎn)移格式:JMP標(biāo)號(hào);標(biāo)號(hào)為FAR屬性例如:
CODE1SEGMENT∶JMPCODE2_NEXT∶CODE1ENDSCODE2SEGMENT∶CODE2_NEXTLABELFAR∶CODE2ENDS第8頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202396.3.3比較指令CMP指令(比較指令)格式:CMP目的操作數(shù),源操作數(shù)功能:CMP指令與SUB指令一樣執(zhí)行減法操作,即目的操作數(shù)減去源操作數(shù),但其結(jié)果不送回目的操作數(shù)。執(zhí)行指令后,兩個(gè)操作數(shù)保持原值不變。只是影響標(biāo)志位:
OF,CF,PF,SF,ZF,AF.注意:CMP指令后面往往會(huì)跟著一條條件轉(zhuǎn)移指令,根據(jù)比較結(jié)果產(chǎn)生不同的程序分支。第9頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023106.1.4條件轉(zhuǎn)移指令8086/8088提供了很多條件轉(zhuǎn)移指令,而且往往一條指令有好幾種助記符表示形式,歸納主要分成兩大類(lèi):·判斷兩數(shù)大小的條件轉(zhuǎn)移指令。·測(cè)試單個(gè)標(biāo)志位的條件轉(zhuǎn)移相令。1、比較兩個(gè)無(wú)符號(hào)數(shù),判斷無(wú)符號(hào)數(shù)大小的條件轉(zhuǎn)移指令1)JA/JNBE(jumpifnotbloworequal,orabove)
JA指令(高于轉(zhuǎn)移)
JNBE指令(不低于等于轉(zhuǎn)移)這是一條條件轉(zhuǎn)移指令的兩種助記符。當(dāng)兩個(gè)無(wú)符號(hào)數(shù)進(jìn)行比較時(shí),如果A>B成立則轉(zhuǎn)移。第10頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023112)JBE/JNA(jumpifbloworequal,ornotabove)
JBE指令(低于或等于轉(zhuǎn)移)
JNA指令(不高于轉(zhuǎn)移)當(dāng)兩個(gè)無(wú)符號(hào)數(shù)進(jìn)行比較時(shí),如果A≤B成立,則轉(zhuǎn)移3)JAE/JNB(jumpifnotblow,oraboveorequal)
JAE指令(高于等于轉(zhuǎn)移)
JNB指令(不低于轉(zhuǎn)移)當(dāng)兩個(gè)無(wú)符號(hào)數(shù)相比較時(shí),如果A≥B成立,則轉(zhuǎn)移。4)JB/JNAE(jumpifblow,ornotaboveorequal)
JB指令(低于轉(zhuǎn)移)
JNAE指令(不高于等于轉(zhuǎn)移)當(dāng)兩個(gè)無(wú)符號(hào)數(shù)相比較時(shí),如果A<B成立則轉(zhuǎn)移。第11頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023122、判斷帶符號(hào)數(shù)的大小的條件轉(zhuǎn)移指令1)JG/JNLE(jumpifgreater,ornotlessorequal)
JG指令(大于轉(zhuǎn)移)
JNLE措令(不小于等于轉(zhuǎn)移)當(dāng)兩個(gè)帶符號(hào)數(shù)相比較時(shí),如果A>B,則轉(zhuǎn)移到目標(biāo)地址。2)JGE/JNL(jumpifgreaterorequal,ornotless)
JGE指令(大于等于轉(zhuǎn)移)
JNL指令(不小于轉(zhuǎn)移)兩個(gè)帶符號(hào)數(shù)相比較時(shí),若A≥B,轉(zhuǎn)移到目標(biāo)地址第12頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023133)JL/JNGE(jumpifless,ornotgreaterorequal)
JL指令(小于轉(zhuǎn)移)
JNGE指令(不大于等于轉(zhuǎn)移)當(dāng)兩個(gè)帶符號(hào)數(shù)相比較時(shí),當(dāng)A<B時(shí),轉(zhuǎn)移到目標(biāo)地址。4)JLE/JNG(jumpiflessorequal,ornotgreater)
JLE指令(小于等于轉(zhuǎn)移)
JNG指令(不大于轉(zhuǎn)移)當(dāng)兩個(gè)帶符號(hào)數(shù)相比較時(shí),當(dāng)A≤B時(shí),轉(zhuǎn)移到目標(biāo)地址。2、判斷帶符號(hào)數(shù)的大小的條件轉(zhuǎn)移指令第13頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023143、測(cè)試單個(gè)標(biāo)志的條件轉(zhuǎn)移指令1)測(cè)試ZF
①JE/JZ(jumpifzero,orequal)
JE指令(相等則轉(zhuǎn)移)
JZ指令(等于0轉(zhuǎn)移)當(dāng)ZF=l時(shí)轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令的兩種助記符。它既適用于判斷無(wú)符號(hào)數(shù)的相等,又適用于判斷帶符號(hào)數(shù)的相等。②JNE/JNZ(jumpifnotzero,ornotequal)
JNE指令(不相等則轉(zhuǎn)移)
JNZ指令(不等于0轉(zhuǎn)移)當(dāng)ZF=0時(shí)轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令的兩種助記符。既適用于判斷有/無(wú)符號(hào)數(shù)的相等.第14頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023152)測(cè)試CF①JC(jumpifcarry)當(dāng)CF=1時(shí),轉(zhuǎn)移到目標(biāo)地址。②JNC(jumpifnotcarry)當(dāng)CF=0時(shí),轉(zhuǎn)移到目標(biāo)地址。3)測(cè)試SF①JS(jumpifsign)指令(為負(fù)轉(zhuǎn)移)當(dāng)SF=1時(shí),能轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令。②JNS(jumpifnotsign)指令(為正轉(zhuǎn)移)當(dāng)SF=0時(shí).能轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令4)測(cè)試PF①JP/JPE
指令(為偶轉(zhuǎn)移)PF=1時(shí),轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令的兩種助記符.第15頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202316②JNP/JPO
(為奇轉(zhuǎn)移)當(dāng)PF=0時(shí),轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令5)測(cè)試OF①JO(jumpifoverflow)指令(溢出轉(zhuǎn)移)當(dāng)滿足OF=1時(shí),轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令。②JNO(jumpifnotoverflow)指令(未溢出轉(zhuǎn)移)當(dāng)OF=0時(shí),轉(zhuǎn)移到目標(biāo)地址的條件轉(zhuǎn)移指令。第16頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202317單路分支:
在C語(yǔ)言中,單分支語(yǔ)句if(AL)<(BL)AL=BL;匯編語(yǔ)言實(shí)現(xiàn)方法:比較指令后面緊跟上條件轉(zhuǎn)移指令。CMPAL,BLJAEL1MOVAL,BLL1:…
反方向判斷第17頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202318例6.6求一組無(wú)符號(hào)數(shù)的最大值和最小值,分別放在存儲(chǔ)單元MAX和MIN中。DATASEGMENTADW349AH,567H,7802H,9031H,0002H,8671HMAXDW?MINDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
:;插入程序
MOVAH,4CHINT21HCODEENDSENDSTART第18頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202319MOVAX,0;AX用于存放最大值
MOVBX,0FFFFH;BX用于存放最小值
MOVSI,0MOVCX,6L1:CMPAX,A[SI]JAL2MOVAX,A[SI]L2:CMPBX,A[SI]JBL3MOVBX,A[SI]L3:INCSIINCSILOOPL1MOVMAX,AXMOVMIN,BX第19頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202320兩路分支程序舉例:
在C語(yǔ)言中,兩路分支表示如下:if(AL<BL)AL=BL;elseBL=AL;匯編語(yǔ)言實(shí)現(xiàn)兩路分支程序如下:CMPAL,BLJAEL1MOVAL,BLJMPL2L1:MOVBL,ALL2:…第20頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202321兩路分支程序舉例:例:將存放在AL中的十六進(jìn)制數(shù)字輸出
方法:利用0------30H-----OR30H9------39HA------41H------ADD37HB------42HF------47HCMPAL,9JAL1ORAL,30HJMPL2L1:ADDAL,37HL2:MOVDL,ALMOVAH,02HINT21H第21頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202322程序舉例:例6.5將0B4H-25H的結(jié)果用十六進(jìn)制輸出
方法二、利用0------30H-----OR30H9------39HA------41H------ADD37HB------42HF------47H第22頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202323MOVAL,DSUBAL,EMOVF,ALANDAL,0F0HMOVCL,4SHRAL,CLCMPAL,9JAL1ORAL,30HJMPL2L1:ADDAL,37HL2:MOVDL,ALMOVAH,02HINT21HMOVAL,FANDAL,0FHCMPAL,9JAL3ORAL,30HJMPL4L3:ADDAL,37HL4:MOVDL,ALMOVAH,02HINT21H第23頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202324程序舉例:例6.5將0B4H-25H的結(jié)果用十六進(jìn)制輸出
方法三、利用0------30H-----OR30H9------39HA------41H------OR30H
ADD7HB------42HF------47H第24頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202325MOVAL,DSUBAL,EMOVF,ALANDAL,0F0HMOVCL,4SHRAL,CL
ORAL,30HCMPAL,39HJBEL1ADDAL,7HL1:MOVDL,ALMOVAH,02HINT21HMOVAL,FANDAL,0FHORAL,30HCMPAL,39HJBEL2ADDAL,7HL2:MOVDL,ALMOVAH,02HINT21H第25頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023266.2循環(huán)程序設(shè)計(jì)JCXZ:當(dāng)CX為0時(shí)跳轉(zhuǎn)的條件轉(zhuǎn)移指令;LOOP:使CX的值遞減并且產(chǎn)生一個(gè)無(wú)條件跳轉(zhuǎn)的循環(huán)指令;LOOPE/LOOPZ,LOOPNE/LOOPNZ
條件循環(huán)迭代控制指令,根據(jù)零狀態(tài)標(biāo)志位的狀態(tài),決定是否繼續(xù)進(jìn)行循環(huán)操作。循環(huán)控制指令可用來(lái)控制循環(huán)。它們用CX寄存器作為計(jì)數(shù)器,來(lái)控制循環(huán)次數(shù)。并且都是短距離轉(zhuǎn)移指令。
第26頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023271、LOOP指令(執(zhí)行循環(huán)直到計(jì)數(shù)為0)格式:LOOP短距離標(biāo)號(hào)例如:L1:…..┆
LOOPL1功能:CX-1=>CX,若CX不為0,則將控制轉(zhuǎn)移到目標(biāo)操作數(shù)(指定標(biāo)號(hào)處);否則順序執(zhí)行LOOP指令之后的指令。程序舉例例6.l一組數(shù)求和,假設(shè)有20個(gè)16位二進(jìn)制數(shù),要對(duì)這20個(gè)數(shù)求和(假設(shè)和值<65536)程序如下:第27頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202328DATASEGMENTARRY DW123CH,3DH,100H,90H,345H,12H,DW0A5H,4BH,89H DW87H,234H,64H,35H,20H,21H,50H,DW88H,92H,11H,0FFHDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATAMOVDS,AX
第28頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202329MOVCX,20MOVSI,0MOVAX,0NEXT: ADDAX,ARRY[SI]INCSIINCSILOOPNEXTMOVAH,4CHINT21HCODEENDSENDSTART第29頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023302、LOOPE/LOOPZ(如果相等/如果為0則循環(huán))格式:LOOPE/LOOPZ短距離標(biāo)號(hào)功能:該指令將CX減1,若CX不為0且ZF置1(即CX≠0且運(yùn)算結(jié)果為0),則將控制轉(zhuǎn)移到目標(biāo)操作數(shù),否則:順序執(zhí)行LOOPE/LOOPZ指令之后的指令。第30頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202331例6.2在字節(jié)數(shù)組中找出第一個(gè)非零元素,并顯示輸出第一個(gè)非零元素的下標(biāo).程序如下:DATASEGMENTARRAYDB0,0,0,0,0,0,84,0,9,10COUNTEQU$-OFFSETARRAYDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEGIN: MOVAX,DATA MOVDS,AXMOVCX,COUNTMOVDI,-1第31頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202332NEXT:INCDICMPARRAY[DI],0LOOPZNEXTJNEOKMOVDL,‘N’;沒(méi)找到非零元素,顯示NJMPDISPLAYOK: MOVDX,DIORDL,30HDISPLAY:MOVAH,02HINT21HMOVAH,4CHINT21HCODEENDSENDBEGIN注意:
MOVDI,0NEXT:CMPARRAY[DI],0INCDILOOPZNEXT是錯(cuò)的,因?yàn)镮NCDI指令改變了ZF的值。第32頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023333、LOOPNE/LOOPNZ(不等/不為零,則循環(huán))格式:LOOPNE/LOOPNZ短距離標(biāo)號(hào)功能:該指令將CX減1,若CX不為0且ZF為0(即CX≠0且運(yùn)算結(jié)果不為0),則將控制轉(zhuǎn)移到指定標(biāo)號(hào);否則,順序執(zhí)行下一條指令。例6.3求兩個(gè)一維字?jǐn)?shù)組的和,數(shù)組元素個(gè)數(shù)為N,當(dāng)計(jì)算到兩個(gè)數(shù)組對(duì)應(yīng)元素之和為零時(shí)就停止求和,(假設(shè)數(shù)組元素為無(wú)符號(hào)二進(jìn)制數(shù))。其實(shí)現(xiàn)程序如下:DATASEGMENTARR1DW23H,34H,0,5H,66H,0,345H,567HARR2DW34H,24H,0,2H,44H,0,345H,56HNUM EQU$-OFFSETARRAY2SUM DW15DUP(?)DATAENDS第33頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202334CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVSI,0FFFEH ;-2=>SIMOVCX,NUMSHRCX,1 ;NUM/2=>CXNZERO:INCSIINCSIMOVAX,ARR1[SI]ADDAX,ARR2[SI]MOVSUM[SI],AXLOOPNZNZERODATASEGMENTARR1DW23H,34H,0,5H,66H,0,345H,567HARR2DW34H,24H,0,2H,44H,0,345H,56HNUM EQU$-OFFSETARRAY2SUM DW15DUP(?)DATAENDS第34頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202335JNZLMOVDL,’Y’JMPQL:MOVDL,’N’Q:MOVAH,02HINT21HMOVAH,4CHINT21HCODEENDSENDSTART3、JCXZ(CX為0轉(zhuǎn)移)格式:JCXZ短矩離標(biāo)號(hào)功能:JCXZ指令在CX等于0時(shí)將控制轉(zhuǎn)移到目標(biāo)操作數(shù)(目標(biāo)標(biāo)號(hào)處)。第35頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023366.3多重循環(huán)程序設(shè)計(jì)二重循環(huán)的參考格式:
MOVCX,COUNT1;外層循環(huán)計(jì)數(shù)值LOOPER1:….MOVBUF,CX;存外循環(huán)計(jì)數(shù)到BUFMOVCX,COUNT2;內(nèi)層循環(huán)計(jì)數(shù)值LOOPER2:….LOOPLOOPER2;內(nèi)層循環(huán)結(jié)束
MOVCX,BUF;恢復(fù)外層循環(huán)計(jì)數(shù)值
.LOOPLOOPER1;外層循環(huán)結(jié)束第36頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202337例題6.4:將N個(gè)不同的無(wú)符號(hào)數(shù)A0,A1,A2,…,
AN-1
由小到大排序。DATASEGMENTADB9,8,7,6,5,4,3,2,1,0COUNTEQU$-offsetADATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
MOVAH,4CHINT21HCODEENDSENDSTART第37頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202338MOVCX,COUNT-1;外循環(huán)循環(huán)COUNT-1次
MOVBX,0
LOOP1:MOVDX,CX;把CX的值暫時(shí)保存在DX中
MOVSI,1LOOP2:MOVAL,A[BX]CMPAL,A[BX+SI]JNAL1XCHGAL,A[BX+SI];交換A[BX]和A[BX+SI]值
MOVA[BX],ALL1:
INCSI
LOOPLOOP2INCBXMOVCX,DX;恢復(fù)CX的值
LOOPLOOP1
第38頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023396.4子程序6.4.1子程序定義用一對(duì)偽指令PROC/ENDP定義一個(gè)子程序(過(guò)程),其格式如下:
名稱(chēng)
PROC[NEAR/FAR]
RET
名稱(chēng)
ENDP6.4.2子程序調(diào)用與返回調(diào)用子程序用CALL指令,CALL指令將其下條指令的地址(返回地址)保存在堆棧里,將控制轉(zhuǎn)移到過(guò)程,執(zhí)行。當(dāng)執(zhí)行到RET指令時(shí),RET指令就會(huì)到堆棧里找到由CALL指令保存的返回地址,將控制返回調(diào)用(CALL)指令的下條指令.繼續(xù)運(yùn)行。第39頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202340調(diào)用子程序用CALL指令
示意如下:過(guò)程調(diào)用(主程序)過(guò)程定義(子程序)過(guò)程名PROCNEAR
┆┆CALL過(guò)程名RET┆
過(guò)程名ENDP6.4.3調(diào)用和返回指令1、CALL(調(diào)用)指令格式:CALL目的操作數(shù)具體格式與JMP指令相似,有四種格式:第40頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023411)段內(nèi)直接調(diào)用
CALL過(guò)程名(NEAR類(lèi)型)2)段內(nèi)間接調(diào)用
CALLWORDPTR[BX]3)段間直接調(diào)用
CALL過(guò)程名(FAR類(lèi)型)4)段間間接調(diào)用
CALLDWORDPTR[BX]CALL指令的功能是去啟動(dòng)一個(gè)過(guò)程.將其下條指令的偏移地址保存進(jìn)棧,以供過(guò)程定義中的RET能將控制轉(zhuǎn)回到CALL的下一條指令。第41頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023422、RET指令格式:RETRET彈出值功能:RET指令將控制從一個(gè)過(guò)程返回到調(diào)用該過(guò)程的CALL指令之后的指令(返回?cái)帱c(diǎn)處)。第42頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023436.4.4子程序舉例1、段內(nèi)子程序調(diào)用和子程序定義程序格式實(shí)例。
SEGXSEGMENTASSUME…START:∶
CALLSUBT∶∶
SUBTPROCNEAR∶
RETSUBTENDPSEGXENDSENDSTART第43頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202344例6.7求0A5H與43H之和,用十六進(jìn)制形式輸出,要求用子程序?qū)崿F(xiàn)。
DATASEGMENTADB0A5HBDB43HCDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
第44頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202345
MOVAL,AADDAL,BMOVC,ALMOVCL,4SHRAL,CLCALLBINIHEX;將AL中的十六進(jìn)制數(shù)輸出
MOVAL,CANDAL,0FHCALLBINIHEXMOVAH,4CHINT21H第45頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202346BINIHEXPROCNEAR;將AL中的一位十六進(jìn)制數(shù)轉(zhuǎn)
CMPAL,9;化為字符的ASCII碼輸出
JAL1ORAL,30HJMPL2L1:ADDAL,37HL2:MOVDL,ALMOVAH,02HINT21HRETBINIHEXENDPCODEENDSENDSTART第46頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202347例6.8程序要求從鍵盤(pán)輸入一個(gè)十進(jìn)制數(shù),然后把該數(shù)以十六進(jìn)制形式在屏幕上顯示出來(lái)。DECIHEXSEGMENTASSUMECS:DECIHEXREPEAT:CALLDECIBIN;鍵入十進(jìn)制數(shù)
CMPBX,0JEENDL
;等于零轉(zhuǎn)結(jié)束
CALLCRLF;顯示回車(chē)換行
CALLBINIHEX;輸出十六進(jìn)制數(shù)
CALLCRLF;顯示回車(chē)換行
JMPREPEAT;轉(zhuǎn)去繼續(xù)ENDL:MOVAH,4CH;返回DOSINT21H第47頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202348DECIBINPROCNEAR;從鍵盤(pán)鍵入一個(gè)十進(jìn)制數(shù)(限定數(shù)字0-9
MOVBX,0;如果輸入非0-9之間的字符,退出),化為二進(jìn)制數(shù)存入BX寄存器NEXT:MOVAH,01HINT21HCMPAL,30HJBEXITCMPAL,39HJAEXITANDAL,0FHXORAH,AH;AH清0XCHGAX,BXMOVCX,10MULCXXCHGAX,BXADDBX,AXJMPNEXTEXIT:RETDECIBINENDP第48頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202349BINIHEXPROCNEAR;將保存在BX的二進(jìn)制數(shù)用十六進(jìn)制輸出
MOVCX,4;需要輸出4個(gè)十六進(jìn)制位,用循環(huán)4次來(lái)實(shí)現(xiàn)NEXT1:ROLBX,1;將BX循環(huán)左移4位,既是將BX的高四位移到了低四位
ROLBX,1ROLBX,1ROLBX,1MOVDL,BLANDDL,0FH;截取低4位
CMPDL,9JAL1ORDL,30HJMPL2L1:ADDDL,37HL2:MOVAH,02HINT21HLOOPNEXT1RETBINIHEXENDP第49頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202350CRLFPROCNEARMOVDL,0DH;"回車(chē)"MOVAH,2INT21HMOVDL,0AH;"換行"INT21HRETCRLFENDPDECIHEXENDSENDREPEAT第50頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/2023512、段間子程序調(diào)用和子程序定義程序?qū)嵗?。SEGXSEGMENT∶SUBTPROCFAR∶RETSUBTENDP∶CALLSUBT∶SEGXENDSSEGYSEGMENT∶CALLSUBT∶SEGYENDS第51頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202352習(xí)題講解1.編寫(xiě)一個(gè)加密與解密0~9位字序列的程序,設(shè)0,1,2,3,4,5,6,7,8,9對(duì)應(yīng)的密碼表為9,0,8,2,7,4,6.3,1,5,鍵盤(pán)輸入任意一個(gè)4位數(shù)要求程序能夠馬上輸出這4位數(shù)對(duì)應(yīng)的密碼。例如:鍵盤(pán)輸入4925,顯示輸出7584。格式:XLAT換碼表或XLAT功能:[(BX)+(AL)]=>AL;即是用換碼表中一個(gè)字節(jié)的內(nèi)容置換AL寄存器的內(nèi)容。要求:在此指令之前,BX寄存器中存放換碼表的起始地址,AL的內(nèi)容為要換碼的字節(jié)在換碼表中的下標(biāo)。即是以[BX]為起點(diǎn)的換碼表中,以(AL)為相對(duì)位移,取一字節(jié)裝入AL。
第52頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202353DATAsegmentTAB_DADB9,0,8,2,7,4,6,3,1,5NUMDB4DUP(?)DATAendsCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
:
MOVAH,4CHINT21HCODEENDSENDSTART第53頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202354MOVSI,0MOVCX,4MOVBX,OFFSETTAB_DAL1:MOVAH,01HINT21HANDAL,0FHXLATTAB_DAMOVNUM[SI],ALINCSILOOPL1
MOVCX,4MOVSI,0L2:MOVDL,NUM[SI]ORDL,30HMOVAH,02HINT21HINCSILOOPL2
第54頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202355習(xí)題講解1.從鍵盤(pán)輸入一個(gè)十進(jìn)制數(shù),以回車(chē)(0DH)結(jié)束,將其轉(zhuǎn)換成它所代表的二進(jìn)制數(shù)據(jù),然后以十六進(jìn)制形式輸出。DATASEGMENTBUFDB?PROMPTDB'PLEASEENTERANUM<128:$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX第55頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202356MOVDX,OFFSETPROMPTMOVAH,09HINT21HMOVBUF,0IN_L:MOVAH,01HINT21HCMPAL,0DHJEOUT_LANDAL,0FHSALBUF,1MOVBL,BUFSALBUF,1SALBUF,1ADDBUF,BL第56頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202357ADDBUF,ALJMPIN_LOUT_L:MOVDL,0DHMOVAH,02HINT21HMOVDL,0AHMOVAH,02HINT21HMOVAL,BUFANDAL,0F0HMOVCL,4SHRAL,CLNEXT:CMPAL,9JAL1ORAL,30HJMPL2L1:ADDAL,37HL2:MOVDL,ALMOVAH,02HINT21H第57頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202358MOVAL,BUFANDAL,0FHNEXT2:CMPAL,9JAL3ORAL,30HJMPL4L3:ADDAL,37HL4:MOVDL,ALMOVAH,02HINT21H
MOVAH,4CHINT21HCODEENDSENDSTART第58頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202359習(xí)題講解3.鍵盤(pán)輸入一個(gè)一位加法表達(dá)式。1)按十進(jìn)制輸出其正確的結(jié)果。例如:7+8=15,2+3=05。2)按十六進(jìn)制輸出其正確結(jié)果。例如:7+8=0FH,2+3=05H。
第59頁(yè),共69頁(yè),2023年,2月20日,星期三5/4/202360DATASEGMENTBUFDB3DUP(?)PROMPTDB'PLEASEENTERAequation',0dh,0ah,'$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETPROMPTMOVAH,09HINT21H
第60頁(yè),共69頁(yè),2023年,2月20日,星期三5
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度倉(cāng)儲(chǔ)租賃合同范本(智能升級(jí)版)
- 2025年塑膠珠鏈行業(yè)深度研究分析報(bào)告
- 2025年度農(nóng)業(yè)科技園區(qū)入駐合同范本共
- 2025年度智能交通管理系統(tǒng)建設(shè)合同補(bǔ)充協(xié)議
- 2025年度個(gè)人向企業(yè)借款用于購(gòu)置房產(chǎn)合同樣本
- 2025年智能設(shè)備購(gòu)銷(xiāo)合同擔(dān)保模板標(biāo)準(zhǔn)版
- 2025年度教育設(shè)施建設(shè)承包合同封面標(biāo)準(zhǔn)版4篇
- 2025年度教育機(jī)構(gòu)教師派遣及培訓(xùn)合同
- 2025年度家具進(jìn)出口貿(mào)易代理合同-@-1
- 2025年度建筑工程保險(xiǎn)合同-@-1
- 服裝廠安全生產(chǎn)培訓(xùn)
- 城市隧道工程施工質(zhì)量驗(yàn)收規(guī)范
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招高職單招英語(yǔ)2016-2024年參考題庫(kù)含答案解析
- 五 100以內(nèi)的筆算加、減法2.筆算減法 第1課時(shí) 筆算減法課件2024-2025人教版一年級(jí)數(shù)學(xué)下冊(cè)
- 2025年八省聯(lián)考陜西高考生物試卷真題答案詳解(精校打印)
- 2025脫貧攻堅(jiān)工作計(jì)劃
- 借款人解除合同通知書(shū)(2024年版)
- 《血小板及其功能》課件
- 沐足店長(zhǎng)合同范例
- 《既有軌道交通盾構(gòu)隧道結(jié)構(gòu)安全保護(hù)技術(shù)規(guī)程》
- 初中物理22-23人大附中初三物理寒假作業(yè)及答案
評(píng)論
0/150
提交評(píng)論