第6章 結構化程序設計方法 課件_第1頁
第6章 結構化程序設計方法 課件_第2頁
第6章 結構化程序設計方法 課件_第3頁
第6章 結構化程序設計方法 課件_第4頁
第6章 結構化程序設計方法 課件_第5頁
已閱讀5頁,還剩80頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2023/9/12匯編語言程序設計16.1概述6.2順序程序設計6.3分支程序設計6.4循環程序設計第6章結構化程序設計方法2023/8/7匯編語言程序設計16.1概述第6章結12023/9/12匯編語言程序設計2第6章結構化程序設計方法(1)分析問題。對問題進行充分的分析,確定問題是什么,解決問題的步驟又是什么。(2)確定算法和數據結構。根據問題的分析結果,選擇合適的解決方案即算法。(3)編制程序。將算法和數據結構等轉換成程序代碼。(4)調試程序。在計算機上實際運行,進行程序的測試和調整,直至獲得預期的結果。6.1概述程序設計的一般步驟2023/8/7匯編語言程序設計2第6章結構化程序設計方法22023/9/12匯編語言程序設計36.1概述匯編語言程序設計的一般步驟:1.分析問題,抽象出描述問題的數學模型。2.確定解決問題的算法或算法思想。3.繪制流程圖或結構圖。4.分配存儲空間及工作單元(包括寄存器)。5.逐條編寫程序。6.靜態檢查。7.上機運行調試。2023/8/7匯編語言程序設計36.1概述匯編語言程序32023/9/12匯編語言程序設計4(1)任何程序都可以由3種基本結構程序構成順序結構分支(條件選擇)結構循環結構(2)每一個結構只有一個入口和一個出口結構化程序設計原則:6.1概述

在匯編語言中,選擇和循環結構必須通過比較或測試指令、算術邏輯指令、條件轉移指令和循環指令等來完成。2023/8/7匯編語言程序設計4(1)任何程序都可以由3種42023/9/12匯編語言程序設計5第6章結構化程序設計方法順序程序結構是完全按順序逐條執行的指令序列。即指令指針IP順序往下,不發生跳變。6.2順序結構程序設計在程序中大量以程序段出現。順序程序設計是復雜程序設計的基礎。特點:無分支、無循環。2023/8/7匯編語言程序設計5第6章結構化程序設計方法5順序程序舉例

[例1]將一字節數據從數據段的某個單元傳送到另一單元。DATA SEGMENTFIRST DB 7AHSECOND DB ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX

MOV AL,FIRST MOV SECOND,AL MOV AH,4CH INT 21HCODE ENDS END START6.2順序結構程序設計2023/9/12匯編語言程序設計6順序程序舉例 [例1]將一字節數據從數據段的某個單元傳送到62023/9/12匯編語言程序設計76.2順序結構程序設計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]將存儲器中的兩個字節數相加,結果存入另一單元。順序程序舉例2023/8/7匯編語言程序設計76.2順序結構程序設7順序程序舉例

[例3]按公式Y=X

X-50編程。

: :

X DB 45H Y DW ? : :

MOV AL,X MUL AL AUB AX,50 MOV Y,AX

: :

6.2順序結構程序設計2023/9/12匯編語言程序設計8順序程序舉例 [例3]按公式Y=XX-50編程。 :68順序程序舉例

[例4]將一字節壓縮型BCD碼轉換為兩個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順序結構程序設計2023/9/12匯編語言程序設計9順序程序舉例 [例4]將一字節壓縮型BCD碼轉換為兩個AS9順序程序舉例

[例5]單字節壓縮型BCD數的加法運算。(考慮進位)

: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順序結構程序設計2023/9/12匯編語言程序設計10順序程序舉例 [例5]單字節壓縮型BCD數的加法運算。(考10

[例6]用查表法完成將從鍵盤輸入的一位十進制數轉換為對應的平方值。

: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順序結構程序設計2023/9/12匯編語言程序設計11 [例6]用查表法完成將從鍵盤輸入的一位十進制數轉換為對應的112023/9/12匯編語言程序設計12第6章結構化程序設計方法分支程序結構——根據某些條件進行邏輯判斷,當滿足時進行某種處理;當不滿足時進行另一種處理。6.3分支結構程序設計用條件轉移指令實現,實現計算機的邏輯判斷能力。特定:只執行二分支或多分支中的一個分支。2023/8/7匯編語言程序設計12第6章結構化程序設計方12一、分支結構的兩種形式:

二分支結構多分支結構6.3分支結構程序設計2023/9/12匯編語言程序設計13一、分支結構的兩種形式: 二分支結構6.3分支結構程131.二分支結構

6.3分支結構程序設計2023/9/12匯編語言程序設計14

條件分支程序段1分支程序段2

條件分支程序段2雙分支程序相當于高級語言中的IF-THEN-ELSE語言。右圖只對其中之一分支進行處理,也稱為單分支結構。1.二分支結構 6.3分支結構程序設計2023/8/7142.多分支結構多分支程序相當于高級語言中的CASE語句。

條件程序段1程序段2程序段n…...條件1條件2條件n6.3分支結構程序設計2023/9/12匯編語言程序設計152.多分支結構多分支程序相當于高級語言中的CASE語句。條15注意: 在分支程序的兩種結構中,無論條件是否滿足,只能走一個分支,不可能同時走兩個分支。 且程序只有一個入口一個出口。6.3分支結構程序設計2023/9/12匯編語言程序設計16注意:6.3分支結構程序設計2023/8/7匯編語言程161.二分支程序的一般結構

一般要有產生條件、測試、定向、標號四個部分組成。 也就是先通常用CMP、TEST、SUB、AND和移位指令等,影響標志位,再使用分支轉移指令。如: CMP AX,0 ;條件

JC NEXT ;測試、定向 :

NEXT:NEG AX ;標號

二、二分支程序設計6.3分支結構程序設計2023/9/12匯編語言程序設計171.二分支程序的一般結構二、二分支程序設計6.3分支結17(1)單分支結構一

: ;程序段1 : ;產生條件

JCC BRANCHS2: : ;程序段2 : HLT BRANCH: : ;分支程序段

: : JMP S2S2:否是BRANCH:分支程序段程序段1產生條件條件?程序段26.3分支結構程序設計2023/9/12匯編語言程序設計18(1)單分支結構一S2:否是BRANCH:分支程序段程序段118(2)單分支結構二S1: : ;程序段1 : ;產生條件

JCC S2 ;條件滿足,轉S2BRANCH: : ;分支程序段

: : S2:

: ;程序段2 : HLT ;結束S2:否是BRANCH:分支程序段程序段1產生條件條件?程序段26.3分支結構程序設計2023/9/12匯編語言程序設計19(2)單分支結構二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分支結構程序設計2023/9/12匯編語言程序設計20 MOV AL,X MOV AL,X例:求Y=|A|6.320(3)雙分支結構一S1: : 程序段1 : ;產生條件

JCC BRANCH : ;分支程序段1 : S2: : ;程序段2 : HLT ;結束BRANCH: : ;分支程序段2 :

JMP S2 S2:否是BRANCH:分支程序段2程序段1產生條件條件?程序段2分支程序段16.3分支結構程序設計2023/9/12匯編語言程序設計21(3)雙分支結構一S2:否是BRANCH:分支程序段2程序段21(4)雙分支結構二S1: : ;程序段1 : ;產生條件

JCC BRANCH : ;分支程序段1 : JMP S2BRANCH: : ;分支程序段2 : S2: : ;程序段2 : HLT S2:否是BRANCH:分支程序段2程序段1產生條件條件?程序段2分支程序段16.3分支結構程序設計2023/9/12匯編語言程序設計22(4)雙分支結構二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中的一位十六進制數顯示出來。6.3分支結構程序設計2023/9/12匯編語言程序設計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中的一位十六進制數顯示出來。6.3分支結構程序設計2023/9/12匯編語言程序設計24 AND AL,0FH改為單分支形式:例:將AL中的一位十六242.雙分支程序設計舉例 SOURCE DB12,78MAX DB? : MOVAL,SOURCE CMPAL,SOURCE+1

JNCBRANCH MOVAL,SOURCE+1BRANCH:

MOVMAX,AL

:[例1]比較兩個無符號數的大小,把大數存入MAX單元。EP601.asm6.3分支結構程序設計2023/9/12匯編語言程序設計252.雙分支程序設計舉例 SOURCE DB12,25BLOCK DB 'Searchalargestcharacter!'COUNT EQU $-BLOCK

[例3]設在一字符串中,找出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分支結構程序設計2023/9/12匯編語言程序設計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]設將AL中的無符號數,按十六進制顯示。 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分支結構程序設計2023/9/12匯編語言程序設計27

EP604.asm

START: MOV AL,5DH[例4]設將AL中的27[例5]判斷變量X的值是否為“偶數”。6.3分支結構程序設計2023/9/12匯編語言程序設計28CODE SEGMENT ASSUME CS:CODESTART: JMP BEGINX DB ? ;被測試的數,匯編之前置入YES DB 0AH,0DH,“It’saevennumber.”,0AH,0DH,‘$’NO DB 0AH,0DH,“It’saoddnumber.”,0AH,0DH,‘$’BEGIN: PUSH CS POP DS[例5]判斷變量X的值是否為“偶數”。6.3分支結構程286.3分支結構程序設計2023/9/12匯編語言程序設計29 TEST X,1 ;測試X的最低位,確定是否為偶數

JZ EVN ;ZF=1,該數是偶數,轉向“EVN”ODD: LEA DX,NO ;否則,該數是奇數

MOV AH,9 INT 21H ;輸出奇數的相關信息

JMP DONE

;跳過程序“EVN”EVN: LEA DX,YES MOV AH,9 INT 21H ;輸出偶數的相關信息DONE:MOV AX,4C00H INT 21HCODE ENDS END START6.3分支結構程序設計2023/8/7匯編語言程序設計29如果兩個“平行”分支有相同的處理過程,可以把它們“合并”:

6.3分支結構程序設計2023/9/12匯編語言程序設計30 …… TEST X,1 ;測試X的最低位,確定是否為偶數

JZ EVN ;ZF=1,該數是偶數,轉向“EVN”ODD: LEA DX,NO;否則,該數是奇數

JMP DONE ;跳過程序“EVN”EVN: LEA DX,YES;該數是偶數DONE:MOV AH,9

INT 21H

;輸出該數的相關信息

MOVAX,4C00H ……如果兩個“平行”分支有相同的處理過程,可以把它們“合并”:30A DB12B DB78 :

MOVAL,A CMPB,AL JAEBGA

MOVDL,'A' MOVDH,'B' JMPCOM[例5’]設A、B兩單元各有一個無符號數,要求根據大小顯示“A>B”或“B>A”。EP605.asmBGA: MOVDL,'B' MOVDH,'A'COM: MOVAH,2 INT21H MOVDL,'>'

INT21H MOVDL,DH INT21H6.3分支結構程序設計2023/9/12匯編語言程序設計31A DB12[例5’]設A、B兩單元各有一31三、多分支程序設計1.復合選擇結構2.地址表法3.跳轉表法4.邏輯分解法

6.3分支結構程序設計2023/9/12匯編語言程序設計32三、多分支程序設計1.復合選擇結構6.3分支結構程序設32用多條條件轉移指令組合實現。一次判斷產生兩條分支,N次判斷產生N+1條分支。程序段4程序段1程序段2程序段3條件1條件2條件36.3分支結構程序設計2023/9/12匯編語言程序設計331.復合選擇結構用多條條件轉移指令組合實現。一次判斷產生兩條分支,N次判斷產33[例6]符號函數。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分支結構程序設計2023/9/12匯編語言程序設計34方法1,逐項排除[例6]符號函數。EP606.asmX DB 89346.3分支結構程序設計2023/9/12匯編語言程序設計35 CMP X,0 JG PLUS JE ZEROMINUS: MOV Y,-1 JMP DONEPLUS: MOV Y,1 JMP DONEZERO: MOV Y,0DONE: ……方法2,逐項確認6.3分支結構程序設計2023/8/7匯編語言程序設計35[例7]從鍵盤上輸入一個小寫字母,顯示該字母的前導和后繼。EP607.asm

6.3分支結構程序設計2023/9/12匯編語言程序設計36DATA SEGMENTPROMPT DB0DH,0AH,“Inputalowercaseletter:$”;提示ERR_MSG DB0DH,0AH,“Inputerror.$”;輸入錯誤警告BUF DB 0DH,0AH,‘Prev:’ ;輸出緩沖區PREV DB 20H DB 0DH,0AH,‘Succ:’SUCC DB 20H DB 0DH,0AH,‘$’DATA ENDS[例7]從鍵盤上輸入一個小寫字母,顯示該字母的前導和后繼。E366.3分支結構程序設計2023/9/12匯編語言程序設計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 ;輸入一個字符

CMP AL,‘a’ ;輸入正確性檢查

JB ERROR CMP AL,‘z’ JA ERROR 6.3分支結構程序設計2023/8/7匯編語言程序設計376.3分支結構程序設計2023/9/12匯編語言程序設計38

MOV BL,AL ;計算“前導”字母

DEC BL CMP BL,‘a’ JB SKIP1 ;“前導”非字母,跳過

MOV PREV,BL ;保存“前導”字母SKIP1:INC AL ;計算“后繼”字母

CMP AL,‘z’ JA SKIP2 ;“后繼”非字母,跳過

MOV SUCC,AL ;“后繼”為字母,保存SKIP2:LEA DX,BUF ;輸出“前導”和“后繼”字母

MOV AH,09H INT 21H 6.3分支結構程序設計2023/8/7匯編語言程序設計386.3分支結構程序設計2023/9/12匯編語言程序設計39

JMP EXIT ;跳過出錯處理程序ERROR: LEA DX,ERR-MSG;顯示出錯信息

MOV AH,09H INT 21H JMP INPUT ;要求重新輸入EXIT: MOV AX,4C00H ;返回OS INT 21HCODE ENDS END START6.3分支結構程序設計2023/8/7匯編語言程序設計392.地址表法 其設計思想是在數據段中定義一張地址表,將各個分支程序段的入口地址放入表中,然后根據各分支程序的編號,在地址表中找出轉向某個分支程序的入口地址。

表地址=地址表首址+編號*2

6.3分支結構程序設計2023/9/12匯編語言程序設計402.地址表法6.3分支結構程序設計2023/8/7匯編40

例:設有0,1,……N,共N+1個分支程序,各分支程序的入口分別為ADD0,ADD1,……ADDN。 DATA SEGMENTNUM DB NADTAB DW ADD0,ADD1,…,ADDNDATA ENDS6.3分支結構程序設計2023/9/12匯編語言程序設計41 例:設有0,1,……N,共N+1個分支程序,各分支程序的入41

:MOV AH,0MOV AL,NUMADD AX,AXMOV SI,AXMOV BX,ADTAB[SI]JMP NEARPTRBX

: :代碼段中:

:ADDR0: : :ADDR1: : :ADDRN: : :6.3分支結構程序設計2023/9/12匯編語言程序設計42 :代碼段中: :6.3分支結構程序設計2023/8423.轉移表法 與地址表法類似,不同的是表中建立的是轉移指令表。

BRATAB: JMP SHORTM0 JMP SHORTM1

: :

JMP SHORTM9M0: :M1: : :M9: :6.3分支結構程序設計2023/9/12匯編語言程序設計433.轉移表法BRATAB: JMP SHORTM0M0:6432023/9/12匯編語言程序設計44第6章結構化程序設計方法循環結構——也稱“重復結構”,重復執行一組指令若干次,用有限長度的程序完成大量的處理任務,實現計算機的重復操作。

6.4循環程序設計幾乎所有的應用程序中都離不開循環結構一、循環程序的結構2023/8/7匯編語言程序設計44第6章結構化程序設計方442023/9/12匯編語言程序設計45(1)初始化部分:為循環做準備,如累加器清零,設置地址指針和計數器的初始值等。(2)工作部分:實現循環的基本操作,也就是需要重復執行的一段程序。(3)修改部分:修改指針、計數器的值,為下一次循環做準備。(4)控制部分:判斷循環條件,結束循環或繼續循環。1.循環一般由以下4個部分組成:6.4循環程序設計2023/8/7匯編語言程序設計45(1)初始化部分:為循環452023/9/12匯編語言程序設計46(1)先判斷后循環,即WHILE循環。2.根據循環結束判斷在循環中的位置,有以下兩種結構的循環:(2)先循環后判斷,即DO-WHILE循環或DO-UNTIL循環。循環次數最少為0次循環次數最少為1次6.4循環程序設計2023/8/7匯編語言程序設計46(1)先判斷后循環,即W462023/9/12匯編語言程序設計476.4循環程序設計2023/8/7匯編語言程序設計476.4循環程序設計472023/9/12匯編語言程序設計48循環的次數已知,常用CX寄存器(也可以用其他寄存器或存儲器單元)記錄循環的次數(稱為“循環計數器”)。進行減法計數時,循環計數器的初值直接設為循環次數,每循環一次將計數器減1,計數器減為0時,循環結束。3.按照循環結束的條件,有以下兩類循環:(1)計數循環:6.4循環程序設計2023/8/7匯編語言程序設計48循環的次數已知,482023/9/12匯編語言程序設計49循環的次數事先并不確定,每次循環開始前或結束后測試某個條件,根據這個條件是否滿足來決定是否繼續下一次循環。(2)條件循環:6.4循環程序設計條件循環更具普遍意義2023/8/7匯編語言程序設計49循環的次494.循環控制條件的選擇

(1)循環次數已知:循環次數作為循環控制條件,用LOOP指令完成。

(2)循環次數已知,但可能會提前結束:可用LOOPZ、LOOPNZ指令完成。

(3)循環次數未知:根據具體的情況找出循環結束條件,用條件轉移、JMP等完成。 2023/9/12匯編語言程序設計506.4循環程序設計4.循環控制條件的選擇 (1)循環次數已知:循環次數作為循502023/9/12匯編語言程序設計51計數循環是基本的循環組織方式,用循環計數器的值來控制循環,有時候也可以結合其它條件共同控制。二、計數循環:LOOPLOOPZ/LOOPELOOPNZ/LOOPNE6.4循環程序設計2023/8/7匯編語言程序設計51計數循環是基本的循環組織51 :START: MOV BX,1 ;項

MOV AX,0 ;部分和

MOV CX,100 ;循環次數AGAIN: ADD AX,BX ;循環工作部分

INC BX ;修改部分

LOOP AGAIN ;循環控制

MOV S,AX ;存結果

:[例1]計算S=1+2+3+……+100倒計數法2023/9/12匯編語言程序設計526.4循環程序設計 :[例1]計算S=1+2+3+……+100倒計數法2052 :MOV CX,2801 ;初始化DELAY:LOOP DELAY ;循環體、循環控制

:

[例2]延時程序(10ms)2023/9/12匯編語言程序設計536.4循環程序設計 :[例2]延時程序(10ms)2023/8/7匯編532023/9/12匯編語言程序設計54CRLF MACRO MOV AH,2 MOV DL,0DH INT 21H MOV DL,0AH INT 21H ENDM[例3]從鍵盤上輸入一個字符串(不超過80個字符),將它逆序后輸出。6.4循環程序設計2023/8/7匯編語言程序設計54CRLF MACRO[例542023/9/12匯編語言程序設計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循環程序設計2023/8/7匯編語言程序設計55DATA SEGMEN552023/9/12匯編語言程序設計56 CRLF LEA BX,BUFFER ;緩沖區首地址送BX MOV CL,BUFFER+1 MOV CH,0 ;輸入字符個數送CX(循環次數) ADD BX,CX INC BX ;計算字符串末地址送BX(指針)DISP: MOVDL,[BX] MOV AH,02H INT 21H ;逆序輸出一個字符

DEC BX ;修改指針

LOOP DISP ;計數循環

CRLF ;輸出換行、回車,結束本行

MOV AX,4C00H INT 21HCODE ENDS END START6.4循環程序設計2023/8/7匯編語言程序設計56 CRLF6.4循56

[例4]P161例5.1

把BX寄存器中的二進制數以十六進制的形式在屏幕上顯示出來。Hb0501.asm上述例子都是倒計數法,正計數法一般不用。2023/9/12匯編語言程序設計576.4循環程序設計 [例4]P161例5.1上述例子都是倒計數法,正計數572023/9/12匯編語言程序設計58在循環次數未知的情況下,一般采用條件控制法編寫循環程序。三、條件循環:6.4循環程序設計[例5]計算S=1+2×3+3×4+4×5+……+N(N+1)+……,直到N(N+1)項大于200為止。2023/8/7匯編語言程序設計58在循環次58

:START: MOV DX,1 ;和

MOV BL,2 ;NNEXT: MOV AL,BL ; INC BL ;N+1 MUL BL ;N(N+1)項

ADD DX,AX ;部分和

CMP AX,200 ;循環控制

JNA NEXT ; MOV S,DX :

2023/9/12匯編語言程序設計596.4循環程序設計 :2023/8/7匯編語言程序設計596.4循592023/9/12匯編語言程序設計60DATA SEGMENTSTRING DB‘Astringfortesting.’,0LENTH DW?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX[例7]字符串STRING以代碼0結束,求這個字符串的長度(字符個數)。6.4循環程序設計2023/8/7匯編語言程序設計60DATA SEGMENT602023/9/12匯編語言程序設計61

LEA SI,STRING ;裝載字符串指針

MOV CX,0 ;設置計數器初值TST: CMP BYTEPTR[SI],0 ;比較

JE DONE ;串結束,轉向DONE保存結果

INC SI ;修改指針

INC CX ;計數

JMP TST ;轉向TST,繼續循環DONE:MOVLENTH,CX ;保存結果

MOV AX,4C00H INT 21HCODE ENDS END START6.4循環程序設計2023/8/7匯編語言程序設計61 LEA SI,ST612023/9/12匯編語言程序設計62

……

LEA SI,STRING-1 ;裝載字符串指針

MOV CX,-1 ;裝載計數器初值TST: INC SI ;修改指針

INC CX ;計數

CMP BYTEPTR[SI],0 ;比較

JNE TST ;未結束,轉TST繼續循環

MOV LENTH,CX;字符串結束,保存結果

……比較一下,這種風格也很不錯:6.4循環程序設計2023/8/7匯編語言程序設計62 ……比較一下,這種風格622023/9/12匯編語言程序設計63DATA SEGMENTARRAY DW1,2,3,4,5,6,-1AVRG DW? DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX[例8]一維無符號字數組ARRAY以-1作為數組結束標志,求這個數組各元素的平均值。6.4循環程序設計2023/8/7匯編語言程序設計63DATA SEGMENT632023/9/12匯編語言程序設計64

LEA BX,ARRAY ;裝載數組指針

XOR CX,CX ;設置計數器初值

XOR DX,DX XOR AX,AX ;清累加器ONE: CMP WORDPTR[BX],-1;判數組是否結束

JE DONE;數組結束,轉DONE,結束處理

ADD AX,[BX] ;累加

ADC DX,0 ;保留進位

ADD BX,2 ;修改指針

INC CX ;數組元素個數計數

JMP ONE 6.4循環程序設計2023/8/7匯編語言程序設計64 LEA BX,ARR642023/9/12匯編語言程序設計65DONE: JCXZ NULL ;數組元素個數為0, ;不能求平均值

DIV CX ;計算數組平均值

MOV AVRG,AX ;保存結果

JMP EXITNULL: MOV AVRG,-1 ;數組為“空”,記 ;平均值為-1EXIT: MOV AX,4C00H INT 21HCODE ENDS END START6.4循環程序設計2023/8/7匯編語言程序設計65DONE: JCXZ N652023/9/12匯編語言程序設計66DATA SEGMENTPOSITION DW ?STRING DB ‘Thisisastringforexample.’,0DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODESTART: MOV AX,DATA MOV DS,AX[例9]查找字母’a’在字符串STRING中第一次出現的位置,如果未出現,置位置值為-1。6.4循環程序設計2023/8/7匯編語言程序設計66DATA SEGMENT662023/9/12匯編語言程序設計67

MOV SI,-1 ;SI用作字符串字符指針

MOV CX,30 ;字符串長度30L0: INC SI ;修改指針

CMP STRING[SI],‘a’ ;一個字符與’a’進行比較

LOOPNE L0 ;字符串未結束,未找到,繼續

JNE NOTFOUND ;未找到,轉“NOTFOUND” MOV POSITION,SI ;保存位置值

JMP EXITNOTFOUND: MOV POSITION,-1;未找到,置位置值為-1EXIT: MOV AX,4C00H INT 21HCODE ENDS END START6.4循環程序設計2023/8/7匯編語言程序設計67 MOV SI,-1 672023/9/12匯編語言程序設計68(1)字符串內找到字符’a’:循環結束時ZF=1,SI內是字符的出現位置(從0開始);(2)字符串內未找到字符’a’:循環結束時ZF=0,SI內是字符串的長度-1(30-1=29)。6.4循環程序設計程序使用LOOPNE指令來控制循環,既有計數控制,又有條件控制。循環結束有兩種可能性:所以,對于LOOPZ/LOOPE,LOOPNZ/LOOPNE控制的循環,一般應在循環結束后用條件轉移指令分這兩種情況,分別處理。2023/8/7匯編語言程序設計68(1)字符串內找到字符’682023/9/12匯編語言程序設計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]從鍵盤上輸入一個有符號整數(假設在-32768~+32767之間),將它轉換成二進制補碼,存入NUM單元。6.4循環程序設計2023/8/7匯編語言程序設計69DATA SEGMEN692023/9/12匯編語言程序設計70

MOV NUM,0 ;累加器清零

MOV SIGN,0 ;符號預設為0(表示“+”)BEGIN:MOVAH,1

INT 21H ;從鍵盤輸入一個字符

CMP AL,0DH

JE EXIT ;是回車,轉EXIT,結束

CMP AL,“+”

JE INPUT ;是“+”,轉INPUT輸入下一個字符

CMP AL,“-”

JNE TWO ;非符號字符,轉TWO處理該字符

MOV SIGN,1 ;是“-”,把符號標識為1(表示“-”)6.4循環程序設計2023/8/7匯編語言程序設計70 MOV NUM,0 702023/9/12匯編語言程序設計71

INPUT:MOVAH,1 INT 21H ;從鍵盤再輸入一個字符

CMP AL,0DH JE DONE ;是回車,轉DONE,結束處理TWO: CMP AL,“0” JB ERRINPUT ;輸入非數字,顯示出錯信息

CMP AL,“9” JA ERRINPUT ;輸入非數字,顯示出錯信息

MOV BX,AX ;輸入字符轉移到BX寄存器

AND BX,000FH ;轉換成二進制數

MOV AX,NUM MUL C10 ADD AX,BX ;新輸入數字拼接到已輸入數字中

MOV NUM,AX JMP INPUT ;轉INPUT,輸入下一個字符6.4循環程序設計2023/8/7匯編語言程序設計71 INPUT:MOVA712023/9/12匯編語言程序設計72ERRINPUT: LEA DX,ERRMSG MOV AH,9 INT 21H ;顯示出錯信息

JMP INPUT ;轉INPUT,重新輸入DONE: CMP SIGN,0 ;判符號位

JE EXIT NEG NUM ;符號為“-”,對已輸入數求補EXIT:MOV AX,4C00H INT 21HCODEENDS END START6.4循環程序設計2023/8/7匯編語言程序設計72ERRINPUT:6.472

: MOV CX,0 ;初始,CX為計數器LOP: AND AX,AX ;先判斷,TESTAX,0FFFFH也可

JZ STOP ;AX為0,結束循環

SAL AX,1 JNC NOD INC CX ;計數,INCCL NOD: JMP LOP STOP:HLT

[例11]AX寄存器中的一個16位二進制數,編程統計其中1的個數,結果存入CL中。先判斷后循環的例子2023/9/12匯編語言程序設計736.4循環程序設計優點:減少循環次數 :[例11]AX寄存器中的一個16位二進制數,編程統73

[例12

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論