![匯編語言設(shè)計實踐:第5部分 基本匯編程序設(shè)計技術(shù)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/5/7dd16241-6962-4b13-a352-647ca3216db1/7dd16241-6962-4b13-a352-647ca3216db11.gif)
![匯編語言設(shè)計實踐:第5部分 基本匯編程序設(shè)計技術(shù)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/5/7dd16241-6962-4b13-a352-647ca3216db1/7dd16241-6962-4b13-a352-647ca3216db12.gif)
![匯編語言設(shè)計實踐:第5部分 基本匯編程序設(shè)計技術(shù)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/5/7dd16241-6962-4b13-a352-647ca3216db1/7dd16241-6962-4b13-a352-647ca3216db13.gif)
![匯編語言設(shè)計實踐:第5部分 基本匯編程序設(shè)計技術(shù)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/5/7dd16241-6962-4b13-a352-647ca3216db1/7dd16241-6962-4b13-a352-647ca3216db14.gif)
![匯編語言設(shè)計實踐:第5部分 基本匯編程序設(shè)計技術(shù)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/5/7dd16241-6962-4b13-a352-647ca3216db1/7dd16241-6962-4b13-a352-647ca3216db15.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1第五部分第五部分 順序、分支與循環(huán)程序設(shè)計順序、分支與循環(huán)程序設(shè)計 順序、分支、循環(huán)程序和子程序的設(shè)計是匯編語言程序設(shè)計的基本內(nèi)容。 一般源程序的基本結(jié)構(gòu):一般源程序的基本結(jié)構(gòu):順序程序順序程序分支程序分支程序循環(huán)程序循環(huán)程序2順序程序順序程序分支程序分支程序循環(huán)程序循環(huán)程序35.1 5.1 順序程序設(shè)計順序程序設(shè)計 順序程序是指程序的結(jié)構(gòu)從開始到結(jié)尾一直是順序執(zhí)行,中順序程序是指程序的結(jié)構(gòu)從開始到結(jié)尾一直是順序執(zhí)行,中途沒有分支。途沒有分支。例例 5.2.1 試編寫程序計算以下表達式試編寫程序計算以下表達式: 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ù)左移和右移實現(xiàn)可以使用算術(shù)左移和右移實現(xiàn) 2、其它非、其它非2n的乘除運算可以用移位和加減組合的乘除運算可以用移位和加減組合運算來實現(xiàn)。如運算來實現(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 ;指令做準備指令做準備 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 利用學號查學生的數(shù)學成績表。利用學號查學生的數(shù)學成績表。算法分析:算法分析:首先在數(shù)據(jù)段中建立一個成績表首先在數(shù)據(jù)段中建立一個成績表TABLE,在表中各學生的成績按照學號從小到大,在表中各學生的成績按照學號從小到大的順序存放。要查的學號存放在變量的順序存放。要查的學號存放在變量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 ;實際學號是從實際學號是從1開始的開始的 ADD BX,AX ;BX加上學號指向要查的成績加上學號指向要查的成績 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中,待中,待查項與表首址之間的字節(jié)距離查項與表首址之間的字節(jié)距離 (0255)送入送入AL中。中。14START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET TABLE ;為換碼指令做準備為換碼指令做準備 MOV AL,NUM ;為換碼指令做準備為換碼指令做準備 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í)行了兩個行了兩個無符號數(shù)無符號數(shù)A和和B的比較指令的比較指令CMP(或相減指令(或相減指令SUB)26二、分支程序設(shè)計二、分支程序設(shè)計分支程序的結(jié)構(gòu)有兩種常見結(jié)構(gòu):分支程序的結(jié)構(gòu)有兩種常見結(jié)構(gòu):1、用比較、用比較/測試指令測試指令+條件轉(zhuǎn)移指令實現(xiàn)分支條
10、件轉(zhuǎn)移指令實現(xiàn)分支比較指令:比較指令:CMP DEST,SRC 該指令的功能與減法指令該指令的功能與減法指令SUB相似,區(qū)別是相似,區(qū)別是(DEST)-(SRC)的差值不送入的差值不送入DEST。而其結(jié)果影響標志位。而其結(jié)果影響標志位。2、用跳轉(zhuǎn)表形成多路分支、用跳轉(zhuǎn)表形成多路分支1、用比較、用比較/測試指令測試指令+條件轉(zhuǎn)移指令實現(xiàn)分支條件轉(zhuǎn)移指令實現(xiàn)分支測試指令:測試指令:TEST DEST,SRC 該指令的功能與減法指令該指令的功能與減法指令AND相似,區(qū)別是相似,區(qū)別是(DEST) AND (SRC)的差值不送入的差值不送入DEST。而其結(jié)果影響標志位。而其結(jié)果影響標志位。27比較比較
11、/測試測試判定條件判定條件程序段程序段1程序段程序段2滿足滿足不滿足不滿足比較比較/測試測試判定條件判定條件程序段程序段不滿足不滿足滿足滿足IF-THEN-ELSEIF-ELSE28 例例5.3.2 數(shù)據(jù)段的數(shù)據(jù)段的ARY數(shù)組中存放有數(shù)組中存放有10個無符號數(shù),個無符號數(shù),試找出其中最大者送入試找出其中最大者送入MAX單元。單元。算法分析算法分析:依次比較相鄰兩數(shù)的大小,將較大的送入依次比較相鄰兩數(shù)的大小,將較大的送入AL中。中。每次比較后,較大數(shù)存放在每次比較后,較大數(shù)存放在AL中,相當于較大的數(shù)往中,相當于較大的數(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的第一個元素的第一個元素 MOV CX, 9 ;CX作次數(shù)計數(shù)器作次數(shù)計數(shù)器 MOV AL, SI ;取第一個元素到
13、取第一個元素到ALLOP: INC SI ;SI指向后一個元素指向后一個元素 CMP AL, SI ;比較兩個數(shù)比較兩個數(shù) JAE BIGER ;前元素前元素后元素轉(zhuǎn)移后元素轉(zhuǎn)移 MOV AL, SI ;取較大數(shù)到取較大數(shù)到ALBIGER:DEC CX ;減減1計數(shù)計數(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 編寫一程序,實現(xiàn)將存儲器中的源數(shù)據(jù)塊傳送到目編寫一程序,實現(xiàn)將存儲器中的源數(shù)據(jù)塊傳送到目的數(shù)據(jù)塊。的數(shù)據(jù)塊。源塊
14、首址源塊首址 目的塊首址目的塊首址目的塊目的塊源塊源塊0必須從數(shù)據(jù)塊必須從數(shù)據(jù)塊首址開始傳送首址開始傳送 在存儲器中兩個數(shù)據(jù)塊的存放有下列情況:兩個數(shù)據(jù)塊分在存儲器中兩個數(shù)據(jù)塊的存放有下列情況:兩個數(shù)據(jù)塊分離和有部分重疊。離和有部分重疊。兩個數(shù)據(jù)塊分離兩個數(shù)據(jù)塊分離目的塊目的塊源塊源塊0可以從首址或末可以從首址或末址開始傳送址開始傳送目的塊目的塊源塊源塊032三種相對位置情況的傳送方法:三種相對位置情況的傳送方法:因此,我們設(shè)定:當源塊首地址因此,我們設(shè)定:當源塊首地址目的塊首址的情目的塊首址的情況,必須從數(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)表形成多路分支當程序的分支數(shù)量較多時,采用跳轉(zhuǎn)表的方法可以使程序當程序的分支數(shù)量較多時,采用跳轉(zhuǎn)表的方法可以使程序長
17、度變短,長度變短, 跳轉(zhuǎn)表有兩種構(gòu)成方法:跳轉(zhuǎn)表有兩種構(gòu)成方法:(1)跳轉(zhuǎn)表用入口地址構(gòu)成)跳轉(zhuǎn)表用入口地址構(gòu)成 在程序中將各分支的入口地址組織成一個表放在數(shù)據(jù)段在程序中將各分支的入口地址組織成一個表放在數(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。當變量當變量N為為1時,轉(zhuǎn)移到時,轉(zhuǎn)移到BRAN1;N為為2時,轉(zhuǎn)移到時,轉(zhuǎn)移到BRAN2,依次類推。,依次類推。在跳轉(zhuǎn)表中每兩個字節(jié)存放一個入口地在跳轉(zhuǎn)表中每兩個字節(jié)存放一個入口地址的偏移量,如右圖所示。址的偏移量,如右圖所示。跳轉(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)表的每一個項目就是一條無條件轉(zhuǎn)移指令。跳轉(zhuǎn)表的每一個項目就是一條無條件轉(zhuǎn)移指令。這時跳轉(zhuǎn)表是代碼段中的一段程序。這時跳轉(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 ;四條指令實現(xiàn)四條指令實現(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)計數(shù)。循環(huán)控制指令寄存器做循環(huán)計數(shù)。循環(huán)控制指令的執(zhí)行對標志位沒有影響。的執(zhí)行對標志位沒有影響。5.3 循環(huán)程序設(shè)計循環(huán)程序設(shè)計一、循環(huán)控制指令一、循環(huán)控制指令48執(zhí)行一次執(zhí)行一次LOOP指令將使:指令將使:CX = (CX)-1若(若(CX)0 0,則轉(zhuǎn)到標號處執(zhí)行,否則順序執(zhí)行。,則轉(zhuǎn)到標號處執(zhí)行,否則順序執(zhí)行。1、LOOP指令指令格式:格式: LOOP 標號標號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的第一個元素的第一個元素 MOV CX,9 ;CX作循環(huán)次數(shù)計數(shù)作循環(huán)次數(shù)計數(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個個無符號數(shù),試找出其中最大者送入無符號數(shù),試找出其中最大者送入MAX單元。若使用單元。若使用循環(huán)指令,則程序
25、可修改如下:循環(huán)指令,則程序可修改如下:50指令執(zhí)行:指令執(zhí)行:CX = (CX)-1,若,若(CX) 00且且ZF=1ZF=1,則轉(zhuǎn)到目標,則轉(zhuǎn)到目標處執(zhí)行,否則順序執(zhí)行。處執(zhí)行,否則順序執(zhí)行。2、LOOPE / LOOPZ指令指令格式:格式:LOOPE 標標號號 或或 LOOPZ 標標號號51DATA SEGMENTSTRG DB CHECK NO_SPACE LENG EQU $STRGINDEX DB ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDS 例例 編寫一程序,在一字符串中查找第一個非空格字符,編寫一程序,
26、在一字符串中查找第一個非空格字符,并將其在字符串中的序號(并將其在字符串中的序號(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、空格字符且計數(shù)不為是空格字符且計數(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)到標號處執(zhí)行,否則順序執(zhí)行。轉(zhuǎn)到標號處執(zhí)行,否則順序執(zhí)行。3、LOOPNE / LOOPNZ指令指令
28、使用格式:使用格式:LOOPNE 標號標號 或或 LOOPNZ 標號標號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例:例: 編寫程序,計算兩個字節(jié)數(shù)組編寫程序,計算兩個字節(jié)數(shù)組ARY1ARY1和和ARY2ARY2對應(yīng)元素之和,一直計對應(yīng)元素之和,一直計算到兩數(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é)果并未計入長度結(jié)果并未計入長度ZERO: MOV NUM, BL ;存結(jié)果存結(jié)果 MOV AH, 4CH INT 21HCODE ENDS END BEGIN564、JCXZ指令指令指令格式:指令格式:JCXZ 標號標號 該指令測試該指令測試CX的內(nèi)容是否為的內(nèi)容是否為0,如果(,如果(CX)=0,則轉(zhuǎn),則轉(zhuǎn)移到標號處的指令,否則順序執(zhí)行。移到標號處的指令,否則順序執(zhí)行。它一般用在一個循環(huán)的開始,當一個循環(huán)的循環(huán)次數(shù)為它一般用在一個循環(huán)的開始,當一個循環(huán)的循環(huán)次數(shù)為0時,就不執(zhí)行該循環(huán)。通常配合其他幾條循環(huán)控制指令使時,就
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)程序中主要包括以下四個部分:在循環(huán)程序中主要包括以下四個部分: 用于建立循環(huán)的
32、初始狀態(tài)。包括:循環(huán)次數(shù)計數(shù)器、用于建立循環(huán)的初始狀態(tài)。包括:循環(huán)次數(shù)計數(shù)器、地址指針以及其他循環(huán)參數(shù)的初始設(shè)定。地址指針以及其他循環(huán)參數(shù)的初始設(shè)定。 循環(huán)程序完成的主要任務(wù)。包括工作部分和修改部分。循環(huán)程序完成的主要任務(wù)。包括工作部分和修改部分。工作部分工作部分:是完成循環(huán)程序任務(wù)的主要程序段。:是完成循環(huán)程序任務(wù)的主要程序段。修改部分修改部分:為循環(huán)的重復執(zhí)行,完成某些參數(shù)的修改。:為循環(huán)的重復執(zhí)行,完成某些參數(shù)的修改。1、初始化部分、初始化部分2、循環(huán)體、循環(huán)體60 判斷循環(huán)條件是否成立??梢杂幸韵聝煞N判斷方法:判斷循環(huán)條件是否成立??梢杂幸韵聝煞N判斷方法:(1)用計數(shù)控制循環(huán))用計數(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è)計三、單重循環(huán)程序設(shè)計常選用常選用CX作計數(shù)器,可選用作計數(shù)器,可選用LOOP、LOOPE或或LOOPNE等循環(huán)控制指令。等循環(huán)控制指令。1、計數(shù)控制循環(huán)、計數(shù)控制循環(huán)62 由于循環(huán)體中有由于循環(huán)體中有“+”和和“-”兩種兩種可能的運算,通過設(shè)置標志可能的運算,通過設(shè)置標志0(+)和和1(-)來判斷,低位表示低下標的運算。八來判斷,低位表示低下標的運算
34、。八個運算表達式由個運算表達式由8位邏輯尺:位邏輯尺:10011010B來識別。來識別。 例例 設(shè)有兩個數(shù)組設(shè)有兩個數(shù)組X和和Y,它們都有,它們都有8個元素,其元素按下標從小到大的順個元素,其元素按下標從小到大的順序存放在數(shù)據(jù)段中。試編寫程序完成序存放在數(shù)據(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=計數(shù)初值計數(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è)置標志設(shè)置標志0(+)和和1(-)來判斷,低位表示低下標的運算來判斷,低位表示低下標的運算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 ;初始化計數(shù)器初始化計數(shù)器 MOV SI,0 ;初始化指針初始化指針 MOV BL,LOGR ;初始化邏輯尺初始化邏輯尺64LOP: MOV AL,XSI SHR BL,1 ;標志位送標志位送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的個數(shù)的個數(shù)(含含1的個數(shù)的個數(shù)是指用二進制表示時是指用二進制表示時,有多少個有多少個1)統(tǒng)計出來,存入統(tǒng)計出來,存入CONT單元中單元中。 本例中通過將字單元各位逐本例中通過將字單元各位逐位移入最高位來判斷。為了減位移入最高位來判斷。為了減少循環(huán)次數(shù),循環(huán)中加上了判少循環(huán)次數(shù),循環(huán)中加上了判斷各位是否全為斷各位是否全為0,這樣可使低,這樣可使低位為全位為全0時的循環(huán)次數(shù)減少。時的循環(huán)次數(shù)減少。開開 始始計數(shù)器計數(shù)器CL置置0AX= (VARW)(AX)=0?計計1的個數(shù):的個數(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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教部編版歷史七年級下冊第10課 《蒙古族的興起與元朝的建立》 聽課評課記錄7
- 北師大版歷史八年級上冊第10課《新文化運動》聽課評課記錄
- 豬場購銷合同(2篇)
- 生產(chǎn)承包合同(2篇)
- 仁愛版八年級地理上冊3.2《土地資源》聽課評課記錄
- 八年級道德與法治下冊第四單元崇尚法治精神第七課尊重自由平等第1框自由平等的真諦聽課評課記錄(新人教版)
- 蘇科版數(shù)學七年級下冊10.2.1《二元一次方程組》聽評課記錄
- 冀教版數(shù)學七年級下冊《多項式乘多項式》聽評課記錄2
- 湘教版數(shù)學七年級上冊2.3《代數(shù)式的值》聽評課記錄
- 五年級數(shù)學下冊聽評課記錄《3.1 分數(shù)乘法(一)(4)》北師大版
- 固體廢棄物檢查記錄
- 工程設(shè)計費取費標準
- GB/T 5465.1-2009電氣設(shè)備用圖形符號第1部分:概述與分類
- 2023年遼寧鐵道職業(yè)技術(shù)學院高職單招(數(shù)學)試題庫含答案解析
- CAPP教學講解課件
- 自然環(huán)境的服務(wù)功能課件 高中地理人教版(2019)選擇性必修3
- 小耳畸形課件
- 新人教版初中初三中考數(shù)學總復習課件
- 機械制造有限公司組織架構(gòu)圖模板
- 8.3 摩擦力 同步練習-2021-2022學年人教版物理八年級下冊(Word版含答案)
- 生理學教學大綱
評論
0/150
提交評論