Ch程序基本結(jié)構(gòu)及其程序設(shè)計(jì)_第1頁
Ch程序基本結(jié)構(gòu)及其程序設(shè)計(jì)_第2頁
Ch程序基本結(jié)構(gòu)及其程序設(shè)計(jì)_第3頁
Ch程序基本結(jié)構(gòu)及其程序設(shè)計(jì)_第4頁
Ch程序基本結(jié)構(gòu)及其程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第五章程序基本結(jié)構(gòu)及其程序設(shè)計(jì) 軟件開發(fā)按照軟件工程的方法進(jìn)行,主要包括:系統(tǒng)分析:對(duì)用戶的需求進(jìn)行分析并最終對(duì)問題 做出明確的定義。系統(tǒng)設(shè)計(jì):根據(jù)對(duì)問題的定義,用能容易轉(zhuǎn)變成 程序的方式對(duì)任務(wù)做出描述。程序編碼:系統(tǒng)設(shè)計(jì)的實(shí)施。用計(jì)算機(jī)能夠直接 理解或能進(jìn)行翻譯的形式編寫程序。代碼調(diào)試:驗(yàn)證程序設(shè)計(jì)的正確性。系統(tǒng)維護(hù):對(duì)系統(tǒng)進(jìn)行日常維護(hù)、做必要的改進(jìn) 等。以上各步必須認(rèn)真檢查,發(fā)現(xiàn)錯(cuò)誤應(yīng)及時(shí)糾正, 絕不可以拖延至下一階段。 由于匯編語言的固有特點(diǎn),當(dāng)把系統(tǒng)劃分成多個(gè)模塊后,模塊的詳細(xì)設(shè)計(jì)可以采用流程圖的方法,這種方法比較直觀、層次清晰、便于發(fā)現(xiàn)錯(cuò)誤,細(xì)化后的流程圖更易于匯編語言的代碼實(shí)現(xiàn)。

2、可以采用結(jié)構(gòu)程序設(shè)計(jì)的方法設(shè)計(jì)程序。即程序的每一部分由若干個(gè)單元組成,而每個(gè)單元包含一個(gè)有限結(jié)構(gòu)集,每個(gè)結(jié)構(gòu)有一個(gè)入口和一個(gè)出口。這種結(jié)構(gòu)便于查錯(cuò)及調(diào)試。結(jié)構(gòu)程序有三種基本結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。相應(yīng)的程序叫做簡(jiǎn)單程序、分支程序和循環(huán)程序。 第五章 程序基本結(jié)構(gòu)及其程序設(shè)計(jì) 5.1 順序結(jié)構(gòu)及簡(jiǎn)單程序設(shè)計(jì) 5.2 分支結(jié)構(gòu)及程序?qū)崿F(xiàn) 5.3 循環(huán)結(jié)構(gòu)及程序?qū)崿F(xiàn) 5.1 順序結(jié)構(gòu)及簡(jiǎn)單程序設(shè)計(jì) 程序設(shè)計(jì)中最基本的結(jié)構(gòu)是如圖所示的順序結(jié)構(gòu),它只有一個(gè)起始框、一個(gè)結(jié)束框和一至多個(gè)執(zhí)行模塊。具有順序結(jié)構(gòu)的程序叫做簡(jiǎn)單程序。順序結(jié)構(gòu)開始結(jié)束 例. 設(shè)置光標(biāo)到屏幕左上角。 SET_CURPRO

3、C MOV AH,2 MOV BH,0 MOV DX,0 INT 10H RET SET_CURENDP 這個(gè)程序是順序執(zhí)行的,一條指令執(zhí)行后順序執(zhí)行緊接其后的另一條指令。實(shí)際上許多程序片段都具有順序結(jié)構(gòu)。 5.2 分支結(jié)構(gòu)及程序?qū)崿F(xiàn) 許多實(shí)際問題很復(fù)雜,有時(shí)需要根據(jù)不同條件進(jìn)行不同的處理,此時(shí)就需要用分支程序設(shè)計(jì)。 1.分支結(jié)構(gòu) 不滿足滿足IFTHENELSE結(jié)構(gòu)CASE結(jié)構(gòu)條件條件C112nC2Cn(1)IF_THEN_ELSE結(jié)構(gòu)程序設(shè)計(jì) 例1.實(shí)現(xiàn)符號(hào)函數(shù)Y的功能。其中:-128X+127程序5.1是該例的編碼實(shí)現(xiàn)。 1當(dāng)X0時(shí)Y 0當(dāng)X0時(shí) -1當(dāng)X0時(shí)2.分支程序設(shè)計(jì)程序5.1XD

4、B?;被測(cè)數(shù)據(jù)YDB ?;函數(shù)值單元 MOVAL,0 CMPX,AL JGBIG JZSAV MOVAL,0FFH;小于0 JMP SHORT SAVBIG:MOVAL,1;大于0SAV:MOVY,AL;保存結(jié)果例2在有序表中用折半查找法查找指定元素。編碼見程序5.2。 是否、l= 0, h = n-1.m = (l+h)/2.l = m+1.h = m-1.查找成功.查找失敗. h ?折半查找算法的流程=程序5.2STACKSG SEGMENT STACK S DW 64 DUP(ST)STACKSG ENDSDATA SEGMENTBUF DB 30H,31H,32H,33H,34H,35

5、H,36H, 37H,38H,39H,41H,42H,43H,44H, 45H;有序表COUNT EQU $-BUF;表項(xiàng)數(shù)CHAR DB ?;要查找的數(shù)MARK DW 0;查找次數(shù)PROMPT DB NO FOUND$;沒找到提示信息DATA ENDS CODE SEGMENTASSUME CS:CODE,DW:DATA,SS:STACKSGMAIN PROC FAR MOV AX,DATA MOV DS,AX MOV AH,1 ;輸入要查找數(shù)的字符 INT 21H MOV CHAR,AL ;保存要找的數(shù) LEA SI,BUF ;表起始地址,初始 ;化區(qū)間下限(左) MOV CX,COUNT

6、 MOV DX,SI ADD DX,CX ;最后數(shù)的地址加1 MOV DI,DX ;初始化區(qū)間上限(右) MOV DX,0 CMP AL,SI ;判邊界元素 JB NOFID ;小于表中最小數(shù)轉(zhuǎn)未找到 JE FOUND ;是表中最小數(shù)轉(zhuǎn)找到 CMP AL,DI-1;判邊界元素 JA NOFID ;大于表中最大數(shù)轉(zhuǎn)未找到 JE FOUND ;是表中最大數(shù)轉(zhuǎn)找到 MOV DX,1 ;初始化查找次數(shù) MOV AL,CHAR ;要查找的數(shù) C1: MOV BX,SI ;循環(huán)入口 ADD BX,DI SHR BX,1 ;折半 CMP AL,BX ;比較 JZ FOUND ;找到轉(zhuǎn) PUSHF CMP B

7、X,SI ;指針下限嗎? JZ NOFID ;若等于表示未找到,轉(zhuǎn) POPF JL LESS ;可能在左半?yún)^(qū)轉(zhuǎn) MOV SI,BX ;可能在右半?yún)^(qū),調(diào)整下限 JMP SHORT NEXTLESS: MOV DI,BX ;調(diào)整上限NEXT: INC DX ;查找次數(shù)加1 JMP C1NOFID: LEA DX,PROMPT ;顯示未找到提示信息 MOV AH,9 INT 21H JMP SHORT EXIT FOUND: MOV MARK,DX;保存查找次數(shù) PUSH DX MOV AH,2 ;顯示找到的數(shù) MOV DL,BX INT 21H MOV CL,10 POP AX DIV CL ;把

8、查找次數(shù)轉(zhuǎn)換成十進(jìn)制數(shù) OR AX,3030H;轉(zhuǎn)換成ASCII碼 MOV DL,AL PUSH AX MOV AH,2;顯示查找次數(shù)的高位 INT 21H POP AX MOV DL,AH MOV AH,2;顯示查找次數(shù)的低位 INT 21HEXIT: MOV AX,4C00H INT 21HMAIN ENDPCODE ENDS END MAIN (2)CASE結(jié)構(gòu)程序設(shè)計(jì) 可以用跳躍表法實(shí)現(xiàn)CASE結(jié)構(gòu),實(shí)現(xiàn)的關(guān)鍵是先要構(gòu)成跳轉(zhuǎn)表,然后用無條件間接轉(zhuǎn)移指令實(shí)現(xiàn)跳轉(zhuǎn)。 例3.編制一個(gè)管理文件的菜單程序。該程序應(yīng)該能夠?qū)崿F(xiàn)建立文件、修改文件、刪除文件、顯示文件和退出應(yīng)用程序返回操作系統(tǒng)的主控功

9、能。要求在屏幕上顯示5種功能,然后從鍵盤上選擇15即可轉(zhuǎn)入相應(yīng)的功能,而輸入其它字符則提示輸入非法并允許重新輸入。若選擇退出功能,則能正確返回;若選擇其它功能,應(yīng)能返回到菜單,提供繼續(xù)選擇的機(jī)會(huì)。設(shè)菜單程序及5個(gè)子功能在同一個(gè)模塊。 設(shè)計(jì)跳轉(zhuǎn)表JMP_TAB DW 建立文件分支入口標(biāo)號(hào) DW 修改文件分支入口標(biāo)號(hào) DW 刪除文件分支入口標(biāo)號(hào) DW 顯示文件分支入口標(biāo)號(hào) DW 退出分支入口標(biāo)號(hào)如果主控程序及5個(gè)子功能分別在不同的段或模塊中,只需要把數(shù)據(jù)定義語句助記符的DW換成DD即可。 分析用無條件間接轉(zhuǎn)移指令實(shí)現(xiàn)CASE轉(zhuǎn)移若跳轉(zhuǎn)表是用DW定義的,則用段內(nèi)間接轉(zhuǎn)移指令。若是用DD定義的,則用段

10、間間接轉(zhuǎn)移指令。段內(nèi)間接轉(zhuǎn)移的幾種格式:JMP JMP_TABSI ;SI中為位移量LEA BX,JMP_TAB JMP WORD PTR BXSI ;SI中為位移量LEA BX,JMP_TABADD BX,位移量JMP WORD PTR BX 說明:位移量是跳轉(zhuǎn)表中所選項(xiàng)與表基址的距離。我們把所有功能號(hào)連續(xù)排列,設(shè)選擇了K號(hào)功能,則:索引號(hào)K起始功能號(hào)位移量索引號(hào)每項(xiàng)入口地址占用的字節(jié)數(shù) 表項(xiàng)地址表基址位移量 流程圖開始清屏、設(shè)置光標(biāo)顯示菜單、等待選擇鍵入選擇號(hào)響鈴警告選擇合法?N求表地址轉(zhuǎn)移刪除退出建立修改打印Y菜單程序流程 編程根據(jù)流程圖書寫的程序見程序5.3。本例用上述的段內(nèi)間接轉(zhuǎn)移的

11、第3種格式實(shí)現(xiàn)轉(zhuǎn)移。程序5.3stacksg segment stack stk dw 32 dup(s)stacksg endsdata segmentMSG1 DB 1CREATE,0DH,0AH;菜單 DB 2UPDATE,0DH,0AH DB 3DELETE,0DH,0AH DB 4PRINT,0DH,0AH DB 5QUIT,0DH,0AH,$MSG2 DB INPUT SELECT:,0DH,0AH,$ ;選擇提示JMP_TAB DW CREATE;地址表(跳轉(zhuǎn)表) DW UPDATE DW DELETE DW PRINT DW QUITdata endscode segmentm

12、ain proc far assume cs:code,ds:data push ds xor ax,ax push ax mov ax,data mov ds,axREPEAT: MOV AX,0600H;清屏 MOV CX,0 MOV DX,184FH MOV BH,07 INT 10HCURSOR: MOV AH,02;設(shè)置光標(biāo) MOV BH,0 MOV DX,0400H INT 10H LEA DX,MSG1;顯示菜單 MOV AH,9 INT 21H LEA DX,MSG2;顯示選擇提示 MOV AH,9 INT 21HRDKB: MOV AH,1;等待輸入選擇號(hào) INT 21H C

13、MP AL,31H;選擇合法性檢查 JB BEEP;若非法則轉(zhuǎn)移 CMP AL,35H JA BEEP AND AL,0FH ;ASCII碼轉(zhuǎn)換為非壓縮BCD碼 XOR AH,AH DEC AX;得到索引值 ADD AX,AX;i項(xiàng)位移量 LEA BX,JMP_TAB;裝入表首址 ADD BX,AX;得到表項(xiàng)地址 JMP BX;按表項(xiàng)地址轉(zhuǎn)移BEEP: MOV AH,14 ;響鈴警告 MOV AL,7 MOV BH,0 INT 10H JMP SHORT RDKB ;轉(zhuǎn)重新選擇CREATE: MOV AH,2 ;建立文件子功能 MOV DL,C INT 21H MOV AH,0 INT 16H

14、 JMP REPEAT;返回菜單UPDATE: NOP;修改文件子功能 JMP REPEAT;返回菜單DELETE: NOP;刪除文件子功能 JMP REPEAT;返回菜單PRINT: NOP;顯示文件子功能 JMP REPEAT;返回菜單QUIT: ret;返回操作系統(tǒng)main endpcode ends end main 1.循環(huán)結(jié)構(gòu)不滿足滿足條件循環(huán)體循環(huán)初始化不滿足DO-WHILE結(jié)構(gòu)滿足條件循環(huán)體循環(huán)初始化DO-UNTIL結(jié)構(gòu)基本循環(huán)結(jié)構(gòu)5.3 循環(huán)結(jié)構(gòu)及程序?qū)崿F(xiàn) 2.循環(huán)程序設(shè)計(jì) 無論使用哪種循環(huán)結(jié)構(gòu),循環(huán)程序一般應(yīng)包括以下幾部分:(1) 循環(huán)初始化。(2) 循環(huán)體。 (3) 循環(huán)

15、控制部分。特別要注意循環(huán)入口和循環(huán)次數(shù)的正確設(shè)置、地址指針及循環(huán)控制條件的修改等,否則會(huì)得不到期望的結(jié)果。例4 在字型無序表中找出最大數(shù)和最小數(shù),并分別存入MAX和MIN單元。程序5.4是本例采用DO_UNTIL結(jié)構(gòu)實(shí)現(xiàn)的。 程序5.4STACKSG SEGMENT STACK STK DW 32 DUP(S)STACKSG ENDSDATA SEGMENTBUFFER DW 500,30,56,77,999,67,433, 5675,0,9999;無序表 DW 3455,6578,32766,8,0, 32560,45,889,5665,09CN DW ($-BUFFER)/2;元素個(gè)數(shù)MA

16、X DW ?;存放最大數(shù)單元MIN DW ? ;存放最小數(shù)單元DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA SI,BUFFER ;初始化地址指針 MOV CX,CN ;元素個(gè)數(shù) MOV AX,SI ;取第一數(shù)DEC CX MOV MAX,AX ;初始化最大數(shù) MOV MIN,AX ;初始化最小數(shù)COMP:ADD SI,2 ;修改地址指針MOV AX,SI;取下一個(gè)數(shù)CMP AX,MAX;與當(dāng)前的最大數(shù)比較 JL NEXT;

17、若小于轉(zhuǎn) MOV MAX,AX;若大于則把此數(shù)作為;最大數(shù)保存 JMP SHORT LOPNEXT:CMP AX,MIN;與當(dāng)前的最小數(shù)比較 JG LOP;若大于轉(zhuǎn) MOV MIN,AX;若小于則把此數(shù)作為;最小數(shù)保存LOP: LOOP COMP;決定循環(huán)繼續(xù)還是終止 RETMAIN ENDPCODE ENDS END MAIN例5自定義一個(gè)按降序排列的字型數(shù)組,在數(shù)組中查找指定的數(shù)字,若找到在屏幕上顯示“Duplication!”,否則插入該數(shù)字在適當(dāng)位置并繼續(xù)保持?jǐn)?shù)組有序,且顯示“Inserted!”。程序5.5是其編碼實(shí)現(xiàn)。程序5.5DATA SEGMENTPRT DB Duplicat

18、ion,$INS DB Inserted!,$X DW ? ;為數(shù)據(jù)移動(dòng)預(yù)留空間TAB DW 889,754,589,546,52,31 ;降序數(shù)組CT EQU ($-TAB)/2 ;元素個(gè)數(shù)N DW 234 ;要插入的數(shù)字DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,TAB;裝入表首址 MOV AX,N;要插入的數(shù)字 MOV CX,CT;個(gè)數(shù) CLD REPNZ SCASW JE A;找到轉(zhuǎn) M

19、OV SI,0 COMPARE:CMP TABSI,AX ;比較 JL B ;小于轉(zhuǎn) MOV BX,TABSI ;元素前移為插入的數(shù)字騰位置 MOV TABSI-2,BX ADD SI,2 ;修改地址指針 JMP SHORT COMPAREA: MOV AH,9H LEA DX,PRT INT 21H JMP EXITB: MOV TABSI-2,AX ;插入元素 MOV AH,9 LEA DX,INS INT 21HEXIT: RET MAIN ENDPCODE ENDS END MAIN例6設(shè)數(shù)組X、Y中分別存有10個(gè)字型數(shù)據(jù)。試實(shí)現(xiàn)以下計(jì)算并把結(jié)果存入Z單元。Z1X1+Y1Z2X2+Y2

20、Z3X3-Y3Z4X4-Y4Z5X5-Y5Z6X6+Y6Z7X7-Y7Z8X8-Y8Z9X9+Y9Z10X10+Y10流程圖如下,程序見程序5.6。YN 開始初始化循環(huán)計(jì)數(shù)值i=0 RULEi=1?Xi+YiXiYiYZi結(jié)果i=i+1,循環(huán)次數(shù)減1N循環(huán)計(jì)數(shù)值=0?用邏輯尺控制循環(huán) 結(jié)束程序5.6STACKSG SEGMENT STACK S DW 64 DUP(ST)STACKSG ENDSDATA SEGMENTX DW 12H,34H,56H,78H,90HDW 0ABH,0CDH,0EFH,0F1H,023HY DW 9,8,7,6,5,4,3,2,1,0Z DW 10 DUP(?)

21、RULE DW 11100B;邏輯尺DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSGMAIN PROC FAR MOV AX,DATA MOV DS,AX MOV BX,0;地址指針 MOV CX,10;循環(huán)次數(shù) MOV DX,RULE;邏輯尺NEXT: MOV AX,XBX ;取X中的一個(gè)數(shù) SHR DX,1 ;邏輯尺右移一位 JC SUBS ;分支判斷并實(shí)現(xiàn)轉(zhuǎn)移 ADD AX,YBX ;兩數(shù)加JMP SHORT RESULTSUBS: SUB AX,YBX ;兩數(shù)減RESULT: MOV ZBX,AX;存結(jié)果 ADD BX,2 ;修改地址指針 LOOP NEXT MOV AX,4C00H INT 21HMAIN ENDPCODE ENDS END MAIN例7編制用軟件延時(shí)200ms的程序。設(shè)用以下程序片段可以延時(shí)10ms:DELAY10: MOV CX,2801 ;置循環(huán)次數(shù)WT: LOOP WT 則延時(shí)200ms只需把以上程序片段循環(huán)20次即可,如程序5.7所示。3.多重循環(huán)程序設(shè)計(jì)程序5.7DELAY PROC MOV BL,20;置外循環(huán)次數(shù)DELAY10:MOV CX,2801;置內(nèi)循環(huán)次數(shù)WT: LOOP WT;內(nèi)循環(huán)體、循環(huán)次 ;數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論