3.8.1 程序設(shè)計(jì)步驟
在這里,我們不去涉及軟件工程的具體問題,只簡單介紹程序設(shè)計(jì)的入門知識。
一般可以按下面的步驟進(jìn)行:
(1) 仔細(xì)了解問題的要求。
(2) 制定方案。
(3) 編寫程序。
(4) 查錯(cuò)。
(5) 測試。
(6) 形成文件。
3.8.2 程序設(shè)計(jì)的基本方法
1.順序程序
也有人稱之為簡單程序,它確實(shí)是程序中最簡單的形式。這種程序CPU執(zhí)行時(shí),是以指令的排列順序逐條執(zhí)行的。
若m,n,w分別為三個(gè)8位無符號數(shù),現(xiàn)欲求Q=m×n-w。若m,n,w存放在當(dāng)前DS所決定數(shù)據(jù)段、偏移地址為DATA的順序單元中,而且Q可放在AX中,則程序?yàn)?
LEA SI,DATA
MOV AL[SI]
MOV BL,[SI+1]
MUL BL
MOV BX,0
MOV BL,[SI+2]
SUB AX,BX
HLT
2. 分枝程序
分枝程序的基本結(jié)構(gòu)如圖3.20所示。由圖3.20可見,分枝程序的基本思路就是判斷條件A是否成立,若成立,則執(zhí)行P -1;若不成立,則執(zhí)行P -2。
現(xiàn)舉例說明如下:
從接口03F0H中取數(shù),若此數(shù)≥90,則將00H送接口03F7H;若此數(shù)<90,則將FFH送接口03F7H。
程序如下:
MOV DX,03F0H
IN AL,DX
CMP AL,90
JNC NEXT1
MOV AL,0FFH
JMP NEXT2
NEXT1:MOV AL,00H
NEXT2:MOV DX,03F7H
OUT DX,AL
HLT

例:在DS數(shù)據(jù)段偏移地址為DATA開始的順序80個(gè)單元中,存放著某班80個(gè)同學(xué)的微型機(jī)原理考試成績?,F(xiàn)欲編程序統(tǒng)計(jì)≥90分、89分~70分,69分~60分和<60分的人
數(shù),并將統(tǒng)計(jì)的結(jié)果放在當(dāng)前數(shù)據(jù)段偏移地址為BUFFER的順序單元中。
程序如下:
MOV DX,0000H
MOV BX,0000H
MOV CX,80
LEA SI,DATA
LEA DI,BUFFERGOON:MOV AL,[SI]
CMP AL,90
JC NEXT3
INC DH
JMP STOR
NEXT3:CMP AL,70
JC NEXT5
INC DL
JMP STOR
NEXT5: CMP AL,60
JC NEXT7
INC BH
JMP STOR
NEXT7:INC BL
STOR: INC SI
LOOP GOON
MOV [DI],DH
MOV[DI+1],DL
MOV[DI+2],BH
MOV[DI+3],BL
HLT

3. 循環(huán)程序 循環(huán)程序是強(qiáng)制CPU重復(fù)執(zhí)行某一指令集合的一種程序結(jié)構(gòu)。它可以使許多重復(fù)性工作的程序大為簡化。 循環(huán)程序通常有兩種結(jié)構(gòu)方式,如圖3.22(a)和(b)所示。 在內(nèi)存40000H開始的順序30個(gè)單元中存放著8位無符號數(shù),若將它們的和放在DX中,試編程序。 程序如下: MOV AX,4000H MOV DS,AX MOV SI,0000H MOV CX,30 XOR AX,AX GOON:ADD AL,[SI] ADC AH,00H INC SI DEC CX JNZ GOON MOV DX,AX HLT
在圖3.22中所畫的是單一的循環(huán)。在解決問題中還會出現(xiàn)二重循環(huán)甚至多重循環(huán)的情況。只要單一循環(huán)的概念清楚,二重及多重循環(huán)也就容易解決。 在此僅以簡單的例子加以說明。

例:在DS所決定的數(shù)據(jù)段,從偏移地址BUFFER開始順序存放100個(gè)無符號16位數(shù)?,F(xiàn)欲編寫程序?qū)⑦@100個(gè)字按大小順序排序。 程序如下: LEA DI,BUFFER MOV BL,99 NEXT0:MOV SI,DI MOV CL,BL NEXT3:MOV AX,[SI] ADD SI,2 CMP AX,[SI] JNC NEXT5 MOV DX,[SI] MOV[SI-2],DX MOV[SI], AX NEXT5:DEC CL JNZ NEXT3 DEC BL JNZ NEXT0 HLT
4. 子程序 使用子程序時(shí)應(yīng)注意的幾個(gè)問題: (1)子程序如何調(diào)用和如何返回。 (2)子程序的入口條件(或稱入口信息)和出口條件(出口信息)。 (3)子程序中使用了哪些寄存器,調(diào)用之前是否需要保護(hù)。 (4)其他諸如占內(nèi)存多少、執(zhí)行時(shí)間長短、影響哪些標(biāo)志、出錯(cuò)如何處理等。 在此我們只直接用來定義一個(gè)通過查詢向接口輸出數(shù)據(jù)的輸出子程序: SENDAT PROC FAR PUSH AX PUSH DX PUSH SI LEA SI,BUFR GOON:MOV DX,03FBH WAIT: IN AL,DX TEST AL,20H JZ WAIT MOV AL,[SI] MOV DX,03F8H OUT DX,AL INC SI CMP AL,0AH JNE GOON POP SI POP DX POP AX RET SENDAT ENDP主程序在調(diào)用子程序時(shí),一方面初始數(shù)據(jù)要傳遞給子程序,另一方面子程序的運(yùn)行結(jié)果要傳遞給主程序。盡管沒有初始數(shù)據(jù)或沒有運(yùn)行 結(jié)果的情況也有,但一般情況下我們必須予以考慮。 參數(shù)傳遞可用以下3種方式: ·利用寄存器 ·利用內(nèi)存單元 ·利用堆棧

5.表
在微型計(jì)算機(jī)應(yīng)用中,經(jīng)常用到表的運(yùn)算。例如,溫度傳 感器的一個(gè)溫度對應(yīng)輸出一個(gè)電壓,溫度值與電壓之間如果有 較復(fù)雜的函數(shù)關(guān)系,那么要計(jì)算出某一電壓(假定
用10位二進(jìn) 制數(shù)表示)的溫度值往往要進(jìn)行復(fù)雜運(yùn)算。 例如,在當(dāng)前數(shù)據(jù)段(DS所決定)偏移地址為TABLE開始的順序 單元中存放著用一個(gè)字(16位二進(jìn)制數(shù))所表示的溫
度值,此表 按順序?qū)?yīng)溫度傳感器電壓值的10位二進(jìn)制值:000H到3FFH。若 在當(dāng)前數(shù)據(jù)段偏移地址為DATAB的順序單元中已存放著溫度電壓 值的10位編碼。試編程
序?qū)⑵滢D(zhuǎn)換成實(shí)際的溫度值,放回原存貯 單元。 程序如下: START: LEA SI,TABLE MOV AX,DATAB ADD SI,AX MOV AX,[SI] MOV DATAB,AX HLT
下面我們分別對這兩種功能調(diào)用作一簡要介紹。
(1) 高級功能調(diào)用(DOS功能調(diào)用)
(2) 低級功能調(diào)用
(3) 功能調(diào)用實(shí)例
例1 帶顯示的鍵盤輸入子程序KSDIN。功能:接收從鍵盤輸入的一個(gè)字符并在顯示器上顯示該字符。 輸入:從鍵盤輸入一個(gè)ASCII碼字符。 輸出:輸入字符送緩沖區(qū),并顯示該字符。 KSDIN PROC NEAR MO VAH,1;置功能號 INT 21H;輸入結(jié)果放AL中 MOV IN BUFF,AL;輸入字符送緩沖區(qū) RET KSDIN ENOP
例2 設(shè)置系統(tǒng)日期的子程序SETTIME。 功能:將變量YEAR、MONTH、DAY的內(nèi)容作為時(shí)間設(shè)置系統(tǒng)日期。 SETTIME PROC NEAR MOV AH,2BH ;置功能號 MOV CX,YEAR ;置年參數(shù)(字) MOV DH,MONTH;置月參數(shù)(字節(jié)) MOV DL,DAY;置日參數(shù)(字節(jié)) INT 21H; OR AL,AL;檢查狀態(tài) JNZ ERROR;日期無效轉(zhuǎn)… RET ERROR:… RET …YEAR DW0 MONTH DB0 DAY DB0 SETTIME ENDP
例3 用戶程序終止返回DOS。 功能:用戶程序結(jié)束返回DOS操作系統(tǒng)。 PROEND:MOV AH,0 ;置功能號 INT 21H ;返回操作系統(tǒng) 例4 置CRT顯示方式子程序SETCRT。 功能:根據(jù)不同類型碼設(shè)置不同的顯示方式。 若本系統(tǒng)顯示卡為EGA卡,現(xiàn)要將顯示器設(shè)置成640×200、彩色16色圖形方式。 SETCRT PROC NEAR MOV AH,0 ;設(shè)置功能類型 MOV AL,0EH;設(shè)置調(diào)用參數(shù) INT10H ;調(diào)BIOS功能 RET SETCRT ENDP 例5 寫一個(gè)字符到指定通信口子程序WCOMI。 功能:將緩沖區(qū)BUFF中的字符送串行通信口輸出。 輸入:要發(fā)送的字符放于緩沖區(qū)BUFF。 輸出:將緩沖區(qū)字符送COMI串行口輸出。 WCOMI PROC NEAR MOV AH,01H;功能1為寫字符 MOV AL,BUFF;字符送AL MOV DX,0;用COM1通信口發(fā)送 INT 14H;調(diào)用BIOS功能 RET WCOMI ENDP
