版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1第五部分第五部分 順序、分支與循環(huán)程序設(shè)計(jì)順序、分支與循環(huán)程序設(shè)計(jì) 順序、分支、循環(huán)程序和子程序的設(shè)計(jì)是匯編語言程序設(shè)計(jì)的基本內(nèi)容。 一般源程序的基本結(jié)構(gòu):一般源程序的基本結(jié)構(gòu):順序程序順序程序分支程序分支程序循環(huán)程序循環(huán)程序2順序程序順序程序分支程序分支程序循環(huán)程序循環(huán)程序35.1 5.1 順序程序設(shè)計(jì)順序程序設(shè)計(jì) 順序程序是指程序的結(jié)構(gòu)從開始到結(jié)尾一直是順序執(zhí)行,中順序程序是指程序的結(jié)構(gòu)從開始到結(jié)尾一直是順序執(zhí)行,中途沒有分支。途沒有分支。例例 5.2.1 試編寫程序計(jì)算以下表達(dá)式試編寫程序計(jì)算以下表達(dá)式: Z=(3X+Y-5)/2設(shè)設(shè)X、Y的值放在字變量的值放在字變量VARX、VARY
2、中,結(jié)果存放在中,結(jié)果存放在VARZ中。中。4AX3*VARXAX(AX)+VARYAX(AX)-5開始結(jié)束AX(AX)/2算法分析:算法分析: 1、乘、乘2n和除和除2n可以使用算術(shù)左移和右移實(shí)現(xiàn)可以使用算術(shù)左移和右移實(shí)現(xiàn) 2、其它非、其它非2n的乘除運(yùn)算可以用移位和加減組合的乘除運(yùn)算可以用移位和加減組合運(yùn)算來實(shí)現(xiàn)。如運(yùn)算來實(shí)現(xiàn)。如 3X可以分解成可以分解成2X+X5TITLE EQUATION COMPUTEDATA SEGMENT VARX DW 15 VARY DW 10 VARZ DW ?DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP (
3、0)STACK1 ENDS6CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA ; MOV DS,AX ;裝入裝入DS MOV AX,VARX SHL AX,1 ;2*X ADD AX,VARX ;3*X ADD AX,VARY ;3X+Y SUB AX,5 ;3*X+Y-5 SAR AX,1 ;(3*X+Y-5)/2 MOV VARZ,AX ;存結(jié)果存結(jié)果 MOV AH, 4CH INT 21H CODE ENDS END START7TITLE EQUATION COMPUTEDATA SEGMENTVARX DW
4、 15VARY DW 10VARZ DW ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP (0)STACK1 ENDS8CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1COMP PROC FAR ;設(shè)置為設(shè)置為FAR過程過程 PUSH DS ;為返回操作系統(tǒng)執(zhí)行為返回操作系統(tǒng)執(zhí)行INT 20H MOV AX,0 ;指令做準(zhǔn)備指令做準(zhǔn)備 PUSH AX ;立即數(shù)不能夠作為操作數(shù)立即數(shù)不能夠作為操作數(shù) MOV AX,DATA ; MOV DS,AX ;裝入裝入DS MOV AX,VARX SHL AX,1 ;2
5、*X ADD AX,VARX ;3*X ADD AX,VARY ;3X+Y SUB AX,5 ;3*X+Y-5 SAR AX,1 ;(3*X+Y-5)/2 MOV VARZ,AX ;存結(jié)果存結(jié)果 RET ;IP與與CS分別出棧分別出棧COMP ENDPCODE ENDS END COMP9 例例5.2.2 利用學(xué)號查學(xué)生的數(shù)學(xué)成績表。利用學(xué)號查學(xué)生的數(shù)學(xué)成績表。算法分析:算法分析:首先在數(shù)據(jù)段中建立一個(gè)成績表首先在數(shù)據(jù)段中建立一個(gè)成績表TABLE,在表中各學(xué)生的成績按照學(xué)號從小到大,在表中各學(xué)生的成績按照學(xué)號從小到大的順序存放。要查的學(xué)號存放在變量的順序存放。要查的學(xué)號存放在變量NUM中,查中
6、,查表的結(jié)果放在變量表的結(jié)果放在變量MATH中。中。1011 TITLE TABLE LOOKUPDATA SEGMENTTABLE DB 81, 78, 90, 64, 85, 76, 93, 82, 57, 80 DB 73, 62, 87, 77, 74, 86, 95, 91, 82, 71NUM DB 8MATH DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDS12COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1START: MOV AX,DATA ; MOV
7、DS,AX ;裝入裝入DS MOV BX,OFFSET TABLE ;BX指向表首址指向表首址 XOR AH,AH ;(AH)=0 MOV AL,NUM DEC AL ;實(shí)際學(xué)號是從實(shí)際學(xué)號是從1開始的開始的 ADD BX,AX ;BX加上學(xué)號指向要查的成績加上學(xué)號指向要查的成績 MOV AL,BX ;查到成績送查到成績送AL MOV MATH,AL ;存結(jié)果存結(jié)果 MOV AH,4CH ;返回返回DOS INT 21HCOSEG ENDS END START13在上述程序中,如果使用換碼指令在上述程序中,如果使用換碼指令XLAT,可以簡化程序。,可以簡化程序。XLAT 表首址表首址 ;功能為
8、:;功能為:AL=(BX)+(AL)換碼指令格式為:換碼指令格式為:其中表首址可以省略。其中表首址可以省略。在在XLAT指令執(zhí)行前,要求將表首址的偏移量送入指令執(zhí)行前,要求將表首址的偏移量送入BX中,待中,待查項(xiàng)與表首址之間的字節(jié)距離查項(xiàng)與表首址之間的字節(jié)距離 (0255)送入送入AL中。中。14START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET TABLE ;為換碼指令做準(zhǔn)備為換碼指令做準(zhǔn)備 MOV AL,NUM ;為換碼指令做準(zhǔn)備為換碼指令做準(zhǔn)備 DEC AL XLAT TABLE ;AL B 轉(zhuǎn)移轉(zhuǎn)移 JAE / JNB CF=0 或或 ZF=1 A B
9、 轉(zhuǎn)移轉(zhuǎn)移 JB /JNAE CF=1 且且 ZF=0 A B 轉(zhuǎn)移轉(zhuǎn)移 JGE / JNL SF=OF 或或 ZF=1 A B 轉(zhuǎn)移轉(zhuǎn)移 JL / JNGE SFOF 且且 ZF=0 A B 轉(zhuǎn)移轉(zhuǎn)移 JLE / JNG SFOF 或或 ZF=1 A B 轉(zhuǎn)移轉(zhuǎn)移(3) 帶符號數(shù)條件轉(zhuǎn)移指令帶符號數(shù)條件轉(zhuǎn)移指令在轉(zhuǎn)移指令之前執(zhí)在轉(zhuǎn)移指令之前執(zhí)行了兩個(gè)行了兩個(gè)無符號數(shù)無符號數(shù)A和和B的比較指令的比較指令CMP(或相減指令(或相減指令SUB)26二、分支程序設(shè)計(jì)二、分支程序設(shè)計(jì)分支程序的結(jié)構(gòu)有兩種常見結(jié)構(gòu):分支程序的結(jié)構(gòu)有兩種常見結(jié)構(gòu):1、用比較、用比較/測試指令測試指令+條件轉(zhuǎn)移指令實(shí)現(xiàn)分支條
10、件轉(zhuǎn)移指令實(shí)現(xiàn)分支比較指令:比較指令:CMP DEST,SRC 該指令的功能與減法指令該指令的功能與減法指令SUB相似,區(qū)別是相似,區(qū)別是(DEST)-(SRC)的差值不送入的差值不送入DEST。而其結(jié)果影響標(biāo)志位。而其結(jié)果影響標(biāo)志位。2、用跳轉(zhuǎn)表形成多路分支、用跳轉(zhuǎn)表形成多路分支1、用比較、用比較/測試指令測試指令+條件轉(zhuǎn)移指令實(shí)現(xiàn)分支條件轉(zhuǎn)移指令實(shí)現(xiàn)分支測試指令:測試指令:TEST DEST,SRC 該指令的功能與減法指令該指令的功能與減法指令A(yù)ND相似,區(qū)別是相似,區(qū)別是(DEST) AND (SRC)的差值不送入的差值不送入DEST。而其結(jié)果影響標(biāo)志位。而其結(jié)果影響標(biāo)志位。27比較比較
11、/測試測試判定條件判定條件程序段程序段1程序段程序段2滿足滿足不滿足不滿足比較比較/測試測試判定條件判定條件程序段程序段不滿足不滿足滿足滿足IF-THEN-ELSEIF-ELSE28 例例5.3.2 數(shù)據(jù)段的數(shù)據(jù)段的ARY數(shù)組中存放有數(shù)組中存放有10個(gè)無符號數(shù),個(gè)無符號數(shù),試找出其中最大者送入試找出其中最大者送入MAX單元。單元。算法分析算法分析:依次比較相鄰兩數(shù)的大小,將較大的送入依次比較相鄰兩數(shù)的大小,將較大的送入AL中。中。每次比較后,較大數(shù)存放在每次比較后,較大數(shù)存放在AL中,相當(dāng)于較大的數(shù)往中,相當(dāng)于較大的數(shù)往下傳。下傳。比較一共要做比較一共要做9次。次。比較結(jié)束后,比較結(jié)束后,AL
12、中存放的就是最大數(shù)。中存放的就是最大數(shù)。2930DATA SEGMENT ARY DB 17,5,40,0,67,12,34,78,32,10 MAX DB ?DATA ENDSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1BEGIN: MOV AX,DATA MOV DS,AX MOV SI, OFFSET ARY ; SI指向指向ARY的第一個(gè)元素的第一個(gè)元素 MOV CX, 9 ;CX作次數(shù)計(jì)數(shù)器作次數(shù)計(jì)數(shù)器 MOV AL, SI ;取第一個(gè)元素到
13、取第一個(gè)元素到ALLOP: INC SI ;SI指向后一個(gè)元素指向后一個(gè)元素 CMP AL, SI ;比較兩個(gè)數(shù)比較兩個(gè)數(shù) JAE BIGER ;前元素前元素后元素轉(zhuǎn)移后元素轉(zhuǎn)移 MOV AL, SI ;取較大數(shù)到取較大數(shù)到ALBIGER:DEC CX ;減減1計(jì)數(shù)計(jì)數(shù) JNZ LOP ;未比較完轉(zhuǎn)回去,否則順序執(zhí)行未比較完轉(zhuǎn)回去,否則順序執(zhí)行 MOV MAX, AL ;存最大數(shù)存最大數(shù) MOV AH,4CH INT 21HCODE ENDS END BEGIN31 例例5.3.4 編寫一程序,實(shí)現(xiàn)將存儲器中的源數(shù)據(jù)塊傳送到目編寫一程序,實(shí)現(xiàn)將存儲器中的源數(shù)據(jù)塊傳送到目的數(shù)據(jù)塊。的數(shù)據(jù)塊。源塊
14、首址源塊首址 目的塊首址目的塊首址目的塊目的塊源塊源塊0必須從數(shù)據(jù)塊必須從數(shù)據(jù)塊首址開始傳送首址開始傳送 在存儲器中兩個(gè)數(shù)據(jù)塊的存放有下列情況:兩個(gè)數(shù)據(jù)塊分在存儲器中兩個(gè)數(shù)據(jù)塊的存放有下列情況:兩個(gè)數(shù)據(jù)塊分離和有部分重疊。離和有部分重疊。兩個(gè)數(shù)據(jù)塊分離兩個(gè)數(shù)據(jù)塊分離目的塊目的塊源塊源塊0可以從首址或末可以從首址或末址開始傳送址開始傳送目的塊目的塊源塊源塊032三種相對位置情況的傳送方法:三種相對位置情況的傳送方法:因此,我們設(shè)定:當(dāng)源塊首地址因此,我們設(shè)定:當(dāng)源塊首地址目的塊首址的情目的塊首址的情況,必須從數(shù)據(jù)塊首址開始傳送。況,必須從數(shù)據(jù)塊首址開始傳送。 對于源塊與目的塊有重疊且源塊首址對于
15、源塊與目的塊有重疊且源塊首址目的塊首址的情目的塊首址的情況,必須從數(shù)據(jù)塊末址開始傳送。況,必須從數(shù)據(jù)塊末址開始傳送。33SI=源數(shù)據(jù)塊首址源數(shù)據(jù)塊首址DI=目的數(shù)據(jù)塊首址目的數(shù)據(jù)塊首址CX (DI) ?形成末址形成末址SI=(SI)+(CX)-1DI=(DI)+(CX)-1(DI)=(SI)SI=(SI)-1DI=(DI)-1CX=(CX)-1(CX)=0?(DI)=(SI)SI=(SI)+1DI=(DI)+1CX目的塊首址嗎?目的塊首址嗎? JA TOP ;大于則轉(zhuǎn)到大于則轉(zhuǎn)到TOP處,否則順序執(zhí)行處,否則順序執(zhí)行 ADD SI,LENG-1 ;SI指向源塊末址指向源塊末址 ADD DI,L
16、ENG-1 ;DI指向目的塊末址指向目的塊末址36BOTTOM: MOV AL,SI ;從末址開始傳送從末址開始傳送 MOV DI, AL DEC SI DEC DI DEC CX JNE BOTTOM JMP END1 TOP: MOV AL,SI ;從首址開始傳送從首址開始傳送 MOV DI,AL INC SI INC DI DEC CX JNE TOPEND1: MOV AH,4CH INT 21HCOSEG ENDS END BEGIN372、用跳轉(zhuǎn)表形成多路分支、用跳轉(zhuǎn)表形成多路分支當(dāng)程序的分支數(shù)量較多時(shí),采用跳轉(zhuǎn)表的方法可以使程序當(dāng)程序的分支數(shù)量較多時(shí),采用跳轉(zhuǎn)表的方法可以使程序長
17、度變短,長度變短, 跳轉(zhuǎn)表有兩種構(gòu)成方法:跳轉(zhuǎn)表有兩種構(gòu)成方法:(1)跳轉(zhuǎn)表用入口地址構(gòu)成)跳轉(zhuǎn)表用入口地址構(gòu)成 在程序中將各分支的入口地址組織成一個(gè)表放在數(shù)據(jù)段在程序中將各分支的入口地址組織成一個(gè)表放在數(shù)據(jù)段中,在程序中通過查表的方法獲得各分支的入口地址。中,在程序中通過查表的方法獲得各分支的入口地址。(2)跳轉(zhuǎn)表用無條件轉(zhuǎn)移指令構(gòu)成)跳轉(zhuǎn)表用無條件轉(zhuǎn)移指令構(gòu)成(1)跳轉(zhuǎn)表用入口地址構(gòu)成)跳轉(zhuǎn)表用入口地址構(gòu)成38例例5.3.5 設(shè)某程序有設(shè)某程序有10路分支,試根據(jù)變量路分支,試根據(jù)變量N的值(的值(110),),將程序轉(zhuǎn)移到其中的一路分支去。將程序轉(zhuǎn)移到其中的一路分支去。設(shè)設(shè)10路分支程序
18、段的入口地址分別為:路分支程序段的入口地址分別為:BRAN1、BRAN2.BRAN10。當(dāng)變量當(dāng)變量N為為1時(shí),轉(zhuǎn)移到時(shí),轉(zhuǎn)移到BRAN1;N為為2時(shí),轉(zhuǎn)移到時(shí),轉(zhuǎn)移到BRAN2,依次類推。,依次類推。在跳轉(zhuǎn)表中每兩個(gè)字節(jié)存放一個(gè)入口地在跳轉(zhuǎn)表中每兩個(gè)字節(jié)存放一個(gè)入口地址的偏移量,如右圖所示。址的偏移量,如右圖所示。跳轉(zhuǎn)表跳轉(zhuǎn)表程序中,先根據(jù)程序中,先根據(jù)N的值形成查表地址:的值形成查表地址:(N-1)2+表首址。表首址。39BX=表首址表首址求查表地址:求查表地址:BX=(N-1)*2+(BX)獲得入口地址:獲得入口地址:CX=(BX)(CX)=? 結(jié)結(jié) 束束N=1BRAN1N=2BRAN2
19、N=10BRAN10多路分支結(jié)構(gòu)流程圖多路分支結(jié)構(gòu)流程圖開開 始始40 TITLE JUMP TABLE OF ADDRESSDATA SEGMENTATABLE DW BRAN1,BRAN2,BRAN3,.,BRAN10N DB 3DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP (0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK1START: MOV AX, DATA MOV DS, AX41XOR AH,AHMOV AL,NDEC ALSHL AL,1MOV BX,OFFSET
20、 ATABLE ;BX指向表首址指向表首址ADD BX,AX ;BX指向查表地址指向查表地址 MOV CX,BX ;將將N對應(yīng)的分支入口地址送到對應(yīng)的分支入口地址送到CX中中JMP CX ;轉(zhuǎn)移到轉(zhuǎn)移到N對應(yīng)的分支入口地址對應(yīng)的分支入口地址42BRAN1: JMP END1BRAN2: JMP END1BRAN3: JMP END1 BRAN10:END1: MOV AH,4CH INT 21HCODE ENDS END START43 跳轉(zhuǎn)表的每一個(gè)項(xiàng)目就是一條無條件轉(zhuǎn)移指令。跳轉(zhuǎn)表的每一個(gè)項(xiàng)目就是一條無條件轉(zhuǎn)移指令。這時(shí)跳轉(zhuǎn)表是代碼段中的一段程序。這時(shí)跳轉(zhuǎn)表是代碼段中的一段程序。(2)跳轉(zhuǎn)
21、表用無條件轉(zhuǎn)移指令構(gòu)成)跳轉(zhuǎn)表用無條件轉(zhuǎn)移指令構(gòu)成44TITLE JUMP TABLE OF INSTRUCTIONDATA SEGMENTN DB 3DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA MOV DS,AX MOV BH,0 MOV BL,N 例例 5.3.5的源程序可修改為如下程序:的源程序可修改為如下程序:45 DEC BL ;四條指令實(shí)現(xiàn)四條指令實(shí)現(xiàn)(N-1)*3 MOV AL,B
22、L ;每一條指令都是每一條指令都是3字節(jié)編碼字節(jié)編碼 SHL BL,1 ADD BL,AL ADD BX,OFFSET ITABLE ;BX指向查表地址指向查表地址 JMP BX ;轉(zhuǎn)移到轉(zhuǎn)移到N對應(yīng)的對應(yīng)的JMP指令指令 ITABLE: JMP BRAN1 ;JMP指令構(gòu)成的跳轉(zhuǎn)表指令構(gòu)成的跳轉(zhuǎn)表 JMP BRAN2 ;每一條指令都是每一條指令都是3字節(jié)的編碼字節(jié)的編碼 JMP BRAN3 : : JMP BRAN1046BRAN1: . : JMP END1BRAN2: . : JMP END1 : :BRAN10: . : :END1: MOV AH,4CH INT 21HCODE EN
23、DS END START478086/8088指令系統(tǒng)中有指令系統(tǒng)中有4條循環(huán)控制指令條循環(huán)控制指令LOOP、LOOPZ、LOOPNZ與與JCXZ。 指令使用指令使用CX寄存器做循環(huán)計(jì)數(shù)。循環(huán)控制指令寄存器做循環(huán)計(jì)數(shù)。循環(huán)控制指令的執(zhí)行對標(biāo)志位沒有影響。的執(zhí)行對標(biāo)志位沒有影響。5.3 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)一、循環(huán)控制指令一、循環(huán)控制指令48執(zhí)行一次執(zhí)行一次LOOP指令將使:指令將使:CX = (CX)-1若(若(CX)0 0,則轉(zhuǎn)到標(biāo)號處執(zhí)行,否則順序執(zhí)行。,則轉(zhuǎn)到標(biāo)號處執(zhí)行,否則順序執(zhí)行。1、LOOP指令指令格式:格式: LOOP 標(biāo)號標(biāo)號49源程序結(jié)構(gòu)如下:源程序結(jié)構(gòu)如下:DATA S
24、EGMENT ARY DB 17,5,40,0,67,12,34,78,32,10MAX DB ?DATA ENDS MOV SI,OFFSET ARY ;SI指向指向ARY的第一個(gè)元素的第一個(gè)元素 MOV CX,9 ;CX作循環(huán)次數(shù)計(jì)數(shù)作循環(huán)次數(shù)計(jì)數(shù) MOV AL,SILOP: INC SI CMP AL,SI JAE BIGER MOV AL,SIBIGER:LOOP LOP MOV MAX,AL 在前面的例子在前面的例子中,中, 數(shù)據(jù)段的數(shù)據(jù)段的ARY數(shù)組中存放有數(shù)組中存放有10個(gè)個(gè)無符號數(shù),試找出其中最大者送入無符號數(shù),試找出其中最大者送入MAX單元。若使用單元。若使用循環(huán)指令,則程序
25、可修改如下:循環(huán)指令,則程序可修改如下:50指令執(zhí)行:指令執(zhí)行:CX = (CX)-1,若,若(CX) 00且且ZF=1ZF=1,則轉(zhuǎn)到目標(biāo),則轉(zhuǎn)到目標(biāo)處執(zhí)行,否則順序執(zhí)行。處執(zhí)行,否則順序執(zhí)行。2、LOOPE / LOOPZ指令指令格式:格式:LOOPE 標(biāo)標(biāo)號號 或或 LOOPZ 標(biāo)標(biāo)號號51DATA SEGMENTSTRG DB CHECK NO_SPACE LENG EQU $STRGINDEX DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDS 例例 編寫一程序,在一字符串中查找第一個(gè)非空格字符,編寫一程序,
26、在一字符串中查找第一個(gè)非空格字符,并將其在字符串中的序號(并將其在字符串中的序號(1 1n)n)送入送入INDEXINDEX單元中。若未找單元中。若未找到,則將到,則將INDEXINDEX單元置為全單元置為全1 1。52CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA MOV DS,AX MOV CX,LENG ;字符串長度送入字符串長度送入CX MOV BX,-1 ;設(shè)地址指針初值設(shè)地址指針初值NEXT: INC BX CMP STRGBX,20H ;空格的空格的ASCII碼為碼為20H LOOPE NEXT ;是
27、空格字符且計(jì)數(shù)不為是空格字符且計(jì)數(shù)不為0,繼續(xù)查找,繼續(xù)查找 JNZ FOUND ;找到非空格字符,轉(zhuǎn)找到非空格字符,轉(zhuǎn)FOUND MOV BL,0FFH ;未找到非空格字符未找到非空格字符 JMP END0FOUND: INC BL ;使位置序號從使位置序號從1開始開始END0: MOV INDEX,BL ;存結(jié)果存結(jié)果 MOV AH,4CH INT 21HCODE ENDS END START53 指令執(zhí)行:指令執(zhí)行:CX = (CX) 1,若,若(CX) 00且且ZF=0ZF=0,則,則轉(zhuǎn)到標(biāo)號處執(zhí)行,否則順序執(zhí)行。轉(zhuǎn)到標(biāo)號處執(zhí)行,否則順序執(zhí)行。3、LOOPNE / LOOPNZ指令指令
28、使用格式:使用格式:LOOPNE 標(biāo)號標(biāo)號 或或 LOOPNZ 標(biāo)號標(biāo)號54源程序如下:源程序如下:DATA SEGMENTARY1 DB 12,10,3,5,-1,7,34,8,9,10ARY2 DB 14,23,6,-2,1,9,45,21,8,24LENG EQU ARY2-ARY1SUM DB LENG DUP(?)NUM DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1BEGIN: MOV AX,DATA MOV DS
29、,AX例:例: 編寫程序,計(jì)算兩個(gè)字節(jié)數(shù)組編寫程序,計(jì)算兩個(gè)字節(jié)數(shù)組ARY1ARY1和和ARY2ARY2對應(yīng)元素之和,一直計(jì)對應(yīng)元素之和,一直計(jì)算到兩數(shù)之和為算到兩數(shù)之和為0 0或數(shù)組結(jié)束為止。并將和存入數(shù)組或數(shù)組結(jié)束為止。并將和存入數(shù)組SUMSUM中,將該數(shù)組中,將該數(shù)組的長度存放在的長度存放在NUMNUM單元中。單元中。55 MOV CX,LENG MOV BX,-1 ;設(shè)置指針初值設(shè)置指針初值NZERO: INC BX MOV AL, ARY1BX ;取被加數(shù)取被加數(shù) ADD AL, ARY2BX MOV SUMBX,AL LOOPNE NZERO ;和不為和不為0轉(zhuǎn)到轉(zhuǎn)到NZERO處處
30、 JZ ZERO ;和為和為0轉(zhuǎn)到轉(zhuǎn)到ZERO處處 INC BL ;0結(jié)果并未計(jì)入長度結(jié)果并未計(jì)入長度ZERO: MOV NUM, BL ;存結(jié)果存結(jié)果 MOV AH, 4CH INT 21HCODE ENDS END BEGIN564、JCXZ指令指令指令格式:指令格式:JCXZ 標(biāo)號標(biāo)號 該指令測試該指令測試CX的內(nèi)容是否為的內(nèi)容是否為0,如果(,如果(CX)=0,則轉(zhuǎn),則轉(zhuǎn)移到標(biāo)號處的指令,否則順序執(zhí)行。移到標(biāo)號處的指令,否則順序執(zhí)行。它一般用在一個(gè)循環(huán)的開始,當(dāng)一個(gè)循環(huán)的循環(huán)次數(shù)為它一般用在一個(gè)循環(huán)的開始,當(dāng)一個(gè)循環(huán)的循環(huán)次數(shù)為0時(shí),就不執(zhí)行該循環(huán)。通常配合其他幾條循環(huán)控制指令使時(shí),就
31、不執(zhí)行該循環(huán)。通常配合其他幾條循環(huán)控制指令使用。用。57程序結(jié)構(gòu)為:程序結(jié)構(gòu)為: . MOV CX,COUNT JCXZ NEXTLOP: . LOOP LOPNEXT: .58 二、循環(huán)程序的結(jié)構(gòu)二、循環(huán)程序的結(jié)構(gòu)循環(huán)程序有兩種結(jié)構(gòu)形式循環(huán)程序有兩種結(jié)構(gòu)形式1、先執(zhí)行后判斷結(jié)構(gòu)、先執(zhí)行后判斷結(jié)構(gòu)2、先判斷后執(zhí)行結(jié)構(gòu)、先判斷后執(zhí)行結(jié)構(gòu)循環(huán)初始化部分循環(huán)初始化部分循循 環(huán)環(huán) 體體控制條件控制條件結(jié)束處理部分結(jié)束處理部分NY循環(huán)初始化部分循環(huán)初始化部分控制條件控制條件結(jié)束處理部分結(jié)束處理部分循循 環(huán)環(huán) 體體NY59在循環(huán)程序中主要包括以下四個(gè)部分:在循環(huán)程序中主要包括以下四個(gè)部分: 用于建立循環(huán)的
32、初始狀態(tài)。包括:循環(huán)次數(shù)計(jì)數(shù)器、用于建立循環(huán)的初始狀態(tài)。包括:循環(huán)次數(shù)計(jì)數(shù)器、地址指針以及其他循環(huán)參數(shù)的初始設(shè)定。地址指針以及其他循環(huán)參數(shù)的初始設(shè)定。 循環(huán)程序完成的主要任務(wù)。包括工作部分和修改部分。循環(huán)程序完成的主要任務(wù)。包括工作部分和修改部分。工作部分工作部分:是完成循環(huán)程序任務(wù)的主要程序段。:是完成循環(huán)程序任務(wù)的主要程序段。修改部分修改部分:為循環(huán)的重復(fù)執(zhí)行,完成某些參數(shù)的修改。:為循環(huán)的重復(fù)執(zhí)行,完成某些參數(shù)的修改。1、初始化部分、初始化部分2、循環(huán)體、循環(huán)體60 判斷循環(huán)條件是否成立。可以有以下兩種判斷方法:判斷循環(huán)條件是否成立。可以有以下兩種判斷方法:(1)用計(jì)數(shù)控制循環(huán))用計(jì)數(shù)控
33、制循環(huán)循環(huán)次數(shù)已知循環(huán)次數(shù)已知 (2)用條件控制循環(huán))用條件控制循環(huán)循環(huán)次數(shù)未知循環(huán)次數(shù)未知處理循環(huán)結(jié)束后的結(jié)果。如存儲結(jié)果等。處理循環(huán)結(jié)束后的結(jié)果。如存儲結(jié)果等。3、循環(huán)控制部分、循環(huán)控制部分4、結(jié)束處理部分、結(jié)束處理部分61三、單重循環(huán)程序設(shè)計(jì)三、單重循環(huán)程序設(shè)計(jì)常選用常選用CX作計(jì)數(shù)器,可選用作計(jì)數(shù)器,可選用LOOP、LOOPE或或LOOPNE等循環(huán)控制指令。等循環(huán)控制指令。1、計(jì)數(shù)控制循環(huán)、計(jì)數(shù)控制循環(huán)62 由于循環(huán)體中有由于循環(huán)體中有“+”和和“-”兩種兩種可能的運(yùn)算,通過設(shè)置標(biāo)志可能的運(yùn)算,通過設(shè)置標(biāo)志0(+)和和1(-)來判斷,低位表示低下標(biāo)的運(yùn)算。八來判斷,低位表示低下標(biāo)的運(yùn)算
34、。八個(gè)運(yùn)算表達(dá)式由個(gè)運(yùn)算表達(dá)式由8位邏輯尺:位邏輯尺:10011010B來識別。來識別。 例例 設(shè)有兩個(gè)數(shù)組設(shè)有兩個(gè)數(shù)組X和和Y,它們都有,它們都有8個(gè)元素,其元素按下標(biāo)從小到大的順個(gè)元素,其元素按下標(biāo)從小到大的順序存放在數(shù)據(jù)段中。試編寫程序完成序存放在數(shù)據(jù)段中。試編寫程序完成下列計(jì)算:下列計(jì)算:Z1=X1+Y1 Z2=X2-Y2 Z3=X3+Y3 Z4=X4-Y4 Z5=X5-Y5 Z6=X6+Y6Z7=X7+Y7 Z8=X8-Y8開始開始初始化:置指針初始化:置指針SI=0; CX=計(jì)數(shù)初值計(jì)數(shù)初值BL=邏輯尺邏輯尺BL右移一位到右移一位到CFCF=?XiYiXi+YiZi=結(jié)果結(jié)果修改指
35、針:修改指針:SI=(SI)+1CX= (CX)-1(cx)=0?結(jié)束結(jié)束=1=0NY63DATA SEGMENTX DB 0A2H,7CH,34H,9FH,0F4H,10H,39H,5BHY DB 14H,05BH,28H,7AH,0EH,13H,46H,2CHLEN EQU $ -YZ DB LEN DUP(?)LOGR DB 10011010B;設(shè)置標(biāo)志設(shè)置標(biāo)志0(+)和和1(-)來判斷,低位表示低下標(biāo)的運(yùn)算來判斷,低位表示低下標(biāo)的運(yùn)算DATA ENDSSTACK0 SEGMENT PARA STACK DW 20H DUP(0)STACK0 ENDSCOSEG SEGMENT ASSU
36、ME CS:COSEG,DS:DATA,SS:STACK0BEGIN: MOV AX,DATA MOV DS,AX MOV CX,LEN ;初始化計(jì)數(shù)器初始化計(jì)數(shù)器 MOV SI,0 ;初始化指針初始化指針 MOV BL,LOGR ;初始化邏輯尺初始化邏輯尺64LOP: MOV AL,XSI SHR BL,1 ;標(biāo)志位送標(biāo)志位送CF JC SUB1 ;為為1,轉(zhuǎn)做減法,轉(zhuǎn)做減法 ADD AL,YSI ;為為0,做加法,做加法 JMP RESSUB1: SUB AL,YSIRES: MOV ZSI,AL ;存結(jié)果;存結(jié)果 INC SI ;修改指針;修改指針 LOOP LOP MOV AH,4CH
37、 INT 21HCOSEG ENDS END BEGIN652、條件控制循環(huán)、條件控制循環(huán) 例例 編寫一程序,將字單元編寫一程序,將字單元VARW 中含中含1的個(gè)數(shù)的個(gè)數(shù)(含含1的個(gè)數(shù)的個(gè)數(shù)是指用二進(jìn)制表示時(shí)是指用二進(jìn)制表示時(shí),有多少個(gè)有多少個(gè)1)統(tǒng)計(jì)出來,存入統(tǒng)計(jì)出來,存入CONT單元中單元中。 本例中通過將字單元各位逐本例中通過將字單元各位逐位移入最高位來判斷。為了減位移入最高位來判斷。為了減少循環(huán)次數(shù),循環(huán)中加上了判少循環(huán)次數(shù),循環(huán)中加上了判斷各位是否全為斷各位是否全為0,這樣可使低,這樣可使低位為全位為全0時(shí)的循環(huán)次數(shù)減少。時(shí)的循環(huán)次數(shù)減少。開開 始始計(jì)數(shù)器計(jì)數(shù)器CL置置0AX= (VARW)(AX)=0?計(jì)計(jì)1的個(gè)數(shù):的個(gè)數(shù):CL= (CL)+1AX左移一位左移一位存結(jié)果存結(jié)果:CUNT= (CL)結(jié)結(jié) 束束(AX)15=1?YNNY66DATA SEGMENTVARW DW 1101010010001000BCONT DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專項(xiàng)幕墻安裝2024協(xié)議范本版
- 組織行為分析與應(yīng)用
- 專業(yè)舞臺燈光購銷協(xié)議一
- 專業(yè)維修服務(wù)協(xié)議樣本2024版B版
- 2025年度場監(jiān)督管理局委托執(zhí)法事項(xiàng)責(zé)任書4篇
- 2025年度廠房設(shè)備租賃及維護(hù)管理合同范本4篇
- 2024版小區(qū)公共服務(wù)設(shè)施施工協(xié)議樣本一
- 2024版特定企業(yè)融資咨詢與服務(wù)協(xié)議版
- 2025年度戶外廣告場地租賃終止協(xié)議書4篇
- 專用肥料國內(nèi)運(yùn)輸合同標(biāo)準(zhǔn)文本2024版版
- 2024年08月云南省農(nóng)村信用社秋季校園招考750名工作人員筆試歷年參考題庫附帶答案詳解
- 防詐騙安全知識培訓(xùn)課件
- 心肺復(fù)蘇課件2024
- 2024年股東股權(quán)繼承轉(zhuǎn)讓協(xié)議3篇
- 2024-2025學(xué)年江蘇省南京市高二上冊期末數(shù)學(xué)檢測試卷(含解析)
- 四川省名校2025屆高三第二次模擬考試英語試卷含解析
- 《城鎮(zhèn)燃?xì)忸I(lǐng)域重大隱患判定指導(dǎo)手冊》專題培訓(xùn)
- 湖南財(cái)政經(jīng)濟(jì)學(xué)院專升本管理學(xué)真題
- 考研有機(jī)化學(xué)重點(diǎn)
- 全國身份證前六位、區(qū)號、郵編-編碼大全
- 《GPU體系結(jié)構(gòu)》課件2
評論
0/150
提交評論