《第4章分支程序設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《第4章分支程序設(shè)計(34頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第4章 分支程序設(shè)計第4章 分支程序設(shè)計4.1 條件標(biāo)志位的設(shè)置規(guī)則4.2 轉(zhuǎn)移指令4.2.1 無條件轉(zhuǎn)移指令4.2.2 條件轉(zhuǎn)移指令4.3 分支結(jié)構(gòu)程序設(shè)計 控制轉(zhuǎn)移類指令通過改變控制轉(zhuǎn)移類指令通過改變IP(和和CS)值,實現(xiàn)程序執(zhí)行順序的改變值,實現(xiàn)程序執(zhí)行順序的改變第4章 分支程序設(shè)計4.1 條件標(biāo)志位的設(shè)置規(guī)則決定轉(zhuǎn)移的標(biāo)志位(1)進位標(biāo)志CF當(dāng)無符號數(shù)運算結(jié)果的最高有效位有進位(加法)或借位(減法)時,進位標(biāo)志置1;否則置0(2)零標(biāo)志ZF若運算結(jié)果為0,則ZF=1;否則ZF=0(3)符號標(biāo)志SF運算結(jié)果最高位為1,則SF=1;否則SF=0(4)溢出標(biāo)志 OF 若無符號數(shù)運算的結(jié)果有
2、溢出,則OF1;否則 OF0(5)奇偶標(biāo)志 PF當(dāng)運算結(jié)果中“1”的個數(shù)為零或偶數(shù)時,PF=1;否則PF=0第4章 分支程序設(shè)計4.1 條件標(biāo)志位的設(shè)置規(guī)則MOV指令不影響標(biāo)志位;加減指令影響上述所有標(biāo)志,但增1和減1指令不影響CF;乘除指令只影響CF和OF設(shè)AX=78C4H,BX=9F35H.通過示例觀察每條指令執(zhí)行后對標(biāo)志位的影響CFSFOFZFPFADD AX,BX1000ADD AH,AL0110ADD AH,BL0100SUB AX,BXSUB BX,BXSUB AH,BH第4章 分支程序設(shè)計4.2.1 無條件轉(zhuǎn)移指令(OPD+2)CS注意注意:實實際際編編程程時時,匯匯編編程程序序
3、會會根根據(jù)據(jù)目目標(biāo)標(biāo)地地址址的的距距離離,自自動動處處理理成成短短轉(zhuǎn)轉(zhuǎn)移移、近近轉(zhuǎn)轉(zhuǎn)移移或遠轉(zhuǎn)移或遠轉(zhuǎn)移 程序員可用操作符程序員可用操作符short、near ptr 或或far ptr 強制強制返回首頁返回首頁JMP FAR PTR JMP FAR PTR 標(biāo)號標(biāo)號JMP NEAR PTR JMP NEAR PTR 標(biāo)號標(biāo)號JMP DWORD PTR OPDJMP DWORD PTR OPDJMP WORD PTR OPDJMP WORD PTR OPD第4章 分支程序設(shè)計例 請寫出下列轉(zhuǎn)移指令的尋址方式,并求出執(zhí)行該轉(zhuǎn)移指令后,IP寄存器、CS寄存器的內(nèi)容是什么?TABLE是字變量,變量的
4、值是100H;PROG是近標(biāo)號,表示偏移地址200H,ECX的內(nèi)容02D3 7650H,段屬性值為38E0H。當(dāng)前IP的內(nèi)容是1000H,CS的內(nèi)容是38ACH,DS的內(nèi)容是28E0H,BX的內(nèi)容是10H,DI的內(nèi)容是20H。JMP PROG JMP WORD PTR BX JMP DWORD PTR TABLEBX JMP ECX JMP FAR PTR PROG JMP BXDI 段間間接尋址執(zhí)行該指令后(IP)=(DS)*10H+(BX)+位移量)的低字=(28F10H)低字,(CS)=(DS)*10H+(BX)+位移量)的高字=(28F10H)高字 段間間接尋址,執(zhí)行該指令后(IP)=
5、(ECX)低字=7650H,(CS)=(ECX)高字=02D3H 段間直接尋址,執(zhí)行該指令后(IP)=(PROG)偏移屬性=0200H,(CS)=(PROG)段屬性=38E0H 段內(nèi)間接尋址,執(zhí)行該指令后(IP)=(DS)*10H+(BX)+(DI)=(28E00H+10H+20H)=(28E30H)段內(nèi)直接程序存儲器尋址執(zhí)行該指令后(IP)=(PROG)偏移屬性=0200H 段內(nèi)間接程序存儲器尋址執(zhí)行該指令后(IP)=(DS)*10H+(BX)=(28E00H+10H)=(28E10H)第4章 分支程序設(shè)計JMP指令:段內(nèi)直接轉(zhuǎn)移第4章 分支程序設(shè)計JMP指令:段內(nèi)寄存器間接轉(zhuǎn)移第4章 分支
6、程序設(shè)計JMP指令:段間直接轉(zhuǎn)移第4章 分支程序設(shè)計JMP指令:段間間接轉(zhuǎn)移第4章 分支程序設(shè)計4.2.2 條件轉(zhuǎn)移指令1簡單條件轉(zhuǎn)移指令2無符號數(shù)條件轉(zhuǎn)移指令3.有符號數(shù)條件轉(zhuǎn)移指令 格式格式:Jcc:Jcc 短標(biāo)號短標(biāo)號功能功能:指定的條件指定的條件cccc如果成立,程序轉(zhuǎn)移到由短標(biāo)號指定的如果成立,程序轉(zhuǎn)移到由短標(biāo)號指定的目標(biāo)地址去執(zhí)行指令;條件不成立,則程序?qū)㈨樞驁?zhí)行轉(zhuǎn)移目標(biāo)地址去執(zhí)行指令;條件不成立,則程序?qū)㈨樞驁?zhí)行轉(zhuǎn)移指令的下一條指令指令的下一條指令返回首頁返回首頁條件標(biāo)志位的設(shè)置規(guī)則條件標(biāo)志位的設(shè)置規(guī)則第4章 分支程序設(shè)計1簡單條件轉(zhuǎn)移指令例題例題4.1例題例題4.2例題例題4.
7、3例題例題4.4例題例題4.5第4章 分支程序設(shè)計2無符號數(shù)條件轉(zhuǎn)移指令【例】比較無符號數(shù)大小,將較大的數(shù)存放AX寄存器CMPAX,BX ;(AX)(BX)JNB NEXT ;若AX=BX,轉(zhuǎn)移到NEXTXCHGAX,BX ;若AX=BXAX=BX,轉(zhuǎn)移到,轉(zhuǎn)移到NEXTNEXTXCHGXCHGAXAX,BXBX;若;若AXBXAXBX,交換,交換NEXTNEXT:第4章 分支程序設(shè)計4.2 分支結(jié)構(gòu)程序設(shè)計4.2.1 匯編語言程序設(shè)計的一般步驟4.2.2 流程圖4.2.3 分支程序設(shè)計返回首頁返回首頁第4章 分支程序設(shè)計4.2.1 匯編語言程序設(shè)計的一般步驟匯編語言程序設(shè)計一般有以下幾個步驟
8、:1分析問題,確定算法2繪制流程圖3根據(jù)流程圖編制程序5調(diào)試程序返回本節(jié)返回本節(jié)第4章 分支程序設(shè)計4.2.2 流程圖1流程圖的概念流程圖是由特定的幾何圖形、指向線、文字說明來表示數(shù)據(jù)處理的步驟,形象描述邏輯控制結(jié)構(gòu)以及數(shù)據(jù)流程的示意圖。流程圖具有簡潔、明了、直觀的特點。2流程圖符號表示流程圖符號表示(1)起止框:表示程序的開始和結(jié)束。)起止框:表示程序的開始和結(jié)束。起止框起止框(2)判斷框)判斷框(3)處理框)處理框(4)調(diào)用框)調(diào)用框(5)指向線)指向線(6)連接框)連接框 返回本節(jié)返回本節(jié)第4章 分支程序設(shè)計4.2.3 分支程序設(shè)計一、用條件轉(zhuǎn)移指令實現(xiàn)程序分支二、多路分支練習(xí)分支程序根
9、據(jù)條件是真或假決定執(zhí)行不同的程序段分支程序根據(jù)條件是真或假決定執(zhí)行不同的程序段判斷的條件是各種指令,如判斷的條件是各種指令,如CMP、TEST等執(zhí)行后等執(zhí)行后形成的狀態(tài)標(biāo)志形成的狀態(tài)標(biāo)志通過轉(zhuǎn)移指令可以實現(xiàn)分支控制通過轉(zhuǎn)移指令可以實現(xiàn)分支控制返回本節(jié)返回本節(jié)第4章 分支程序設(shè)計一、用條件轉(zhuǎn)移指令實現(xiàn)程序分支1、單分支 例例4.64.6計算計算AXAX的絕對值的絕對值法法1:cmp ax,01:cmp ax,0 jns nonnegjns nonneg;分支條件:分支條件:AX0AX0 neg ax ;neg ax ;條件不滿足,求補條件不滿足,求補nonneg:nonneg:mov resul
10、t,axmov result,ax;條件滿足條件滿足 BadAx0?Ax求補n法法2:cmp ax,0 jl yesneg;分支條件:分支條件:AX0 jmp nonnegyesneg:neg ax ;條件不滿足,求補條件不滿足,求補nonneg:mov result,ax;條件滿足條件滿足第4章 分支程序設(shè)計【例4.7】無符號數(shù)除以2 將AX中存放的無符號數(shù)除以2,如果是奇數(shù),則加1后除以2 test ax,01htest ax,01h;測試測試AXAX最低位最低位jz evenjz even;最低位為最低位為0 0:AXAX為偶數(shù)為偶數(shù)add ax,1add ax,1;最低位為最低位為1
11、1:AXAX為奇數(shù),需要加為奇數(shù),需要加1 1even:even:rcr ax,1rcr ax,1;AXAX;AXAX2 2注意:如果采用注意:如果采用SHRSHR指令,則不能處理指令,則不能處理AXAXFFFFHFFFFH的特殊情況的特殊情況第4章 分支程序設(shè)計2、雙分支第4章 分支程序設(shè)計例、比較兩個字符串是否相等,等則顯示YES,不等時顯示NODATA SEGMENTS1 DB 1234GR9L1EQU$-S1S2 DB 1234GF5L2EQU$-S2RES1 DB YES,$RES2 DB NO,$DATA ENDSCODESEGMENTASSUME DS:DATA,CS:CODE
12、START:MOVAX,DATAMOV DS,AXMOV CX,L1CMP CX,L2JNZ RESULTNST:CLDLEA SI,S1LEA DI,S2REPZ CMPSBJNZ RESULTNLEA DX,RES1JMP DISPRESULTN:LEA DX,RES2DISP:MOV AH,9INT 21HMOV CX,4C00HINT 21HCODE ENDS END START第4章 分支程序設(shè)計【練習(xí)】試編一程序,求三個帶符號字?jǐn)?shù)據(jù)中的最大值,并將最大值存入MAX字單元中。設(shè)三個帶符號數(shù)分別在三個字變量X、Y、Z中存儲。STACSEGMENT STACK DB 200 DUP(0)
13、STACK ENDSDATASEGMENTX DW 00ABHY DW 5Z DW 200MAXDW?DATAENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE START:MOVAX,DATA MOVDS,AX MOVAX,X CMPAX,Y;XY?JG LL MOVAX,Y;YZ?LL:CMPAX,Z JG EXIT MOVAX,ZEXIT:MOVMAX,AX MOVAX,4C00H INT 21HCODE ENDS ENDSTART返回返回第4章 分支程序設(shè)計二、多分支程序設(shè)計1)由多個雙分支構(gòu)成多分支2)地址法表實現(xiàn)多分支3)轉(zhuǎn)移法表實現(xiàn)多分
14、支4)邏輯分解法實現(xiàn)多分支返回返回第4章 分支程序設(shè)計1)由多個雙分支構(gòu)成多分支 1X0Y=0X=0 -1X設(shè)輸入數(shù)據(jù)為X、輸出數(shù)據(jù)Y,且皆為字節(jié)變量。DATASEGMENTX DB -10Y DB?DATAENDSSTACK SEGMENT STACK DB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATA MOVDS,AX CMPX,0;與;與0進行比較進行比較 JSA2JNSA1;X0轉(zhuǎn)轉(zhuǎn)A1MOVY,0 JMPEXITA1:MOV Y,1 JMPEXITA2:MOVY,-1EX
15、IT:MOVAX,4C00H INT21H CODE ENDS ENDSTART返回本節(jié)返回本節(jié)Y=1Y=-1Y=0X0第4章 分支程序設(shè)計2)地址法表實現(xiàn)多分支將各分支程序段的入口地址依次存入數(shù)據(jù)段的一個表中,形成地址表。取各分支程序段的編號作為各分支入口地址的表地址的位移量。某程序段入口地址的表地址為:表地址=編號*2+入口地址首地址例如:從低到高逐位檢查一個字節(jié)數(shù)據(jù),找出第一個非例如:從低到高逐位檢查一個字節(jié)數(shù)據(jù),找出第一個非0位的位的數(shù),并顯示其位置數(shù),并顯示其位置DATASEGMENTNUMDB78HADDR DwAD0,AD1,AD2,AD3,AD4,AD5,AD6,AD7 DAT
16、AENDS右移1位顯示?=0?顯示相應(yīng)位數(shù)CF=0?取數(shù)第4章 分支程序設(shè)計CODE SEGMENTASSUME DS:DATA,CS:CODE START:MOVAX,DATAMOVDS,AXMOV AL,NUMMOVDL,?CMP AL,0JZEXIT MOV BX,0AGAIN:SHRAL,1JCNEXTINCBXJMPAGAINNEXT:SHLBX,1JMPADDRBXAD0:MOVDL,30HJMPEXITAD1:MOVDL,31HJMPEXITAD2:MOVDL,32HJMPEXIT AD3:MOVDL,33HJMPEXITAD4:MOVDL,34HJMPEXITAD5:MOVDL
17、,35HJMPEXITAD6:MOVDL,36HJMPEXITAD7:MOVDL,37HEXIT:MOV AH,2INT 21HMOVAX,4C00HINT21HCODE ENDSEND START返回本節(jié)返回本節(jié)右移1位顯示?=0?顯示相應(yīng)位數(shù)CF=0?取數(shù)第4章 分支程序設(shè)計3)轉(zhuǎn)移法表實現(xiàn)多分支【例4.9】設(shè)某程序有8路分支,試根據(jù)給定的N值(18),將程序的執(zhí)行轉(zhuǎn)移到其中的一路分支。多個條件對應(yīng)各自的分支語句體,哪個條件成立就轉(zhuǎn)入相應(yīng)分多個條件對應(yīng)各自的分支語句體,哪個條件成立就轉(zhuǎn)入相應(yīng)分支體執(zhí)行。多分支可以化解為雙分支或單分支結(jié)構(gòu)的組合支體執(zhí)行。多分支可以化解為雙分支或單分支結(jié)構(gòu)的組
18、合DATASEGMENT TAB DW P1,P2,P3,P4,P5,P6,P7,P8 N DB 5DATAENDSSTACK SEGMENT DB 200 DUP(0)STACK ENDSCODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START:MOVAX,DATAMOVDS,AX MOVAL,NDELALADDAL,ALMOVBL,ALMOVBH,0JMPTABBXP1:JMPEXITP2:JMPEXITP2:JMPEXITP3:JMPEXIT P8:EXIT:MOVAX,4C00H INT21HCODEENDS ENDSTART返回本節(jié)返回本節(jié)
19、無條件轉(zhuǎn)移指令的轉(zhuǎn)移地址采用的是變址尋址。若轉(zhuǎn)移地址用寄存器間無條件轉(zhuǎn)移指令的轉(zhuǎn)移地址采用的是變址尋址。若轉(zhuǎn)移地址用寄存器間接尋址或基址加變址尋址則應(yīng)如何修改程序接尋址或基址加變址尋址則應(yīng)如何修改程序?MOVAL,NDELALADDAL,ALMOVBL,ALMOVBH,0JMPTABBXP1:JMPEXITP2:JMPEXITLEA BX,TABMOV AH,0ADD BX,AXJMP BX第4章 分支程序設(shè)計4)邏輯分解法實現(xiàn)多分支按照條件的先后,依次分解成一串雙分支結(jié)構(gòu),然后按雙分支的方法進行程序設(shè)計例如:根據(jù)例如:根據(jù)NUM中的內(nèi)容執(zhí)行不同的操作中的內(nèi)容執(zhí)行不同的操作AL=0顯示1顯示0
20、AL=1顯示2AL=2顯示3AL=3DATASEGMENTNUM DB 2DATAENDSCODE SEGMENTASSUME DS:DATA,CS:CODE START:MOVAX,DATAMOVDS,AXMOV AL,NUMCMP AL,0JZNEXT0CMPAL,1JZNEXT1CMPAL,2JZNEXT2CMPAL,3JZNEXT3NEXT0:MOVDL,30HJMPEXITNEXT1:MOVDL,31HJMPEXITNEXT2:MOVDL,32HJMPEXITNEXT3:MOVDL,33HJMPEXITEXIT:MOV AH,2INT 21HMOVAX,4C00HINT21HCODE ENDSEND START返回本節(jié)返回本節(jié)第4章 分支程序設(shè)計練習(xí)1、用分支結(jié)構(gòu)實現(xiàn)將AL中的最高位內(nèi)容顯示出來2、若已定義整數(shù)變量A、B,編程實現(xiàn)如下功能1)若兩數(shù)一奇一偶,將奇數(shù)存入A,偶數(shù)存入B2)若兩數(shù)均是奇數(shù),則兩數(shù)均加1后存入原變量單元3)若兩數(shù)均是偶數(shù),則兩變量均不變TEST AL,80HJZ NT1MOV DL,31HJMP DISPNTI:MOV DL,30HDISP:MOV AH,2INT 21H返回返回