




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2023/1/2匯編語言程序設(shè)計(jì)16.1概述6.2順序程序設(shè)計(jì)6.3分支程序設(shè)計(jì)6.4循環(huán)程序設(shè)計(jì)第6章結(jié)構(gòu)化程序設(shè)計(jì)方法2022/12/12匯編語言程序設(shè)計(jì)16.1概述第6章12023/1/2匯編語言程序設(shè)計(jì)2第6章結(jié)構(gòu)化程序設(shè)計(jì)方法(1)分析問題。對(duì)問題進(jìn)行充分的分析,確定問題是什么,解決問題的步驟又是什么。(2)確定算法和數(shù)據(jù)結(jié)構(gòu)。根據(jù)問題的分析結(jié)果,選擇合適的解決方案即算法。(3)編制程序。將算法和數(shù)據(jù)結(jié)構(gòu)等轉(zhuǎn)換成程序代碼。(4)調(diào)試程序。在計(jì)算機(jī)上實(shí)際運(yùn)行,進(jìn)行程序的測試和調(diào)整,直至獲得預(yù)期的結(jié)果。6.1概述程序設(shè)計(jì)的一般步驟2022/12/12匯編語言程序設(shè)計(jì)2第6章結(jié)構(gòu)化程序設(shè)計(jì)22023/1/2匯編語言程序設(shè)計(jì)36.1概述匯編語言程序設(shè)計(jì)的一般步驟:1.分析問題,抽象出描述問題的數(shù)學(xué)模型。2.確定解決問題的算法或算法思想。3.繪制流程圖或結(jié)構(gòu)圖。4.分配存儲(chǔ)空間及工作單元(包括寄存器)。5.逐條編寫程序。6.靜態(tài)檢查。7.上機(jī)運(yùn)行調(diào)試。2022/12/12匯編語言程序設(shè)計(jì)36.1概述匯編語言32023/1/2匯編語言程序設(shè)計(jì)4(1)任何程序都可以由3種基本結(jié)構(gòu)程序構(gòu)成順序結(jié)構(gòu)分支(條件選擇)結(jié)構(gòu)循環(huán)結(jié)構(gòu)(2)每一個(gè)結(jié)構(gòu)只有一個(gè)入口和一個(gè)出口結(jié)構(gòu)化程序設(shè)計(jì)原則:6.1概述
在匯編語言中,選擇和循環(huán)結(jié)構(gòu)必須通過比較或測試指令、算術(shù)邏輯指令、條件轉(zhuǎn)移指令和循環(huán)指令等來完成。2022/12/12匯編語言程序設(shè)計(jì)4(1)任何程序都可以由42023/1/2匯編語言程序設(shè)計(jì)5第6章結(jié)構(gòu)化程序設(shè)計(jì)方法順序程序結(jié)構(gòu)是完全按順序逐條執(zhí)行的指令序列。即指令指針I(yè)P順序往下,不發(fā)生跳變。6.2順序結(jié)構(gòu)程序設(shè)計(jì)在程序中大量以程序段出現(xiàn)。順序程序設(shè)計(jì)是復(fù)雜程序設(shè)計(jì)的基礎(chǔ)。特點(diǎn):無分支、無循環(huán)。2022/12/12匯編語言程序設(shè)計(jì)5第6章結(jié)構(gòu)化程序設(shè)計(jì)5順序程序舉例
[例1]將一字節(jié)數(shù)據(jù)從數(shù)據(jù)段的某個(gè)單元傳送到另一單元。DATA SEGMENTFIRST DB 7AHSECOND DB ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX
MOV AL,F(xiàn)IRST MOV SECOND,AL MOV AH,4CH INT 21HCODE ENDS END START6.2順序結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)6順序程序舉例 [例1]將一字節(jié)數(shù)據(jù)從數(shù)據(jù)段的某個(gè)單元傳送到62023/1/2匯編語言程序設(shè)計(jì)76.2順序結(jié)構(gòu)程序設(shè)計(jì)DATA SEGMENTBUF DB 7AH,48HSUM DB ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX
MOV AL,BUF ADD AL,BUF+1 MOV SUM,AL MOV AH,4CH INT 21HCODE ENDS END START[例2]將存儲(chǔ)器中的兩個(gè)字節(jié)數(shù)相加,結(jié)果存入另一單元。順序程序舉例2022/12/12匯編語言程序設(shè)計(jì)76.2順序結(jié)構(gòu)程7順序程序舉例
[例3]按公式Y(jié)=XX-50編程。
: :
X DB 45H Y DW ? : :
MOV AL,X MUL AL AUB AX,50 MOV Y,AX
: :
6.2順序結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)8順序程序舉例 [例3]按公式Y(jié)=XX-50編程。 :68順序程序舉例
[例4]將一字節(jié)壓縮型BCD碼轉(zhuǎn)換為兩個(gè)ASCII碼。
:BCDBUF DB 59HASCBUF DB 2DUP(?)
:
MOV AL,BCDBUF MOV BL,AL MOV CL,4 SHR BL,CL ADD BL,30H MOV ASCBUF,BL AND AL,0FH ADD AL,30H MOV ASCBUF+1,AL
:
6.2順序結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)9順序程序舉例 [例4]將一字節(jié)壓縮型BCD碼轉(zhuǎn)換為兩個(gè)AS9順序程序舉例
[例5]單字節(jié)壓縮型BCD數(shù)的加法運(yùn)算。(考慮進(jìn)位)
:A DB 59HB DB 81HC DB 2DUP(?)
:
MOV AL,A ADD AL,B DAA MOV C,AL
LAHF AND AH,01H MOV C+1,AH
:
SZ_A_P_C6.2順序結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)10順序程序舉例 [例5]單字節(jié)壓縮型BCD數(shù)的加法運(yùn)算。(考10
[例6]用查表法完成將從鍵盤輸入的一位十進(jìn)制數(shù)轉(zhuǎn)換為對(duì)應(yīng)的平方值。
:SQU DB 0,1,4,9,16,25,36,49,64,81BUF DB ?
:
MOV AH,1 INT 21H AND AL,OFH LEA BX,SQU XLAT MOV BUF,AL
:
6.2順序結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)11 [例6]用查表法完成將從鍵盤輸入的一位十進(jìn)制數(shù)轉(zhuǎn)換為對(duì)應(yīng)的112023/1/2匯編語言程序設(shè)計(jì)12第6章結(jié)構(gòu)化程序設(shè)計(jì)方法分支程序結(jié)構(gòu)——根據(jù)某些條件進(jìn)行邏輯判斷,當(dāng)滿足時(shí)進(jìn)行某種處理;當(dāng)不滿足時(shí)進(jìn)行另一種處理。6.3分支結(jié)構(gòu)程序設(shè)計(jì)用條件轉(zhuǎn)移指令實(shí)現(xiàn),實(shí)現(xiàn)計(jì)算機(jī)的邏輯判斷能力。特定:只執(zhí)行二分支或多分支中的一個(gè)分支。2022/12/12匯編語言程序設(shè)計(jì)12第6章結(jié)構(gòu)化程序設(shè)12一、分支結(jié)構(gòu)的兩種形式:
二分支結(jié)構(gòu)多分支結(jié)構(gòu)6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)13一、分支結(jié)構(gòu)的兩種形式: 二分支結(jié)構(gòu)6.3分支結(jié)構(gòu)程131.二分支結(jié)構(gòu)
6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)14
條件分支程序段1分支程序段2
條件分支程序段2雙分支程序相當(dāng)于高級(jí)語言中的IF-THEN-ELSE語言。右圖只對(duì)其中之一分支進(jìn)行處理,也稱為單分支結(jié)構(gòu)。1.二分支結(jié)構(gòu) 6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/12/142.多分支結(jié)構(gòu)多分支程序相當(dāng)于高級(jí)語言中的CASE語句。
條件程序段1程序段2程序段n…...條件1條件2條件n6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)152.多分支結(jié)構(gòu)多分支程序相當(dāng)于高級(jí)語言中的CASE語句。條15注意: 在分支程序的兩種結(jié)構(gòu)中,無論條件是否滿足,只能走一個(gè)分支,不可能同時(shí)走兩個(gè)分支。 且程序只有一個(gè)入口一個(gè)出口。6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)16注意:6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/12/12匯編語161.二分支程序的一般結(jié)構(gòu)
一般要有產(chǎn)生條件、測試、定向、標(biāo)號(hào)四個(gè)部分組成。 也就是先通常用CMP、TEST、SUB、AND和移位指令等,影響標(biāo)志位,再使用分支轉(zhuǎn)移指令。如: CMP AX,0 ;條件
JC NEXT ;測試、定向 :
NEXT:NEG AX ;標(biāo)號(hào)
二、二分支程序設(shè)計(jì)6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)171.二分支程序的一般結(jié)構(gòu)二、二分支程序設(shè)計(jì)6.3分支結(jié)17(1)單分支結(jié)構(gòu)一
: ;程序段1 : ;產(chǎn)生條件
JCC BRANCHS2: : ;程序段2 : HLT BRANCH: : ;分支程序段
: : JMP S2S2:否是BRANCH:分支程序段程序段1產(chǎn)生條件條件?程序段26.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)18(1)單分支結(jié)構(gòu)一S2:否是BRANCH:分支程序段程序段118(2)單分支結(jié)構(gòu)二S1: : ;程序段1 : ;產(chǎn)生條件
JCC S2 ;條件滿足,轉(zhuǎn)S2BRANCH: : ;分支程序段
: : S2:
: ;程序段2 : HLT ;結(jié)束S2:否是BRANCH:分支程序段程序段1產(chǎn)生條件條件?程序段26.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)19(2)單分支結(jié)構(gòu)二S2:否是BRANCH:分支程序段程序段119
MOV AL,X CMP AL,0
JL BS2:MOV Y,AL HLTB: NEG AL JMP S2
MOV AL,X CMP AL,0
JGE S2
NEG ALS2:MOV Y,AL HLT例:求Y=|A|6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)20 MOV AL,X MOV AL,X例:求Y=|A|6.320(3)雙分支結(jié)構(gòu)一S1: : 程序段1 : ;產(chǎn)生條件
JCC BRANCH : ;分支程序段1 : S2: : ;程序段2 : HLT ;結(jié)束BRANCH: : ;分支程序段2 :
JMP S2 S2:否是BRANCH:分支程序段2程序段1產(chǎn)生條件條件?程序段2分支程序段16.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)21(3)雙分支結(jié)構(gòu)一S2:否是BRANCH:分支程序段2程序段21(4)雙分支結(jié)構(gòu)二S1: : ;程序段1 : ;產(chǎn)生條件
JCC BRANCH : ;分支程序段1 : JMP S2BRANCH: : ;分支程序段2 : S2: : ;程序段2 : HLT S2:否是BRANCH:分支程序段2程序段1產(chǎn)生條件條件?程序段2分支程序段16.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)22(4)雙分支結(jié)構(gòu)二S2:否是BRANCH:分支程序段2程序段22
AND AL,0FH
CMP AL,10
JL B
ADD AL,37HS2:MOV DL,AL MOV AH,2 INT 21H HLTB: ADD AL,30H
JMP S2
AND AL,0FH
CMP AL,10
JGE B
ADD AL,30H
JMP S2B: ADD AL,37HS2:MOV DL,AL MOV AH,2 INT 21H HLT
例:將AL中的一位十六進(jìn)制數(shù)顯示出來。6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)23 AND AL,0FH AND AL,0FH例:將AL中的一23
AND AL,0FH
CMP AL,10
JL B
ADD AL,37HS2:MOV DL,AL MOV AH,2 INT 21H HLTB: ADD AL,30H
JMP S2改為單分支形式:
AND AL,0FH
CMP AL,10
JL B
ADD AL,7B: ADD AL,30H MOV DL,AL MOV AH,2 INT 21H HLT
例:將AL中的一位十六進(jìn)制數(shù)顯示出來。6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)24 AND AL,0FH改為單分支形式:例:將AL中的一位十六242.雙分支程序設(shè)計(jì)舉例 SOURCE DB12,78MAX DB? : MOVAL,SOURCE CMPAL,SOURCE+1
JNCBRANCH MOVAL,SOURCE+1BRANCH:
MOVMAX,AL
:[例1]比較兩個(gè)無符號(hào)數(shù)的大小,把大數(shù)存入MAX單元。EP601.asm6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)252.雙分支程序設(shè)計(jì)舉例 SOURCE DB12,25BLOCK DB 'Searchalargestcharacter!'COUNT EQU $-BLOCK
[例3]設(shè)在一字符串中,找出ASCII值最大的顯示。EP603.asm
LEA SI,BLOCK MOV CX,COUNT-1 MOV AL,[SI] INC SICOMP:CMP AL,[SI] JA NEXT MOV AL,[SI]NEXT:INC SILOOPCOMPMOV DL,ALMOV AH,2 INT21H6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)26BLOCK DB 'Searchalargestch26START: MOV AL,5DH MOV BL,AL MOV CL,4 SHR AL,CL CMP AL,0AH JL ADD_0
ADD AL,7ADD_0: ADD AL,30H MOV AH,2 MOV DL,AL INT 21H[例4]設(shè)將AL中的無符號(hào)數(shù),按十六進(jìn)制顯示。 AND BL,0FH CMP BL,0AH JL ADD_30H
ADD BL,7ADD_30H: ADD BL,30H MOV DL,BL MOV AH,2 INT 21H
MOV AH,4CH INT 21H6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)27
EP604.asm
START: MOV AL,5DH[例4]設(shè)將AL中的27[例5]判斷變量X的值是否為“偶數(shù)”。6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)28CODE SEGMENT ASSUME CS:CODESTART: JMP BEGINX DB ? ;被測試的數(shù),匯編之前置入YES DB 0AH,0DH,“It’saevennumber.”,0AH,0DH,‘$’NO DB 0AH,0DH,“It’saoddnumber.”,0AH,0DH,‘$’BEGIN: PUSH CS POP DS[例5]判斷變量X的值是否為“偶數(shù)”。6.3分支結(jié)構(gòu)程286.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)29 TEST X,1 ;測試X的最低位,確定是否為偶數(shù)
JZ EVN ;ZF=1,該數(shù)是偶數(shù),轉(zhuǎn)向“EVN”O(jiān)DD: LEA DX,NO ;否則,該數(shù)是奇數(shù)
MOV AH,9 INT 21H ;輸出奇數(shù)的相關(guān)信息
JMP DONE
;跳過程序“EVN”EVN: LEA DX,YES MOV AH,9 INT 21H ;輸出偶數(shù)的相關(guān)信息DONE:MOV AX,4C00H INT 21HCODE ENDS END START6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/12/12匯編語言程序29如果兩個(gè)“平行”分支有相同的處理過程,可以把它們“合并”:
6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)30 …… TEST X,1 ;測試X的最低位,確定是否為偶數(shù)
JZ EVN ;ZF=1,該數(shù)是偶數(shù),轉(zhuǎn)向“EVN”O(jiān)DD: LEA DX,NO;否則,該數(shù)是奇數(shù)
JMP DONE ;跳過程序“EVN”EVN: LEA DX,YES;該數(shù)是偶數(shù)DONE:MOV AH,9
INT 21H
;輸出該數(shù)的相關(guān)信息
MOVAX,4C00H ……如果兩個(gè)“平行”分支有相同的處理過程,可以把它們“合并”:30A DB12B DB78 :
MOVAL,A CMPB,AL JAEBGA
MOVDL,'A' MOVDH,'B' JMPCOM[例5’]設(shè)A、B兩單元各有一個(gè)無符號(hào)數(shù),要求根據(jù)大小顯示“A>B”或“B>A”。EP605.asmBGA: MOVDL,'B' MOVDH,'A'COM: MOVAH,2 INT21H MOVDL,'>'
INT21H MOVDL,DH INT21H6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)31A DB12[例5’]設(shè)A、B兩單元各有一31三、多分支程序設(shè)計(jì)1.復(fù)合選擇結(jié)構(gòu)2.地址表法3.跳轉(zhuǎn)表法4.邏輯分解法
6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)32三、多分支程序設(shè)計(jì)1.復(fù)合選擇結(jié)構(gòu)6.3分支結(jié)構(gòu)程序設(shè)32用多條條件轉(zhuǎn)移指令組合實(shí)現(xiàn)。一次判斷產(chǎn)生兩條分支,N次判斷產(chǎn)生N+1條分支。程序段4程序段1程序段2程序段3條件1條件2條件36.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)331.復(fù)合選擇結(jié)構(gòu)用多條條件轉(zhuǎn)移指令組合實(shí)現(xiàn)。一次判斷產(chǎn)生兩條分支,N次判斷產(chǎn)33[例6]符號(hào)函數(shù)。EP606.asm 1 X>0 Y= 0 X=0 -1 X<0
X DB 89HY DB ?
:
MOV AL,X CMP AL,0
JGE BIGPR
MOV Y,0FFH
JMP COMBIGPR: JE EQUPR
MOV Y,1 JMP COMEQUPR: MOV Y,0COM: MOV AH,4CH INT 21H6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)34方法1,逐項(xiàng)排除[例6]符號(hào)函數(shù)。EP606.asmX DB 89346.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)35 CMP X,0 JG PLUS JE ZEROMINUS: MOV Y,-1 JMP DONEPLUS: MOV Y,1 JMP DONEZERO: MOV Y,0DONE: ……方法2,逐項(xiàng)確認(rèn)6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/12/12匯編語言程序35[例7]從鍵盤上輸入一個(gè)小寫字母,顯示該字母的前導(dǎo)和后繼。EP607.asm
6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)36DATA SEGMENTPROMPT DB0DH,0AH,“Inputalowercaseletter:$”;提示ERR_MSG DB0DH,0AH,“Inputerror.$”;輸入錯(cuò)誤警告BUF DB 0DH,0AH,‘Prev:’ ;輸出緩沖區(qū)PREV DB 20H DB 0DH,0AH,‘Succ:’SUCC DB 20H DB 0DH,0AH,‘$’DATA ENDS[例7]從鍵盤上輸入一個(gè)小寫字母,顯示該字母的前導(dǎo)和后繼。E366.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)37CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AXINPUT: LEA DX,PROMPT MOV AH,9 INT 21H ;輸出提示信息
MOV AH,1 INT 21H ;輸入一個(gè)字符
CMP AL,‘a(chǎn)’ ;輸入正確性檢查
JB ERROR CMP AL,‘z’ JA ERROR 6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/12/12匯編語言程序376.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)38
MOV BL,AL ;計(jì)算“前導(dǎo)”字母
DEC BL CMP BL,‘a(chǎn)’ JB SKIP1 ;“前導(dǎo)”非字母,跳過
MOV PREV,BL ;保存“前導(dǎo)”字母SKIP1:INC AL ;計(jì)算“后繼”字母
CMP AL,‘z’ JA SKIP2 ;“后繼”非字母,跳過
MOV SUCC,AL ;“后繼”為字母,保存SKIP2:LEA DX,BUF ;輸出“前導(dǎo)”和“后繼”字母
MOV AH,09H INT 21H 6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/12/12匯編語言程序386.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)39
JMP EXIT ;跳過出錯(cuò)處理程序ERROR: LEA DX,ERR-MSG;顯示出錯(cuò)信息
MOV AH,09H INT 21H JMP INPUT ;要求重新輸入EXIT: MOV AX,4C00H ;返回OS INT 21HCODE ENDS END START6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/12/12匯編語言程序392.地址表法 其設(shè)計(jì)思想是在數(shù)據(jù)段中定義一張地址表,將各個(gè)分支程序段的入口地址放入表中,然后根據(jù)各分支程序的編號(hào),在地址表中找出轉(zhuǎn)向某個(gè)分支程序的入口地址。
表地址=地址表首址+編號(hào)*2
6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)402.地址表法6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/12/1240
例:設(shè)有0,1,……N,共N+1個(gè)分支程序,各分支程序的入口分別為ADD0,ADD1,……ADDN。 DATA SEGMENTNUM DB NADTAB DW ADD0,ADD1,…,ADDNDATA ENDS6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)41 例:設(shè)有0,1,……N,共N+1個(gè)分支程序,各分支程序的入41
:MOV AH,0MOV AL,NUMADD AX,AXMOV SI,AXMOV BX,ADTAB[SI]JMP NEARPTRBX
: :代碼段中:
:ADDR0: : :ADDR1: : :ADDRN: : :6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)42 :代碼段中: :6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/1423.轉(zhuǎn)移表法 與地址表法類似,不同的是表中建立的是轉(zhuǎn)移指令表。
BRATAB: JMP SHORTM0 JMP SHORTM1
: :
JMP SHORTM9M0: :M1: : :M9: :6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)433.轉(zhuǎn)移表法BRATAB: JMP SHORTM0M0:6432023/1/2匯編語言程序設(shè)計(jì)44第6章結(jié)構(gòu)化程序設(shè)計(jì)方法循環(huán)結(jié)構(gòu)——也稱“重復(fù)結(jié)構(gòu)”,重復(fù)執(zhí)行一組指令若干次,用有限長度的程序完成大量的處理任務(wù),實(shí)現(xiàn)計(jì)算機(jī)的重復(fù)操作。
6.4循環(huán)程序設(shè)計(jì)幾乎所有的應(yīng)用程序中都離不開循環(huán)結(jié)構(gòu)一、循環(huán)程序的結(jié)構(gòu)2022/12/12匯編語言程序設(shè)計(jì)44第6章結(jié)構(gòu)化程序設(shè)442023/1/2匯編語言程序設(shè)計(jì)45(1)初始化部分:為循環(huán)做準(zhǔn)備,如累加器清零,設(shè)置地址指針和計(jì)數(shù)器的初始值等。(2)工作部分:實(shí)現(xiàn)循環(huán)的基本操作,也就是需要重復(fù)執(zhí)行的一段程序。(3)修改部分:修改指針、計(jì)數(shù)器的值,為下一次循環(huán)做準(zhǔn)備。(4)控制部分:判斷循環(huán)條件,結(jié)束循環(huán)或繼續(xù)循環(huán)。1.循環(huán)一般由以下4個(gè)部分組成:6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)45(1)初始化部分:為452023/1/2匯編語言程序設(shè)計(jì)46(1)先判斷后循環(huán),即WHILE循環(huán)。2.根據(jù)循環(huán)結(jié)束判斷在循環(huán)中的位置,有以下兩種結(jié)構(gòu)的循環(huán):(2)先循環(huán)后判斷,即DO-WHILE循環(huán)或DO-UNTIL循環(huán)。循環(huán)次數(shù)最少為0次循環(huán)次數(shù)最少為1次6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)46(1)先判斷后循環(huán),462023/1/2匯編語言程序設(shè)計(jì)476.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)476.4循環(huán)程序472023/1/2匯編語言程序設(shè)計(jì)48循環(huán)的次數(shù)已知,常用CX寄存器(也可以用其他寄存器或存儲(chǔ)器單元)記錄循環(huán)的次數(shù)(稱為“循環(huán)計(jì)數(shù)器”)。進(jìn)行減法計(jì)數(shù)時(shí),循環(huán)計(jì)數(shù)器的初值直接設(shè)為循環(huán)次數(shù),每循環(huán)一次將計(jì)數(shù)器減1,計(jì)數(shù)器減為0時(shí),循環(huán)結(jié)束。3.按照循環(huán)結(jié)束的條件,有以下兩類循環(huán):(1)計(jì)數(shù)循環(huán):6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)48循環(huán)的次數(shù)已482023/1/2匯編語言程序設(shè)計(jì)49循環(huán)的次數(shù)事先并不確定,每次循環(huán)開始前或結(jié)束后測試某個(gè)條件,根據(jù)這個(gè)條件是否滿足來決定是否繼續(xù)下一次循環(huán)。(2)條件循環(huán):6.4循環(huán)程序設(shè)計(jì)條件循環(huán)更具普遍意義2022/12/12匯編語言程序設(shè)計(jì)49循環(huán)494.循環(huán)控制條件的選擇
(1)循環(huán)次數(shù)已知:循環(huán)次數(shù)作為循環(huán)控制條件,用LOOP指令完成。
(2)循環(huán)次數(shù)已知,但可能會(huì)提前結(jié)束:可用LOOPZ、LOOPNZ指令完成。
(3)循環(huán)次數(shù)未知:根據(jù)具體的情況找出循環(huán)結(jié)束條件,用條件轉(zhuǎn)移、JMP等完成。 2023/1/2匯編語言程序設(shè)計(jì)506.4循環(huán)程序設(shè)計(jì)4.循環(huán)控制條件的選擇 (1)循環(huán)次數(shù)已知:循環(huán)次數(shù)作為循502023/1/2匯編語言程序設(shè)計(jì)51計(jì)數(shù)循環(huán)是基本的循環(huán)組織方式,用循環(huán)計(jì)數(shù)器的值來控制循環(huán),有時(shí)候也可以結(jié)合其它條件共同控制。二、計(jì)數(shù)循環(huán):LOOPLOOPZ/LOOPELOOPNZ/LOOPNE6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)51計(jì)數(shù)循環(huán)是基本的循環(huán)51 :START: MOV BX,1 ;項(xiàng)
MOV AX,0 ;部分和
MOV CX,100 ;循環(huán)次數(shù)AGAIN: ADD AX,BX ;循環(huán)工作部分
INC BX ;修改部分
LOOP AGAIN ;循環(huán)控制
MOV S,AX ;存結(jié)果
:[例1]計(jì)算S=1+2+3+……+100倒計(jì)數(shù)法2023/1/2匯編語言程序設(shè)計(jì)526.4循環(huán)程序設(shè)計(jì) :[例1]計(jì)算S=1+2+3+……+100倒計(jì)數(shù)法2052 :MOV CX,2801 ;初始化DELAY:LOOP DELAY ;循環(huán)體、循環(huán)控制
:
[例2]延時(shí)程序(10ms)2023/1/2匯編語言程序設(shè)計(jì)536.4循環(huán)程序設(shè)計(jì) :[例2]延時(shí)程序(10ms)2022/12/12532023/1/2匯編語言程序設(shè)計(jì)54CRLF MACRO MOV AH,2 MOV DL,0DH INT 21H MOV DL,0AH INT 21H ENDM[例3]從鍵盤上輸入一個(gè)字符串(不超過80個(gè)字符),將它逆序后輸出。6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)54CRLF MACRO542023/1/2匯編語言程序設(shè)計(jì)55DATA SEGMENTBUFFER DB 81,?,81DUP(?)MESS DB 0AH,0DH,‘Inputastringplease:$’DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOVAX,DATA MOV DS,AX LEA DX,MESS MOV AH,09H INT 21H ;輸出提示信息
MOV AH,0AH LEA DX,BUFFER INT 21H ;輸入字符串6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)55DATA SEGM552023/1/2匯編語言程序設(shè)計(jì)56 CRLF LEA BX,BUFFER ;緩沖區(qū)首地址送BX MOV CL,BUFFER+1 MOV CH,0 ;輸入字符個(gè)數(shù)送CX(循環(huán)次數(shù)) ADD BX,CX INC BX ;計(jì)算字符串末地址送BX(指針)DISP: MOVDL,[BX] MOV AH,02H INT 21H ;逆序輸出一個(gè)字符
DEC BX ;修改指針
LOOP DISP ;計(jì)數(shù)循環(huán)
CRLF ;輸出換行、回車,結(jié)束本行
MOV AX,4C00H INT 21HCODE ENDS END START6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)56 CRLF6.456
[例4]P161例5.1
把BX寄存器中的二進(jìn)制數(shù)以十六進(jìn)制的形式在屏幕上顯示出來。Hb0501.asm上述例子都是倒計(jì)數(shù)法,正計(jì)數(shù)法一般不用。2023/1/2匯編語言程序設(shè)計(jì)576.4循環(huán)程序設(shè)計(jì) [例4]P161例5.1上述例子都是倒計(jì)數(shù)法,正計(jì)數(shù)572023/1/2匯編語言程序設(shè)計(jì)58在循環(huán)次數(shù)未知的情況下,一般采用條件控制法編寫循環(huán)程序。三、條件循環(huán):6.4循環(huán)程序設(shè)計(jì)[例5]計(jì)算S=1+2×3+3×4+4×5+……+N(N+1)+……,直到N(N+1)項(xiàng)大于200為止。2022/12/12匯編語言程序設(shè)計(jì)58在循58
:START: MOV DX,1 ;和
MOV BL,2 ;NNEXT: MOV AL,BL ; INC BL ;N+1 MUL BL ;N(N+1)項(xiàng)
ADD DX,AX ;部分和
CMP AX,200 ;循環(huán)控制
JNA NEXT ; MOV S,DX :
2023/1/2匯編語言程序設(shè)計(jì)596.4循環(huán)程序設(shè)計(jì) :2022/12/12匯編語言程序設(shè)計(jì)596.4592023/1/2匯編語言程序設(shè)計(jì)60DATA SEGMENTSTRING DB‘Astringfortesting.’,0LENTH DW?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX[例7]字符串STRING以代碼0結(jié)束,求這個(gè)字符串的長度(字符個(gè)數(shù))。6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)60DATA SEGME602023/1/2匯編語言程序設(shè)計(jì)61
LEA SI,STRING ;裝載字符串指針
MOV CX,0 ;設(shè)置計(jì)數(shù)器初值TST: CMP BYTEPTR[SI],0 ;比較
JE DONE ;串結(jié)束,轉(zhuǎn)向DONE保存結(jié)果
INC SI ;修改指針
INC CX ;計(jì)數(shù)
JMP TST ;轉(zhuǎn)向TST,繼續(xù)循環(huán)DONE:MOVLENTH,CX ;保存結(jié)果
MOV AX,4C00H INT 21HCODE ENDS END START6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)61 LEA SI,612023/1/2匯編語言程序設(shè)計(jì)62
……
LEA SI,STRING-1 ;裝載字符串指針
MOV CX,-1 ;裝載計(jì)數(shù)器初值TST: INC SI ;修改指針
INC CX ;計(jì)數(shù)
CMP BYTEPTR[SI],0 ;比較
JNE TST ;未結(jié)束,轉(zhuǎn)TST繼續(xù)循環(huán)
MOV LENTH,CX;字符串結(jié)束,保存結(jié)果
……比較一下,這種風(fēng)格也很不錯(cuò):6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)62 ……比較一下,這種622023/1/2匯編語言程序設(shè)計(jì)63DATA SEGMENTARRAY DW1,2,3,4,5,6,-1AVRG DW? DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX[例8]一維無符號(hào)字?jǐn)?shù)組ARRAY以-1作為數(shù)組結(jié)束標(biāo)志,求這個(gè)數(shù)組各元素的平均值。6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)63DATA SEGME632023/1/2匯編語言程序設(shè)計(jì)64
LEA BX,ARRAY ;裝載數(shù)組指針
XOR CX,CX ;設(shè)置計(jì)數(shù)器初值
XOR DX,DX XOR AX,AX ;清累加器ONE: CMP WORDPTR[BX],-1;判數(shù)組是否結(jié)束
JE DONE;數(shù)組結(jié)束,轉(zhuǎn)DONE,結(jié)束處理
ADD AX,[BX] ;累加
ADC DX,0 ;保留進(jìn)位
ADD BX,2 ;修改指針
INC CX ;數(shù)組元素個(gè)數(shù)計(jì)數(shù)
JMP ONE 6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)64 LEA BX,A642023/1/2匯編語言程序設(shè)計(jì)65DONE: JCXZ NULL ;數(shù)組元素個(gè)數(shù)為0, ;不能求平均值
DIV CX ;計(jì)算數(shù)組平均值
MOV AVRG,AX ;保存結(jié)果
JMP EXITNULL: MOV AVRG,-1 ;數(shù)組為“空”,記 ;平均值為-1EXIT: MOV AX,4C00H INT 21HCODE ENDS END START6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)65DONE: JCXZ652023/1/2匯編語言程序設(shè)計(jì)66DATA SEGMENTPOSITION DW ?STRING DB ‘Thisisastringforexample.’,0DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODESTART: MOV AX,DATA MOV DS,AX[例9]查找字母’a’在字符串STRING中第一次出現(xiàn)的位置,如果未出現(xiàn),置位置值為-1。6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)66DATA SEGME662023/1/2匯編語言程序設(shè)計(jì)67
MOV SI,-1 ;SI用作字符串字符指針
MOV CX,30 ;字符串長度30L0: INC SI ;修改指針
CMP STRING[SI],‘a(chǎn)’ ;一個(gè)字符與’a’進(jìn)行比較
LOOPNE L0 ;字符串未結(jié)束,未找到,繼續(xù)
JNE NOTFOUND ;未找到,轉(zhuǎn)“NOTFOUND” MOV POSITION,SI ;保存位置值
JMP EXITNOTFOUND: MOV POSITION,-1;未找到,置位置值為-1EXIT: MOV AX,4C00H INT 21HCODE ENDS END START6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)67 MOV SI,-672023/1/2匯編語言程序設(shè)計(jì)68(1)字符串內(nèi)找到字符’a’:循環(huán)結(jié)束時(shí)ZF=1,SI內(nèi)是字符的出現(xiàn)位置(從0開始);(2)字符串內(nèi)未找到字符’a’:循環(huán)結(jié)束時(shí)ZF=0,SI內(nèi)是字符串的長度-1(30-1=29)。6.4循環(huán)程序設(shè)計(jì)程序使用LOOPNE指令來控制循環(huán),既有計(jì)數(shù)控制,又有條件控制。循環(huán)結(jié)束有兩種可能性:所以,對(duì)于LOOPZ/LOOPE,LOOPNZ/LOOPNE控制的循環(huán),一般應(yīng)在循環(huán)結(jié)束后用條件轉(zhuǎn)移指令分這兩種情況,分別處理。2022/12/12匯編語言程序設(shè)計(jì)68(1)字符串內(nèi)找到字682023/1/2匯編語言程序設(shè)計(jì)69DATA SEGMENTC10 DW 10NUM DW ?SIGN DB ?ERRMSG DB0DH,0AH,‘InputaDecimalDigit(0~9):$’DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODESTART: MOV AX,DATA MOV DS,AX[例10]從鍵盤上輸入一個(gè)有符號(hào)整數(shù)(假設(shè)在-32768~+32767之間),將它轉(zhuǎn)換成二進(jìn)制補(bǔ)碼,存入NUM單元。6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)69DATA SEGM692023/1/2匯編語言程序設(shè)計(jì)70
MOV NUM,0 ;累加器清零
MOV SIGN,0 ;符號(hào)預(yù)設(shè)為0(表示“+”)BEGIN:MOVAH,1
INT 21H ;從鍵盤輸入一個(gè)字符
CMP AL,0DH
JE EXIT ;是回車,轉(zhuǎn)EXIT,結(jié)束
CMP AL,“+”
JE INPUT ;是“+”,轉(zhuǎn)INPUT輸入下一個(gè)字符
CMP AL,“-”
JNE TWO ;非符號(hào)字符,轉(zhuǎn)TWO處理該字符
MOV SIGN,1 ;是“-”,把符號(hào)標(biāo)識(shí)為1(表示“-”)6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)70 MOV NUM,702023/1/2匯編語言程序設(shè)計(jì)71
INPUT:MOVAH,1 INT 21H ;從鍵盤再輸入一個(gè)字符
CMP AL,0DH JE DONE ;是回車,轉(zhuǎn)DONE,結(jié)束處理TWO: CMP AL,“0” JB ERRINPUT ;輸入非數(shù)字,顯示出錯(cuò)信息
CMP AL,“9” JA ERRINPUT ;輸入非數(shù)字,顯示出錯(cuò)信息
MOV BX,AX ;輸入字符轉(zhuǎn)移到BX寄存器
AND BX,000FH ;轉(zhuǎn)換成二進(jìn)制數(shù)
MOV AX,NUM MUL C10 ADD AX,BX ;新輸入數(shù)字拼接到已輸入數(shù)字中
MOV NUM,AX JMP INPUT ;轉(zhuǎn)INPUT,輸入下一個(gè)字符6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)71 INPUT:MOV712023/1/2匯編語言程序設(shè)計(jì)72ERRINPUT: LEA DX,ERRMSG MOV AH,9 INT 21H ;顯示出錯(cuò)信息
JMP INPUT ;轉(zhuǎn)INPUT,重新輸入DONE: CMP SIGN,0 ;判符號(hào)位
JE EXIT NEG NUM ;符號(hào)為“-”,對(duì)已輸入數(shù)求補(bǔ)EXIT:MOV AX,4C00H INT 21HCODEENDS END START6.4循環(huán)程序設(shè)計(jì)2022/12/12匯編語言程序設(shè)計(jì)72ERRINPUT:672
: MOV CX,0 ;初始,CX為計(jì)數(shù)器LOP: AND AX,AX ;先判斷,TESTAX,0FFFFH也可
JZ STOP ;AX為0,結(jié)束循環(huán)
SAL AX,1 JNC NOD INC CX ;計(jì)數(shù),INCCL NOD: JMP LOP STOP:HLT
[例11]AX寄存器中的一個(gè)16位二進(jìn)制數(shù),編程統(tǒng)計(jì)其中1的個(gè)數(shù),結(jié)果存入CL中。先判斷后循環(huán)的例子2023/1/2匯編語言程序設(shè)計(jì)736.4循環(huán)程序設(shè)計(jì)優(yōu)點(diǎn):減少循環(huán)次數(shù) :[例11]AX寄存器中的一個(gè)16位二進(jìn)制數(shù),編程統(tǒng)73
[例12]P163例5.2
在ADD單元存放著數(shù)Y的地址,試編程把Y中1的個(gè)數(shù)存入COUNT單元。Hb0502.asm2023/1/2匯編語言程序設(shè)計(jì)746.4循環(huán)程序設(shè)計(jì) [例12]P163例5.22022/12/12匯編語言程74
利用變址寄存器或基址寄存器(SI、DI、BX、BP),有間接尋址、變址尋址等方式訪問數(shù)據(jù)。每循環(huán)一次,修改一次變址或基址寄存器,指向下一個(gè)數(shù)據(jù)。
循環(huán)程序設(shè)計(jì)根據(jù)算法需要可以采用多種尋址方式訪問數(shù)據(jù)。2023/1/2匯編語言程序設(shè)計(jì)756.4循環(huán)程序設(shè)計(jì) 利用變址寄存器或基址寄存器(SI、DI、BX、BP),75
[例1]找最大(?。?shù)。Maxmin.asm
[例2]多字節(jié)相加(減)的完整匯編程序,要求能顯示結(jié)果。Multiadd.asm注意:相加結(jié)果的每位<=9。
2023/1/2匯編語言程序設(shè)計(jì)766.4循環(huán)程序設(shè)計(jì) [例1]找最大(?。?shù)。Maxmin.asm202276
[例3]編程將以S1為起始地址的26個(gè)字母,依次送到以S2為起始地址的連續(xù)字節(jié)存儲(chǔ)單元中。 方法一、采用寄存器間接尋址方式編程。
Movchar1.asm
方法二、采用變址尋址方式編程。
Movchar2.asm
方法三、采用基址+變址尋址方式編程。
Movchar3.asm
方法四、采用串操作指令編程。
Movchar4.asm2023/1/2匯編語言程序設(shè)計(jì)776.4循環(huán)程序設(shè)計(jì) [例3]編程將以S1為起始地址的26個(gè)字母,依次送到以77
[例4]在BUFFER為首地址的單元開始,存放了N個(gè)單字節(jié)的有符號(hào)數(shù),編程統(tǒng)計(jì)其中負(fù)數(shù)的個(gè)數(shù)。Cminus.asm2023/1/2匯編語言程序設(shè)計(jì)786.4循環(huán)程序設(shè)計(jì) [例4]在BUFFER為首地址的單元開始,存放了N個(gè)78多重循環(huán)——在循環(huán)程序的循環(huán)體中又包含著循環(huán)結(jié)構(gòu)。雙重循環(huán)的一般結(jié)構(gòu):四、多重循環(huán)2023/1/2匯編語言程序設(shè)計(jì)796.4循環(huán)程序設(shè)計(jì)多重循環(huán)——在循環(huán)程序的循環(huán)體中又包含著循環(huán)結(jié)構(gòu)。四、多重循79外循環(huán)初值內(nèi)循環(huán)初值外層程序段1內(nèi)層循環(huán)體外層程序段2內(nèi)層循環(huán)控制外層循環(huán)控制內(nèi)層循環(huán)外層
循
環(huán)6.4循環(huán)程序設(shè)計(jì)外循環(huán)初值內(nèi)循環(huán)初值外層程序段1內(nèi)層循環(huán)體外層程序段2內(nèi)層循80
[例1]在內(nèi)存DATA開始存放100個(gè)字節(jié)數(shù)據(jù),編程統(tǒng)計(jì)這些數(shù)據(jù)內(nèi)“0”和“1”的個(gè)數(shù)相等的數(shù)據(jù)個(gè)數(shù),并存入NUMB單元。Count01.asm2023/1/2匯編語言程序設(shè)計(jì)816.4循環(huán)程序設(shè)計(jì) [例1]在內(nèi)存DATA開始存放100個(gè)字節(jié)數(shù)據(jù),編程統(tǒng)計(jì)81
[例2]從內(nèi)存BUF單元開始存放有若干字節(jié)的數(shù)據(jù)塊,編程統(tǒng)計(jì)該數(shù)據(jù)塊中,所有位為“1”的個(gè)數(shù)。Count1.asm2023/1/2匯編語言程序設(shè)計(jì)826.4循環(huán)程序設(shè)計(jì) [例2]從內(nèi)存BUF單元開始存放有若干字節(jié)的數(shù)據(jù)塊,編程82[例3]用雙重循環(huán)編寫軟件延時(shí)子程序。SOFTDLY PROC MOV BL,100DELAY: MOV CX,2801 ;內(nèi)循環(huán),延時(shí)10msWAIT: LOOP WAIT DEC BL JNC DELAY RETSOFTDLY ENDP2023/1/2匯編語言程序設(shè)計(jì)836.4循環(huán)程序設(shè)計(jì)[例3]用雙重循環(huán)編寫軟件延時(shí)子程序。2022/12/1283主要: 匯編語言程序設(shè)計(jì)的一般步驟 順序、分支、循環(huán)程序的基本結(jié)構(gòu)和程序設(shè)計(jì)方法。重點(diǎn):
雙分支程序中的產(chǎn)生條件和條件轉(zhuǎn)移指令。 循環(huán)程序由初始化、循環(huán)體和循環(huán)控制三個(gè)部分組成。 掌握循環(huán)程序中的計(jì)數(shù)法和條件法。其它:多分支程序的實(shí)現(xiàn)方法;多重循環(huán)結(jié)構(gòu)。第6章 小結(jié)2023/1/2匯編語言程序設(shè)計(jì)84主要:第6章 小結(jié)2022/12/12匯編語言程序設(shè)計(jì)8484第6章 習(xí)題2023/1/2匯編語言程序設(shè)計(jì)85第一次:6.16.2
6.3第二次:6.46.56.8選做:6.156.20第6章 習(xí)題2022/12/12匯編語言程序設(shè)計(jì)85第一次:85謝謝!2023/1/2匯編語言程序設(shè)計(jì)86謝謝!2022/12/12匯編語言程序設(shè)計(jì)86862023/1/2匯編語言程序設(shè)計(jì)876.1概述6.2順序程序設(shè)計(jì)6.3分支程序設(shè)計(jì)6.4循環(huán)程序設(shè)計(jì)第6章結(jié)構(gòu)化程序設(shè)計(jì)方法2022/12/12匯編語言程序設(shè)計(jì)16.1概述第6章872023/1/2匯編語言程序設(shè)計(jì)88第6章結(jié)構(gòu)化程序設(shè)計(jì)方法(1)分析問題。對(duì)問題進(jìn)行充分的分析,確定問題是什么,解決問題的步驟又是什么。(2)確定算法和數(shù)據(jù)結(jié)構(gòu)。根據(jù)問題的分析結(jié)果,選擇合適的解決方案即算法。(3)編制程序。將算法和數(shù)據(jù)結(jié)構(gòu)等轉(zhuǎn)換成程序代碼。(4)調(diào)試程序。在計(jì)算機(jī)上實(shí)際運(yùn)行,進(jìn)行程序的測試和調(diào)整,直至獲得預(yù)期的結(jié)果。6.1概述程序設(shè)計(jì)的一般步驟2022/12/12匯編語言程序設(shè)計(jì)2第6章結(jié)構(gòu)化程序設(shè)計(jì)882023/1/2匯編語言程序設(shè)計(jì)896.1概述匯編語言程序設(shè)計(jì)的一般步驟:1.分析問題,抽象出描述問題的數(shù)學(xué)模型。2.確定解決問題的算法或算法思想。3.繪制流程圖或結(jié)構(gòu)圖。4.分配存儲(chǔ)空間及工作單元(包括寄存器)。5.逐條編寫程序。6.靜態(tài)檢查。7.上機(jī)運(yùn)行調(diào)試。2022/12/12匯編語言程序設(shè)計(jì)36.1概述匯編語言892023/1/2匯編語言程序設(shè)計(jì)90(1)任何程序都可以由3種基本結(jié)構(gòu)程序構(gòu)成順序結(jié)構(gòu)分支(條件選擇)結(jié)構(gòu)循環(huán)結(jié)構(gòu)(2)每一個(gè)結(jié)構(gòu)只有一個(gè)入口和一個(gè)出口結(jié)構(gòu)化程序設(shè)計(jì)原則:6.1概述
在匯編語言中,選擇和循環(huán)結(jié)構(gòu)必須通過比較或測試指令、算術(shù)邏輯指令、條件轉(zhuǎn)移指令和循環(huán)指令等來完成。2022/12/12匯編語言程序設(shè)計(jì)4(1)任何程序都可以由902023/1/2匯編語言程序設(shè)計(jì)91第6章結(jié)構(gòu)化程序設(shè)計(jì)方法順序程序結(jié)構(gòu)是完全按順序逐條執(zhí)行的指令序列。即指令指針I(yè)P順序往下,不發(fā)生跳變。6.2順序結(jié)構(gòu)程序設(shè)計(jì)在程序中大量以程序段出現(xiàn)。順序程序設(shè)計(jì)是復(fù)雜程序設(shè)計(jì)的基礎(chǔ)。特點(diǎn):無分支、無循環(huán)。2022/12/12匯編語言程序設(shè)計(jì)5第6章結(jié)構(gòu)化程序設(shè)計(jì)91順序程序舉例
[例1]將一字節(jié)數(shù)據(jù)從數(shù)據(jù)段的某個(gè)單元傳送到另一單元。DATA SEGMENTFIRST DB 7AHSECOND DB ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX
MOV AL,F(xiàn)IRST MOV SECOND,AL MOV AH,4CH INT 21HCODE ENDS END START6.2順序結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)92順序程序舉例 [例1]將一字節(jié)數(shù)據(jù)從數(shù)據(jù)段的某個(gè)單元傳送到922023/1/2匯編語言程序設(shè)計(jì)936.2順序結(jié)構(gòu)程序設(shè)計(jì)DATA SEGMENTBUF DB 7AH,48HSUM DB ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX
MOV AL,BUF ADD AL,BUF+1 MOV SUM,AL MOV AH,4CH INT 21HCODE ENDS END START[例2]將存儲(chǔ)器中的兩個(gè)字節(jié)數(shù)相加,結(jié)果存入另一單元。順序程序舉例2022/12/12匯編語言程序設(shè)計(jì)76.2順序結(jié)構(gòu)程93順序程序舉例
[例3]按公式Y(jié)=XX-50編程。
: :
X DB 45H Y DW ? : :
MOV AL,X MUL AL AUB AX,50 MOV Y,AX
: :
6.2順序結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)94順序程序舉例 [例3]按公式Y(jié)=XX-50編程。 :694順序程序舉例
[例4]將一字節(jié)壓縮型BCD碼轉(zhuǎn)換為兩個(gè)ASCII碼。
:BCDBUF DB 59HASCBUF DB 2DUP(?)
:
MOV AL,BCDBUF MOV BL,AL MOV CL,4 SHR BL,CL ADD BL,30H MOV ASCBUF,BL AND AL,0FH ADD AL,30H MOV ASCBUF+1,AL
:
6.2順序結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)95順序程序舉例 [例4]將一字節(jié)壓縮型BCD碼轉(zhuǎn)換為兩個(gè)AS95順序程序舉例
[例5]單字節(jié)壓縮型BCD數(shù)的加法運(yùn)算。(考慮進(jìn)位)
:A DB 59HB DB 81HC DB 2DUP(?)
:
MOV AL,A ADD AL,B DAA MOV C,AL
LAHF AND AH,01H MOV C+1,AH
:
SZ_A_P_C6.2順序結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)96順序程序舉例 [例5]單字節(jié)壓縮型BCD數(shù)的加法運(yùn)算。(考96
[例6]用查表法完成將從鍵盤輸入的一位十進(jìn)制數(shù)轉(zhuǎn)換為對(duì)應(yīng)的平方值。
:SQU DB 0,1,4,9,16,25,36,49,64,81BUF DB ?
:
MOV AH,1 INT 21H AND AL,OFH LEA BX,SQU XLAT MOV BUF,AL
:
6.2順序結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)97 [例6]用查表法完成將從鍵盤輸入的一位十進(jìn)制數(shù)轉(zhuǎn)換為對(duì)應(yīng)的972023/1/2匯編語言程序設(shè)計(jì)98第6章結(jié)構(gòu)化程序設(shè)計(jì)方法分支程序結(jié)構(gòu)——根據(jù)某些條件進(jìn)行邏輯判斷,當(dāng)滿足時(shí)進(jìn)行某種處理;當(dāng)不滿足時(shí)進(jìn)行另一種處理。6.3分支結(jié)構(gòu)程序設(shè)計(jì)用條件轉(zhuǎn)移指令實(shí)現(xiàn),實(shí)現(xiàn)計(jì)算機(jī)的邏輯判斷能力。特定:只執(zhí)行二分支或多分支中的一個(gè)分支。2022/12/12匯編語言程序設(shè)計(jì)12第6章結(jié)構(gòu)化程序設(shè)98一、分支結(jié)構(gòu)的兩種形式:
二分支結(jié)構(gòu)多分支結(jié)構(gòu)6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)99一、分支結(jié)構(gòu)的兩種形式: 二分支結(jié)構(gòu)6.3分支結(jié)構(gòu)程991.二分支結(jié)構(gòu)
6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)100
條件分支程序段1分支程序段2
條件分支程序段2雙分支程序相當(dāng)于高級(jí)語言中的IF-THEN-ELSE語言。右圖只對(duì)其中之一分支進(jìn)行處理,也稱為單分支結(jié)構(gòu)。1.二分支結(jié)構(gòu) 6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/12/1002.多分支結(jié)構(gòu)多分支程序相當(dāng)于高級(jí)語言中的CASE語句。
條件程序段1程序段2程序段n…...條件1條件2條件n6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)1012.多分支結(jié)構(gòu)多分支程序相當(dāng)于高級(jí)語言中的CASE語句。條101注意: 在分支程序的兩種結(jié)構(gòu)中,無論條件是否滿足,只能走一個(gè)分支,不可能同時(shí)走兩個(gè)分支。 且程序只有一個(gè)入口一個(gè)出口。6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)102注意:6.3分支結(jié)構(gòu)程序設(shè)計(jì)2022/12/12匯編語1021.二分支程序的一般結(jié)構(gòu)
一般要有產(chǎn)生條件、測試、定向、標(biāo)號(hào)四個(gè)部分組成。 也就是先通常用CMP、TEST、SUB、AND和移位指令等,影響標(biāo)志位,再使用分支轉(zhuǎn)移指令。如: CMP AX,0 ;條件
JC NEXT ;測試、定向 :
NEXT:NEG AX ;標(biāo)號(hào)
二、二分支程序設(shè)計(jì)6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)1031.二分支程序的一般結(jié)構(gòu)二、二分支程序設(shè)計(jì)6.3分支結(jié)103(1)單分支結(jié)構(gòu)一
: ;程序段1 : ;產(chǎn)生條件
JCC BRANCHS2: : ;程序段2 : HLT BRANCH: : ;分支程序段
: : JMP S2S2:否是BRANCH:分支程序段程序段1產(chǎn)生條件條件?程序段26.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)104(1)單分支結(jié)構(gòu)一S2:否是BRANCH:分支程序段程序段1104(2)單分支結(jié)構(gòu)二S1: : ;程序段1 : ;產(chǎn)生條件
JCC S2 ;條件滿足,轉(zhuǎn)S2BRANCH: : ;分支程序段
: : S2:
: ;程序段2 : HLT ;結(jié)束S2:否是BRANCH:分支程序段程序段1產(chǎn)生條件條件?程序段26.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)105(2)單分支結(jié)構(gòu)二S2:否是BRANCH:分支程序段程序段1105
MOV AL,X CMP AL,0
JL BS2:MOV Y,AL HLTB: NEG AL JMP S2
MOV AL,X CMP AL,0
JGE S2
NEG ALS2:MOV Y,AL HLT例:求Y=|A|6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)106 MOV AL,X MOV AL,X例:求Y=|A|6.3106(3)雙分支結(jié)構(gòu)一S1: : 程序段1 : ;產(chǎn)生條件
JCC BRANCH : ;分支程序段1 : S2: : ;程序段2 : HLT ;結(jié)束BRANCH: : ;分支程序段2 :
JMP S2 S2:否是BRANCH:分支程序段2程序段1產(chǎn)生條件條件?程序段2分支程序段16.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)107(3)雙分支結(jié)構(gòu)一S2:否是BRANCH:分支程序段2程序段107(4)雙分支結(jié)構(gòu)二S1: : ;程序段1 : ;產(chǎn)生條件
JCC BRANCH : ;分支程序段1 : JMP S2BRANCH: : ;分支程序段2 : S2: : ;程序段2 : HLT S2:否是BRANCH:分支程序段2程序段1產(chǎn)生條件條件?程序段2分支程序段16.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)108(4)雙分支結(jié)構(gòu)二S2:否是BRANCH:分支程序段2程序段108
AND AL,0FH
CMP AL,10
JL B
ADD AL,37HS2:MOV DL,AL MOV AH,2 INT 21H HLTB: ADD AL,30H
JMP S2
AND AL,0FH
CMP AL,10
JGE B
ADD AL,30H
JMP S2B: ADD AL,37HS2:MOV DL,AL MOV AH,2 INT 21H HLT
例:將AL中的一位十六進(jìn)制數(shù)顯示出來。6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)109 AND AL,0FH AND AL,0FH例:將AL中的一109
AND AL,0FH
CMP AL,10
JL B
ADD AL,37HS2:MOV DL,AL MOV AH,2 INT 21H HLTB: ADD AL,30H
JMP S2改為單分支形式:
AND AL,0FH
CMP AL,10
JL B
ADD AL,7B: ADD AL,30H MOV DL,AL MOV AH,2 INT 21H HLT
例:將AL中的一位十六進(jìn)制數(shù)顯示出來。6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)110 AND AL,0FH改為單分支形式:例:將AL中的一位十六1102.雙分支程序設(shè)計(jì)舉例 SOURCE DB12,78MAX DB? : MOVAL,SOURCE CMPAL,SOURCE+1
JNCBRANCH MOVAL,SOURCE+1BRANCH:
MOVMAX,AL
:[例1]比較兩個(gè)無符號(hào)數(shù)的大小,把大數(shù)存入MAX單元。EP601.asm6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)1112.雙分支程序設(shè)計(jì)舉例 SOURCE DB12,111BLOCK DB 'Searchalargestcharacter!'COUNT EQU $-BLOCK
[例3]設(shè)在一字符串中,找出ASCII值最大的顯示。EP603.asm
LEA SI,BLOCK MOV CX,COUNT-1 MOV AL,[SI] INC SICOMP:CMP AL,[SI] JA NEXT MOV AL,[SI]NEXT:INC SILOOPCOMPMOV DL,ALMOV AH,2 INT21H6.3分支結(jié)構(gòu)程序設(shè)計(jì)2023/1/2匯編語言程序設(shè)計(jì)112BLOCK DB 'Searchalargestch112START: MOV AL,5DH
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 駕校代理合同協(xié)議書
- 解除基金合同協(xié)議書
- 茶葉公司訂購協(xié)議書
- 退休電工返聘協(xié)議書
- 借款及股權(quán)轉(zhuǎn)讓協(xié)議書
- 顧客合同賠償協(xié)議書
- 鄰里房屋搭建協(xié)議書
- 餐廳退股聲明協(xié)議書
- 轉(zhuǎn)讓合同退回協(xié)議書
- 轉(zhuǎn)運(yùn)簽訂免責(zé)協(xié)議書
- 《中醫(yī)常用護(hù)理技術(shù)基礎(chǔ)》課件-一般護(hù)理-第四節(jié)飲食護(hù)理
- 老年患者的血液透析護(hù)理
- 數(shù)字化智慧病理科建設(shè)方案
- 佩戴腕帶品管圈課件
- 治超工作總結(jié)匯報(bào)
- 電氣五防操作培訓(xùn)課件
- 頸靜脈血栓的護(hù)理
- TCANSI 119-2023 船載水下機(jī)器人選用與操作一般要求
- 企業(yè)職業(yè)健康工作總結(jié)報(bào)告
- 樓盤交房裝修公司活動(dòng)策劃
- 《高速鐵路客運(yùn)服務(wù)禮儀》試題及答案 項(xiàng)目5 試題庫
評(píng)論
0/150
提交評(píng)論