基本程序設(shè)計_第1頁
基本程序設(shè)計_第2頁
基本程序設(shè)計_第3頁
基本程序設(shè)計_第4頁
基本程序設(shè)計_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、基本程序設(shè)計第1頁,共58頁,2022年,5月20日,12點34分,星期二 基本程序設(shè)計是使用單一結(jié)構(gòu)的程序設(shè)計,它是程序設(shè)計的基礎(chǔ)。程序有三種基本結(jié)構(gòu),即順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。任何復(fù)雜的程序都是由基本結(jié)構(gòu)組成的。因此,一定要掌握基本程序設(shè)計的方法。對于匯編語言程序設(shè)計而言,更要掌握好基本程序的設(shè)計,這是編寫復(fù)雜程序的基礎(chǔ)。 本章將分別介紹各種基本程序設(shè)計的方法及子程序的設(shè)計。4.1 順序程序設(shè)計4.2 分支程序設(shè)計4.3 循環(huán)程序設(shè)計實訓(xùn)一 分支程序設(shè)計實訓(xùn)二 循環(huán)程序設(shè)計第4章 基本程序設(shè)計第2頁,共58頁,2022年,5月20日,12點34分,星期二 順序程序是最簡單程序設(shè)計,這

2、種程序不使用分支、循環(huán)結(jié)構(gòu),程序按順序執(zhí)行,只能完成相對簡單的操作。限于這種特點,在進行順序程序設(shè)計時應(yīng)合理安排指令的先后順序,以完成相應(yīng)的功能。 在較為復(fù)雜的程序中,順序程序是逐段出現(xiàn),它主要完成一些簡單操作或過程的準備、任務(wù)的過渡、結(jié)果的存儲及程序結(jié)束等。它是程序的基本組成部分。以下以結(jié)合幾個實例說明順序程序的基本方法,它們是以后各種復(fù)雜程序設(shè)計的基礎(chǔ)。4.1 順序程序設(shè)計返回本章首頁進入下一節(jié)第4章 基本程序設(shè)計第3頁,共58頁,2022年,5月20日,12點34分,星期二4.1.1 存儲單元內(nèi)容移位 存儲單元移位是指其中的內(nèi)容左移或右移若干位?,F(xiàn)舉例說明。 【例4.1 】 將AX寄存器

3、中的內(nèi)容左移2位,字存儲單元DAT中的內(nèi)容右移3位(移位后的空位補0). 分析:內(nèi)容移位一般由移位指令實現(xiàn),但要求移后空位為0,故應(yīng)使用邏輯移位指令。當(dāng)移位次數(shù)大于1時,可將移位次數(shù)放至CL中進行移位。操作如下:MOVCL,2 SHLAX,CLINCCLSHRDAT,CL第4章 基本程序設(shè)計第4頁,共58頁,2022年,5月20日,12點34分,星期二4.1.2 乘法運算 匯編語言本身也是比較靈活的,乘法運算可用乘法指令直接完成,有時候也可以由移位指令或加法指令完成。 【例4.2 】 將寄存器AL的內(nèi)容乘10,結(jié)果存至DX寄存器。 分析:對一個數(shù)進行乘10運算,可以直接使用乘法指令實現(xiàn),也可由

4、移位指令或加法指令實現(xiàn),方法分別如下: 1用乘法指令實現(xiàn)MOVBL,10IMUL BL;AXALBL=AL10MOVDX,AX第4章 基本程序設(shè)計第5頁,共58頁,2022年,5月20日,12點34分,星期二2用移位指令實現(xiàn) 移位操作時,在最高位不變化時,左移一位,相當(dāng)原數(shù)乘2,因此也可以用移位操作實現(xiàn)乘10運算。XORAH,AH;AH清零SALAX,1;AXAX2MOVBX,AX;存至BX寄存器MOVCL,2SALAX,CL;AXAX8ADDAX,BX;AXAX10第4章 基本程序設(shè)計第6頁,共58頁,2022年,5月20日,12點34分,星期二3用加法指令實現(xiàn) 一個數(shù)與自己相加可以實現(xiàn)乘2

5、運算,多次累加就可以實現(xiàn)乘10運算。MOVAH,0ADDAX,AX;AXAX2MOVBX,AX;存至BX寄存器ADDAX,AX;AXAX4ADDAX,AX;AXAX8ADDAX,BX;AXAX10第4章 基本程序設(shè)計第7頁,共58頁,2022年,5月20日,12點34分,星期二4.1.3 屏蔽與置位 對字節(jié)或字變量中的某些位進行置0操作,稱為屏蔽操作。使某些位強迫置1則是置位操作。它們是數(shù)據(jù)處理常用的方法。 【例4.3 】將字節(jié)類型變量DAT的高4位置0,其余各位保持不變。 解:屏蔽操作多用邏輯運算指令實現(xiàn).本例使用邏輯與指令完成。任何位與0相與,結(jié)果都為0,由此達到該位被屏蔽的目的。非屏蔽位

6、應(yīng)與1相與,以保證該位不變.MOVAL,DATANDAL,0FH;屏蔽高四位MOVDAT,AX第4章 基本程序設(shè)計第8頁,共58頁,2022年,5月20日,12點34分,星期二 通過邏輯運算指令也很容易實現(xiàn)字或字節(jié)的置位操作。一般使用邏輯或指令實現(xiàn)置位操作 。 例如把上例中DAT變量的高四位置1,用下面指令即實現(xiàn)即可:OR DAT,0F0H第4章 基本程序設(shè)計第9頁,共58頁,2022年,5月20日,12點34分,星期二4.1.4 拆字與合字 【例4.4 】將存儲單元DAT中兩位壓縮的BCD數(shù)拆成二個非壓縮BCD數(shù)(高位BCD數(shù)放在DAT+1單元,低位BCD數(shù)放在DAT+2單元)。分析:將DA

7、T單元中的BCD數(shù)拆開可用移位的方法。對高位BCD數(shù)可邏輯右移4位而成為非壓縮數(shù);低位BCD數(shù)可屏蔽其高四位而成為非壓縮BCD數(shù)。指令如下:MOVAL,DATMOVCL,4SHRAL,CL;得到高位BCD數(shù)MOVDAT+1,ALMOVAL,DATANDAL,0FH;得到低位BCD數(shù)MOVDAT+2,AL第4章 基本程序設(shè)計第10頁,共58頁,2022年,5月20日,12點34分,星期二 【例4.5】將存儲單元DAT1和DAT2中分別存有兩個非壓縮的BCD數(shù),將其合成一個壓縮BCD數(shù)(DAT1單元為高位BCD數(shù),DAT2單元為低位BCD數(shù)),結(jié)果存入DAT0單元。 分析:將兩個單元中的BCD數(shù)合

8、并可用加法指令與移位指令相結(jié)合的方法。其中高位BCD數(shù)可由DAT1單元數(shù)據(jù)邏輯左移4位得到;再與DAT2單元相加即可完成合并。指令如下:MOVAL,DAT0MOVCL,4SHLAL,CLADDAL,DAT1MOVDAT0,AL第4章 基本程序設(shè)計第11頁,共58頁,2022年,5月20日,12點34分,星期二4.1.5 數(shù)據(jù)與ASCII碼的相互轉(zhuǎn)換 編程中經(jīng)常要用到數(shù)據(jù)顯示的問題,通常的做法是將要顯示的數(shù)據(jù)轉(zhuǎn)換為ASCII碼后,再調(diào)用相關(guān)的中斷來顯示。在二、十、十六等常用進制的數(shù)據(jù)中,最為復(fù)雜的是十六進制數(shù)據(jù)的顯示,查閱ASCII表可知,數(shù)據(jù)09的ASC碼為該數(shù)據(jù)加上30H,數(shù)據(jù)AF的ASCI

9、I碼為該數(shù)據(jù)加上37H。對于從鍵盤上輸入的數(shù)據(jù),由于是以ASCII碼形式輸入的,通常轉(zhuǎn)換為數(shù)據(jù)本身再進行處理,其轉(zhuǎn)換的方法較多,但通常的方法是上述過程的逆過程,即對30H39H(09的ASC碼)減去30H,數(shù)據(jù)41H46H(AF的ASCII碼)減去37H。下面舉例說明。第4章 基本程序設(shè)計第12頁,共58頁,2022年,5月20日,12點34分,星期二 【例4.6】在字節(jié)存儲單元DAT中有兩位十六進制的數(shù)據(jù)為6AH,要求將該數(shù)據(jù)顯示到屏幕上。 分析:要實現(xiàn)該十六進制數(shù)據(jù)的顯示,一般是調(diào)用DOS或BIOS提供的中斷,而這些中斷幾乎都要求將要顯示的內(nèi)容轉(zhuǎn)換為ASCII碼。以下用DOS系統(tǒng)功能調(diào)用的

10、2號功能完成字符顯示。程序如下:DATASEGMENTDATDB6AHDATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA 第4章 基本程序設(shè)計第13頁,共58頁,2022年,5月20日,12點34分,星期二START: MOVAX,DATAMOVDS,AXMOVDL,DATMOVAL,DL;暫存至AL寄存器MOVCL,4SHRDL,CLADDDL,30H;高位十六進制數(shù)據(jù)6轉(zhuǎn)換為ASCII碼MOVAH,02HINT21H;顯示MOVDL,ALANDDL,0FHADDDL,37H;低位十六進制數(shù)據(jù)A轉(zhuǎn)換為ASCII碼INT21H;顯示MOVAH,4CHINT21H

11、CODEENDSENDSTART第4章 基本程序設(shè)計第14頁,共58頁,2022年,5月20日,12點34分,星期二4.1.6 簡單算術(shù)運算【例4.7 】在字存儲單元A、B和C中分別存放著一個有符號數(shù),求(C89HAB)/A,商和余數(shù)分別存入字存儲單元D和E。分析:直接用有符號數(shù)運算指令完成即可。程序如下:DATASEGMENTADW1234HBDW5678HCDW3456HDDW?EDW?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA第4章 基本程序設(shè)計第15頁,共58頁,2022年,5月20日,12點34分,星期二START: MOVAX,DATAMOV

12、DS,AXMOVAX,CSUBAX,89HCWD;擴展為雙字MOVCX,DXMOVBX,AX;結(jié)果暫存至CX,BXMOVAX,AIMULB;求ABADDAX,BXADCDX,CX;與前面結(jié)果相加IDIVA;AX是商,DX是余數(shù)MOVD,AXMOVE,DX;保存結(jié)果MOVAH,4CHINT21HCODEENDSENDSTART第4章 基本程序設(shè)計第16頁,共58頁,2022年,5月20日,12點34分,星期二4.1.7 查表【例4.8 】在以TABLE為首地址的內(nèi)存中順序存有010的平方數(shù)表。今從鍵盤上輸入一個數(shù)(11),求其平方值,結(jié)果保存至RSLT單元。分析:因為平方表已順序排放在內(nèi)存中。又

13、已知首地址TABLE,只要把輸入數(shù)據(jù)作為位移量與首址相加,就指向了表中平方值的地址,取其內(nèi)容即為該數(shù)的平方值。程序如下:DATASEGMENTTABLEDB 0,1,4,9,16,25,36,49,64,81,100RSLTDB?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA第4章 基本程序設(shè)計第17頁,共58頁,2022年,5月20日,12點34分,星期二START:MOVAX,DATAMOVDS,AXMOVAH,00HINT16H;輸入數(shù)據(jù)ANDAL,0FH;將ASCII碼轉(zhuǎn)換為數(shù)據(jù)XORBX,BXMOVBL,AL;存至BXLEASI,TABLEMOVA

14、L,SI+BX;查表MOVRSLT,AL;保存結(jié)果MOVAH,4CHINT21HCODEENDSENDSTART返回本章首頁第4章 基本程序設(shè)計第18頁,共58頁,2022年,5月20日,12點34分,星期二4.2 分支程序設(shè)計 分支程序使計算機具備判斷能力,計算機可以根據(jù)給定的條件進行判斷,并作出相應(yīng)的處理,它可以把程序分成不同的處理段,實現(xiàn)情況不同的處理,從而使計算機具有一定的思維能力。這是順序程序所能不能實現(xiàn)的。所以,分支程序是程序的重要組成結(jié)構(gòu)之一。匯編語言的分支主要由轉(zhuǎn)移指令實現(xiàn),而過多的轉(zhuǎn)移指令會使程序的結(jié)構(gòu)變得復(fù)雜,因而進行分支程序設(shè)計時進行合理安排是至關(guān)重要的。返回本章首頁返回

15、上一節(jié)進入下一節(jié)第4章 基本程序設(shè)計第19頁,共58頁,2022年,5月20日,12點34分,星期二4.2.1 單重分支 單重分支是最簡單的分支結(jié)構(gòu),如果條件成立則完成某項操作,否則執(zhí)行其它操作或后續(xù)指令。其結(jié)構(gòu)可以用圖4-1來表示。(a) 條件不成立執(zhí)行后續(xù)指令 (b)條件不同執(zhí)行不同操作 條件? 處理 Yes No 條件? 處理2 Yes No 處理1 第4章 基本程序設(shè)計第20頁,共58頁,2022年,5月20日,12點34分,星期二【例4.9 】在存儲單元DAT中存放著一位十六進制數(shù),將其顯示到屏幕上。分析:本題只需對該位十六進制數(shù)進行判斷,方法同例4.6相同。程序如下:DATASEG

16、MENTDATDB0CHDATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA第4章 基本程序設(shè)計第21頁,共58頁,2022年,5月20日,12點34分,星期二START:MOVAX,DATAMOV DS,AXMOVAL,DATCMPAL,9JGOTHRADDAL,30H;小于10則轉(zhuǎn)換為數(shù)字(09)JMPDISPOTHR: ADDAL,37H;大于10則轉(zhuǎn)換為大寫字母(AF)DISP:MOVDL,ALMOVAH,2INT21HDONE: MOVAH,4CHINT21HCODE ENDSENDSTART第4章 基本程序設(shè)計第22頁,共58頁,2022年,5月20日

17、,12點34分,星期二【例4.10 】 在字節(jié)存儲單元X、Y中各有一個無符號數(shù)。根據(jù)這兩個無符號數(shù)的大小,在屏幕顯示XY或XY。分析:兩個無符號數(shù)比較大小常用的方法是使用比較指令CMP,根據(jù)其對標志位的影響用無符號條件轉(zhuǎn)移指令實現(xiàn)轉(zhuǎn)移。程序如下:DATASEGMENTDAT0DB98HDAT1DB0A0HDATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA第4章 基本程序設(shè)計第23頁,共58頁,2022年,5月20日,12點34分,星期二START: MOVAX,DATAMOVDS,AXMOVAL,XCMPY,AL;比較JAYGX;X大則轉(zhuǎn)YGEXMOVAL,JM

18、PDISPYGX: MOVAL, DISP: MOVDL,X ;顯示比較結(jié)果MOVAH,2 INT21HMOVDL,ALINT21HMOVDL,YINT21HMOVAH,4CHINT21HCODE ENDSENDSTART第4章 基本程序設(shè)計第24頁,共58頁,2022年,5月20日,12點34分,星期二 本例中,根據(jù)比較結(jié)果影響CF標志位。利用JA指令實現(xiàn)分支轉(zhuǎn)移,即YX時轉(zhuǎn)YGDX。在分支處理中分別為顯示結(jié)果作準備(分別準備顯示XY或XY)。DISP標號開始的程序段是用來顯示結(jié)果的。第4章 基本程序設(shè)計第25頁,共58頁,2022年,5月20日,12點34分,星期二4.2.2 多重分支 在

19、程序設(shè)計中,更多的情況是對幾個條件同時進行判斷從而確定程序的轉(zhuǎn)移方向,此時只能采用數(shù)個單重分支的組合來完成,這就是多重分支結(jié)構(gòu)。 【例4.11 】編寫一程序,求: X+10H (X10)其中X、Y都是有符號字變量 分析:本題有三個條件進行判斷,故屬于多重分支程序設(shè)計。在進行較為復(fù)雜的分支程序設(shè)計時,應(yīng)先處理簡單分支,再處理復(fù)雜分支,這樣更方便編程。程序如下: 第4章 基本程序設(shè)計第26頁,共58頁,2022年,5月20日,12點34分,星期二STACKSEGMENT PARA STACK STACK DB 100 DUP(0)STACK ENDSDATASEGMENT XDW ?YDW ? D

20、ATAENDSCODESEGMENTASSUME CS: CODE,DS:DATASTART:MOV AX , DATAMOV DS , AXMOV AX , XCMP AX , 0JGECASE23ADDAX , 10H;第一種情況的計算結(jié)果JMP RESULT第4章 基本程序設(shè)計第27頁,共58頁,2022年,5月20日,12點34分,星期二CASE23:CMPAX , 10DJGCASE3MOVBX,30DIMULBX;第二種情況的計算結(jié)果JMPRESULTCASE3:SUBAX , 190H;第三種情況的計算結(jié)果RESULT:MOVY , AX;結(jié)果保存到變量Y中 MOVAH , 4C

21、HINT21HCODEENDSEND START第4章 基本程序設(shè)計第28頁,共58頁,2022年,5月20日,12點34分,星期二4.2.3 用地址表實現(xiàn)分支 當(dāng)程序分支比較復(fù)雜時,可將各分支的入口地址存于地址表中,以實現(xiàn)分支程序設(shè)計?!纠?.12 】從鍵盤上輸入一個數(shù)(5),求其平方值,結(jié)果保存至RSLT單元。 分析:本題可用例4.8的方法,也可以用地址表實現(xiàn)。程序如下:DATASEGMENTADDRDWC0,C1,C2,C3,C4RSLTDW?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA第4章 基本程序設(shè)計第29頁,共58頁,2022年,5月20日,

22、12點34分,星期二START:MOVAX,DATAMOVDS,AXAGAIN:MOVAH,00HINT16H;輸入數(shù)據(jù)CMPAL,0JBAGAINCMPAL,4JAAGAIN;不在04之間,重新輸入ANDAL,0FH;ASCII碼轉(zhuǎn)換為數(shù)據(jù)SHLAL,1;地址表為字類型,故乘2XORAH,AHLEABX,ADDRADDBX,AXJMPWORD PTRBX;用地址表實現(xiàn)分支第4章 基本程序設(shè)計第30頁,共58頁,2022年,5月20日,12點34分,星期二C0:MOVAL,0JMPSAVE;0的平方是0C1:MOVAL,1JMPSAVE;1的平方是1C2: MOVAL,2MOVBL,ALMUL

23、BLJMPSAVE;2的平方是2*2C3:MOVAL,3MOVBL,ALMULBLJMPSAVE;3的平方是3*3C4:MOVAL,4MOVBL,ALMULBL;4的平方是4*4SAVE: MOVRSLT,AX;保存MOVAH,4CHINT21HCODE ENDSENDSTART返回本章首頁第4章 基本程序設(shè)計第31頁,共58頁,2022年,5月20日,12點34分,星期二4.3 循環(huán)程序設(shè)計 在進行程序設(shè)計時,會出現(xiàn)某段程序反復(fù)多次執(zhí)行的情況,如果這段程序是連在一起反復(fù)執(zhí)行的,則可用循環(huán)程序結(jié)構(gòu)來實現(xiàn)。其方法是用重復(fù)次數(shù)或某個條件控制循環(huán)程序的執(zhí)行。采用循環(huán)程序結(jié)構(gòu)不僅使程序變得簡潔清晰,而

24、且減少程序?qū)?nèi)存的占用,因此,循環(huán)程序是重要的程序結(jié)構(gòu)之一。返回本章首頁返回上一節(jié)進入下一節(jié)第4章 基本程序設(shè)計第32頁,共58頁,2022年,5月20日,12點34分,星期二4.3.1 循環(huán)程序的結(jié)構(gòu) 循環(huán)程序是多種多樣的,但一般認為循環(huán)程序由四部分構(gòu)成: 1初始化部分 本部分主要為循環(huán)程序作準備工作,如置循環(huán)次數(shù)、地址指針或關(guān)鍵字,寄存器置初值及標志位設(shè)置等。 2循環(huán)工作部分 本部分是實際進行工作的部分,是循環(huán)結(jié)構(gòu)的主體。 3參數(shù)調(diào)整部分 本部分實現(xiàn)地址指針或循環(huán)次數(shù)的修改等,以便繼續(xù)循環(huán)。 4循環(huán)控制部分 本部分循環(huán)條件的檢查,以判斷是否繼續(xù)循環(huán)。 以上四部分中,2、3、4有時統(tǒng)稱為循環(huán)

25、體。循環(huán)程序根據(jù)循環(huán)控制條件的不同,通常又分兩種結(jié)構(gòu),如圖4-2所示。第4章 基本程序設(shè)計第33頁,共58頁,2022年,5月20日,12點34分,星期二(a) 先工作后判斷循環(huán)條件該結(jié)構(gòu)為后判斷型循環(huán),循環(huán)次數(shù)已知,多用LOOP指令等構(gòu)造循環(huán)。 初始化 循環(huán)條件滿足? 處 理 Yes No 第4章 基本程序設(shè)計第34頁,共58頁,2022年,5月20日,12點34分,星期二(b) 先判斷循環(huán)條件后工作 該結(jié)構(gòu)為先判斷型循環(huán),循環(huán)次數(shù)未知,多用條件轉(zhuǎn)移指令構(gòu)造循環(huán)。 初始化 No 循環(huán)條件滿足? 處理 Yes 第4章 基本程序設(shè)計第35頁,共58頁,2022年,5月20日,12點34分,星期二

26、4.3.2 單重循環(huán) 單重循環(huán)程序結(jié)構(gòu),程序中只有一個循環(huán)體,循環(huán)體內(nèi)不再含有其它循環(huán)體,下面舉例說明?!纠?.13 】求1400的所有偶數(shù)的和,結(jié)果保存到RSLT存儲單元。分析:1400間共有200個偶數(shù),故需要加200次,也就是說循環(huán)次數(shù)為200。由于程序中CX寄存器同時充當(dāng)了循環(huán)計數(shù)器和200個偶數(shù)值,使每一次循環(huán)CX的值減2,故CX初值為400。程序如下:DATASEGMENTRSLTDW?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA第4章 基本程序設(shè)計第36頁,共58頁,2022年,5月20日,12點34分,星期二START:MOVAX,DATA

27、MOVDS,AXMOVCX,400XORAX,AXNEXT:ADDAX,CX;計算偶數(shù)和DECCXDECCXJNZNEXT;200個數(shù)未完則繼續(xù)循環(huán)MOVRSLT,AX;保存結(jié)果MOVAH,4CHINT21HCODEENDSENDSTART第4章 基本程序設(shè)計第37頁,共58頁,2022年,5月20日,12點34分,星期二【例4.14 】在以DAT為首地址的字緩沖區(qū)中存有一批數(shù)據(jù),數(shù)據(jù)個數(shù)為10,編程找出其最大的值,結(jié)果存入RSLT單元。分析:求最大值通常采用逐個比較法,即把第一個數(shù)做比較標準,與其后的數(shù)比較。如標準數(shù)大,則再與下一個數(shù)比較;如果標準數(shù)小,則取大數(shù)做標準數(shù)。由于循環(huán)次數(shù)已知,故

28、可采用圖4-2(a)的結(jié)構(gòu)。程序如下:DATASEGMENTDATDW1234H,0ABH,0ABCDH,9999H,0DW1,5678H,0BBCCH,9876H,5678HRSLTDW?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA第4章 基本程序設(shè)計第38頁,共58頁,2022年,5月20日,12點34分,星期二START:MOVAX,DATAMOVDS,AXLEASI,DAT;SI做地址指針MOVAX,SIMOVCX,9;10個數(shù)共比較9次INCSIINCSINEXT:CMPAX,SIJGEGOON;AX大于下一個數(shù)則轉(zhuǎn)GOONMOVAX,SI;否則

29、將大值付給AXGOON:INCSIINCSI;修改地址指針LOOPNEXT;循環(huán)MOVRSLT,AX;保存結(jié)果MOVAH,4CHINT21HCODEENDSENDSTART第4章 基本程序設(shè)計第39頁,共58頁,2022年,5月20日,12點34分,星期二【例4.15 】在以DAT為首地址的字緩沖區(qū)中存有一批數(shù)據(jù),以*作為結(jié)束,編程找出其最大的值,結(jié)果存入RSLT單元。 分析:本例與例4.14的不同在于數(shù)據(jù)個數(shù)未知,但有一個條件知道,就是該批數(shù)據(jù)以*結(jié)束,故屬于條件控制循環(huán),循環(huán)次數(shù)未知的結(jié)構(gòu),即圖4-2(b)的結(jié)構(gòu)。程序如下:DATASEGMENTDATDW1234H,0ABH,0ABCDH

30、,9999H,0,1111H, 1010H DW 1,5678H,0BBCCH,9876H,5678H,0FFH,*RSLTDW?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA第4章 基本程序設(shè)計第40頁,共58頁,2022年,5月20日,12點34分,星期二START:MOVAX,DATAMOVDS,AXLEASI,DAT;SI做地址指針MOVAX,SINEXT:CMPWORD PTRSI,*JZSAVECMPAX,SIJGEGOON;AX大于下一個數(shù)則轉(zhuǎn)GOONMOVAX,SI;否則將大值付給AXGOON:ADDSI,2JMPNEXT;循環(huán)SAVE:MO

31、VRSLT,AX;保存結(jié)果MOVAH,4CHINT21HCODEENDSENDSTART第4章 基本程序設(shè)計第41頁,共58頁,2022年,5月20日,12點34分,星期二4.3.3 多重循環(huán) 程序設(shè)計中,有時單重循環(huán)不能完成一項工作,需用多重循環(huán)完成。多重循環(huán)就是循環(huán)體內(nèi)含有其它循環(huán)體的結(jié)構(gòu),也稱為循環(huán)嵌套。多重循環(huán)以雙重循環(huán)最為常用,內(nèi)外層的循環(huán)由程序員用跳轉(zhuǎn)指令控制,要注意不同循環(huán)體之間的界限。第4章 基本程序設(shè)計第42頁,共58頁,2022年,5月20日,12點34分,星期二0 1 2 3 4 5 6 7 8 9 A B C D E F 1 2 3 4 5 6 7 8 9 A B C

32、D E F 02 3 4 5 6 7 8 9 A B C D E F 0 13 4 5 6 7 8 9 A B C D E F 0 1 24 5 6 7 8 9 A B C D E F 0 1 2 35 6 7 8 9 A B C D E F 0 1 2 3 46 7 8 9 A B C D E F 0 1 2 3 4 5 7 8 9 A B C D E F 0 1 2 3 4 5 68 9 A B C D E F 0 1 2 3 4 5 6 79 A B C D E F 0 1 2 3 4 5 6 7 8A B C D E F 0 1 2 3 4 5 6 7 8 9B C D E F 0 1

33、 2 3 4 5 6 7 8 9 AC D E F 0 1 2 3 4 5 6 7 8 9 A BD E F 0 1 2 3 4 5 6 7 8 9 A B CE F 0 1 2 3 4 5 6 7 8 9 A B C DF 0 1 2 3 4 5 6 7 8 9 A B C D E【例4.16】在以STRG為首地址的緩沖區(qū)中存放著十六進制各位“0”“F”的ASCII碼,編程以下面的格式將這些數(shù)據(jù)顯示到屏幕上。第4章 基本程序設(shè)計第43頁,共58頁,2022年,5月20日,12點34分,星期二 分析:本題用雙重循環(huán)程序?qū)崿F(xiàn)是非常恰當(dāng)?shù)模瑑?nèi)循環(huán)實現(xiàn)每行18個數(shù)據(jù)的顯示(含回車與換行的ASCII碼

34、),外循環(huán)則控制顯示的行數(shù)16。程序如下:DATA SEGMENTSTRGDB30H,31H,32H,33H,34H,35H,36H,37H,38H,39HDB41H,42H,43H,44H,45H,46HDB30H,31H,32H,33H,34H,35H,36H,37H,38H,39HDB41H,42H,43H,44H,45H,46HDATA ENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDI,16;顯示行數(shù)為16XORBX,BX;BX清零第4章 基本程序設(shè)計第44頁,共58頁,2022年,5月20日,12點3

35、4分,星期二NEXT:LEASI,STRGADDSI,BX;BX寄存器用于調(diào)整數(shù)據(jù)位置MOVCX,16;每行顯示數(shù)據(jù)數(shù)MOVAH,2DISP:MOVDL,SIINT21HMOVDL,;數(shù)據(jù)間以空格相間隔INT21HINCSILOOPDISP;內(nèi)循環(huán) MOVDL,0AH;換行INT21HMOVDL,0DH;回車INT21HINCBXDECDIJNZNEXT;外循環(huán)MOVAH,4CHINT21HCODEENDSENDSTART第4章 基本程序設(shè)計返回本章首頁第45頁,共58頁,2022年,5月20日,12點34分,星期二實訓(xùn)一 分支程序設(shè)計 實訓(xùn)內(nèi)容:在存儲單元DAT中存放著一個字節(jié)數(shù)據(jù),判斷其是

36、否為十六進制數(shù)據(jù),如是,則將其以十六進制形式顯示到屏幕上,否則顯示“Not Hexadicimal”信息。 分析:本題只需對該數(shù)據(jù)進行判斷,如果大于等于0且小于等于15,則是十六進制數(shù)據(jù),轉(zhuǎn)換為相應(yīng)的ASCII碼即可顯示。方法同例4.9相似。如果不在上述范圍內(nèi),則顯示非十六進制信息。顯然這是一個分支程序。上機前,應(yīng)在硬盤上建立MASM子目錄,并將EDIT編輯程序、MASM匯編程序、LINK連接程序和DEBUG調(diào)試程序拷貝至該子目錄下(注:也可拷貝具有相似功能的其它版本的匯編調(diào)試程序)。整個上機過程如下:第4章 基本程序設(shè)計第46頁,共58頁,2022年,5月20日,12點34分,星期二1. 畫

37、出程序流程圖如圖4-3所示ALAL+37H顯示非十六制數(shù)據(jù)信息Y開始數(shù)據(jù)放入ALALAL+30H0?9?15?YNYNN顯示結(jié)束圖4-3 實訓(xùn)一程序流程圖 第4章 基本程序設(shè)計第47頁,共58頁,2022年,5月20日,12點34分,星期二2. 用編輯程序編輯源程序 設(shè)源程序名為SX1A.ASM.注意:源程序的擴展名必須是.ASM。編輯如下:C:MASMEDIT SX1A.ASM 在編輯環(huán)境下編輯源程序。 參考源程序如下:DATASEGMENTDATDB0CHMSGDBNot Hexadicimal.$DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA第4章 基

38、本程序設(shè)計第48頁,共58頁,2022年,5月20日,12點34分,星期二START:MOVAX,DATAMOV DS,AXMOVAL,DATCMPAL,0JLDISP2;小于0則轉(zhuǎn)到DISP2CMPAL,9JGOTHERADDAL,30H;小于10則轉(zhuǎn)換為數(shù)字(09)的ASCII碼JMPDISP1OTHER: CMPAL,0FHJGDISP2;大于15則轉(zhuǎn)到DISP2ADDAL,37H;大于10則轉(zhuǎn)換為大寫字母(AF)的ASCII碼DISP1:MOVDL,ALMOVAH,2INT21HJMPDONEDISP2:LEADX,MSG;顯示“Not Hexadicimal.”信息MOVAH,9IN

39、T21HDONE: MOVAH,4CHINT21HCODE ENDSENDSTART第4章 基本程序設(shè)計第49頁,共58頁,2022年,5月20日,12點34分,星期二3匯編源程序輸入以下命令行并按回車鍵:C:MASMMASM SX1AMicrosoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985,1987.All rights reserved.Source filename.ASM:Source listing NUL.LST:Cross-reference NUL.CRF:51698+417

40、454 Bytes symbol space free 0 Warning Errors 0 Severe Errors MASM匯編程序?qū)υ闯绦蜻M行二次掃描檢查,如無誤,則形成SX1A.OBJ目標文件。如果有錯誤,則提示錯誤出處和錯誤原因。大家也可以通過列表文件檢查錯誤。如果源程序有錯誤,則在EDIT中進行修正,重新匯編,直至正確無誤。第4章 基本程序設(shè)計第50頁,共58頁,2022年,5月20日,12點34分,星期二4連接目標文件形成可執(zhí)行文件輸入以下命令行并按回車鍵:C:MASMLINK SX1AMicrosoft (R)Overlay Linker Version 3.60Copyri

41、ght (C)Microsoft Corp 1985-1987.All rights reserved.Object Modules .OBJ:myfileRun File MYFILE.EXE:List File NUL-MAP:Libraries .LIB:Warning:no stack segment 則目標程序被連接為可執(zhí)行的.EXE文件。系統(tǒng)最后一行有一個警告信息,表示程序中沒有堆棧段,這并不影響程序的正常執(zhí)行,因為操作系統(tǒng)會自動為用戶程序分配堆??臻g。第4章 基本程序設(shè)計第51頁,共58頁,2022年,5月20日,12點34分,星期二5用DEBUG調(diào)試程序?qū)蓤?zhí)行文件進行分析調(diào)試

42、 雖然形成了SX1A.EXE 可執(zhí)行文件,但程序是否按題目要求完成各項功能還不能肯定,程序中可能還隱藏著某些錯誤,此時就應(yīng)該用DEBUG調(diào)試程序進行跟蹤調(diào)試了。輸入如下命令:C:MASMDEBUG SX1A.EXE- 出現(xiàn)DEBUG命令提示符后,就可以用DEBUG的各種命令進行跟蹤調(diào)試了。其中使用最多的是步跟蹤命令P及命令D等。如發(fā)現(xiàn)程序有隱含錯誤,則在EDIT中修正錯誤,重新匯編連接形成可執(zhí)行文件,再用DEBUG進行調(diào)試,直至正確無誤。最后,在DOS命令提示符下運行程序,結(jié)果如下:C第4章 基本程序設(shè)計返回本章首頁第52頁,共58頁,2022年,5月20日,12點34分,星期二實訓(xùn)二 循環(huán)程序設(shè)計 實訓(xùn)內(nèi)容:在以DAT為首地址的字數(shù)組中共有10個元素,都是無符號數(shù)。編程按從小到大的順序重新排列,結(jié)果存回原地址

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論