




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
基本程序設計第1頁,共58頁,2023年,2月20日,星期一基本程序設計是使用單一結構的程序設計,它是程序設計的基礎。程序有三種基本結構,即順序結構、分支結構和循環(huán)結構。任何復雜的程序都是由基本結構組成的。因此,一定要掌握基本程序設計的方法。對于匯編語言程序設計而言,更要掌握好基本程序的設計,這是編寫復雜程序的基礎。
本章將分別介紹各種基本程序設計的方法及子程序的設計。4.1順序程序設計4.2分支程序設計4.3循環(huán)程序設計實訓一分支程序設計實訓二循環(huán)程序設計第4章基本程序設計第2頁,共58頁,2023年,2月20日,星期一順序程序是最簡單程序設計,這種程序不使用分支、循環(huán)結構,程序按順序執(zhí)行,只能完成相對簡單的操作。限于這種特點,在進行順序程序設計時應合理安排指令的先后順序,以完成相應的功能。
在較為復雜的程序中,順序程序是逐段出現(xiàn),它主要完成一些簡單操作或過程的準備、任務的過渡、結果的存儲及程序結束等。它是程序的基本組成部分。以下以結合幾個實例說明順序程序的基本方法,它們是以后各種復雜程序設計的基礎。4.1順序程序設計返回本章首頁進入下一節(jié)第4章基本程序設計第3頁,共58頁,2023年,2月20日,星期一4.1.1存儲單元內(nèi)容移位存儲單元移位是指其中的內(nèi)容左移或右移若干位。現(xiàn)舉例說明。
【例4.1】將AX寄存器中的內(nèi)容左移2位,字存儲單元DAT中的內(nèi)容右移3位(移位后的空位補0).
分析:內(nèi)容移位一般由移位指令實現(xiàn),但要求移后空位為0,故應使用邏輯移位指令。當移位次數(shù)大于1時,可將移位次數(shù)放至CL中進行移位。操作如下:
MOV CL,2
SHL AX,CL
INC CL
SHR DAT,CL第4章基本程序設計第4頁,共58頁,2023年,2月20日,星期一4.1.2乘法運算匯編語言本身也是比較靈活的,乘法運算可用乘法指令直接完成,有時候也可以由移位指令或加法指令完成。
【例4.2】將寄存器AL的內(nèi)容乘10,結果存至DX寄存器。
分析:對一個數(shù)進行乘10運算,可以直接使用乘法指令實現(xiàn),也可由移位指令或加法指令實現(xiàn),方法分別如下:
1.用乘法指令實現(xiàn)
MOV BL, 10
IMUL BL ;AX←AL×BL=AL×10
MOV DX,AX第4章基本程序設計第5頁,共58頁,2023年,2月20日,星期一2.用移位指令實現(xiàn)移位操作時,在最高位不變化時,左移一位,相當原數(shù)乘2,因此也可以用移位操作實現(xiàn)乘10運算。
XOR AH,AH ;AH清零
SAL AX,1 ;AX←AX×2
MOV BX,AX ;存至BX寄存器
MOV CL,2
SAL AX,CL ;AX←AX×8
ADD AX,BX ;AX←AX×10
第4章基本程序設計第6頁,共58頁,2023年,2月20日,星期一3.用加法指令實現(xiàn)一個數(shù)與自己相加可以實現(xiàn)乘2運算,多次累加就可以實現(xiàn)乘10運算。
MOV AH,0
ADD AX,AX ;AX←AX×2
MOV BX,AX ;存至BX寄存器
ADD AX,AX ;AX←AX×4
ADD AX,AX ;AX←AX×8
ADD AX,BX ;AX←AX×10
第4章基本程序設計第7頁,共58頁,2023年,2月20日,星期一4.1.3屏蔽與置位對字節(jié)或字變量中的某些位進行置0操作,稱為屏蔽操作。使某些位強迫置1則是置位操作。它們是數(shù)據(jù)處理常用的方法?!纠?.3】將字節(jié)類型變量DAT的高4位置0,其余各位保持不變。解:屏蔽操作多用邏輯運算指令實現(xiàn).本例使用邏輯與指令完成。任何位與0相與,結果都為0,由此達到該位被屏蔽的目的。非屏蔽位應與1相與,以保證該位不變.
MOV AL,DAT
AND AL,0FH ;屏蔽高四位
MOV DAT,AX第4章基本程序設計第8頁,共58頁,2023年,2月20日,星期一通過邏輯運算指令也很容易實現(xiàn)字或字節(jié)的置位操作。一般使用邏輯或指令實現(xiàn)置位操作。
例如把上例中DAT變量的高四位置1,用下面指令即實現(xiàn)即可:
OR DAT, 0F0H
第4章基本程序設計第9頁,共58頁,2023年,2月20日,星期一4.1.4拆字與合字
【例4.4】將存儲單元DAT中兩位壓縮的BCD數(shù)拆成二個非壓縮BCD數(shù)(高位BCD數(shù)放在DAT+1單元,低位BCD數(shù)放在DAT+2單元)。
分析:將DAT單元中的BCD數(shù)拆開可用移位的方法。對高位BCD數(shù)可邏輯右移4位而成為非壓縮數(shù);低位BCD數(shù)可屏蔽其高四位而成為非壓縮BCD數(shù)。指令如下:
MOV AL,DAT
MOV CL,4
SHR AL,CL ;得到高位BCD數(shù)
MOV DAT+1,AL
MOV AL,DAT
AND AL,0FH ;得到低位BCD數(shù)
MOV DAT+2,AL第4章基本程序設計第10頁,共58頁,2023年,2月20日,星期一【例4.5】將存儲單元DAT1和DAT2中分別存有兩個非壓縮的BCD數(shù),將其合成一個壓縮BCD數(shù)(DAT1單元為高位BCD數(shù),DAT2單元為低位BCD數(shù)),結果存入DAT0單元。
分析:將兩個單元中的BCD數(shù)合并可用加法指令與移位指令相結合的方法。其中高位BCD數(shù)可由DAT1單元數(shù)據(jù)邏輯左移4位得到;再與DAT2單元相加即可完成合并。指令如下:
MOV AL,DAT0
MOV CL,4
SHL AL,CL
ADD AL,DAT1
MOV DAT0,AL第4章基本程序設計第11頁,共58頁,2023年,2月20日,星期一4.1.5數(shù)據(jù)與ASCII碼的相互轉(zhuǎn)換編程中經(jīng)常要用到數(shù)據(jù)顯示的問題,通常的做法是將要顯示的數(shù)據(jù)轉(zhuǎn)換為ASCII碼后,再調(diào)用相關的中斷來顯示。在二、十、十六等常用進制的數(shù)據(jù)中,最為復雜的是十六進制數(shù)據(jù)的顯示,查閱ASCII表可知,數(shù)據(jù)0~9的ASC碼為該數(shù)據(jù)加上30H,數(shù)據(jù)A~F的ASCII碼為該數(shù)據(jù)加上37H。對于從鍵盤上輸入的數(shù)據(jù),由于是以ASCII碼形式輸入的,通常轉(zhuǎn)換為數(shù)據(jù)本身再進行處理,其轉(zhuǎn)換的方法較多,但通常的方法是上述過程的逆過程,即對30H~39H(0~9的ASC碼)減去30H,數(shù)據(jù)41H~46H(A~F的ASCII碼)減去37H。下面舉例說明。第4章基本程序設計第12頁,共58頁,2023年,2月20日,星期一【例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)用的2號功能完成字符顯示。程序如下:
DATA SEGMENT
DAT DB 6AH
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
第4章基本程序設計第13頁,共58頁,2023年,2月20日,星期一START: MOV AX,DATA
MOV DS,AX
MOV DL,DAT
MOV AL,DL ;暫存至AL寄存器
MOV CL,4
SHR DL,CL
ADD DL,30H ;高位十六進制數(shù)據(jù)‘6’轉(zhuǎn)換為ASCII碼
MOV AH,02H
INT 21H ;顯示
MOV DL,AL
AND DL,0FH
ADD DL,37H ;低位十六進制數(shù)據(jù)‘A’轉(zhuǎn)換為ASCII碼
INT 21H ;顯示
MOV AH,4CH
INT 21H
CODE ENDS
END START 第4章基本程序設計第14頁,共58頁,2023年,2月20日,星期一4.1.6簡單算術運算【例4.7】在字存儲單元A、B和C中分別存放著一個有符號數(shù),求(C-89H+A×B)/A,商和余數(shù)分別存入字存儲單元D和E。
分析:直接用有符號數(shù)運算指令完成即可。程序如下:
DATA SEGMENT
A DW -1234H
B DW 5678H
C DW 3456H
D DW ?
E DW ?
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA第4章基本程序設計第15頁,共58頁,2023年,2月20日,星期一START: MOV AX,DATA
MOV DS,AX
MOV AX,C
SUB AX,89H
CWD ;擴展為雙字
MOV CX,DX
MOV BX,AX ;結果暫存至CX,BX
MOV AX,A
IMUL B ;求A×B
ADD AX,BX
ADC DX,CX ;與前面結果相加
IDIV A ;AX是商,DX是余數(shù)
MOV D,AX
MOV E,DX ;保存結果
MOV AH,4CH
INT 21H
CODE ENDS
END START第4章基本程序設計第16頁,共58頁,2023年,2月20日,星期一4.1.7查表【例4.8】在以TABLE為首地址的內(nèi)存中順序存有0~10的平方數(shù)表。今從鍵盤上輸入一個數(shù)(<11),求其平方值,結果保存至RSLT單元。
分析:因為平方表已順序排放在內(nèi)存中。又已知首地址TABLE,只要把輸入數(shù)據(jù)作為位移量與首址相加,就指向了表中平方值的地址,取其內(nèi)容即為該數(shù)的平方值。程序如下:
DATA SEGMENT
TABLE DB0,1,4,9,16,25,36,49,64,81,100
RSLT DB ?
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA第4章基本程序設計第17頁,共58頁,2023年,2月20日,星期一START: MOV AX,DATA
MOV DS,AX
MOV AH,00H
INT 16H ;輸入數(shù)據(jù)
AND AL,0FH ;將ASCII碼轉(zhuǎn)換為數(shù)據(jù)
XOR BX,BX
MOV BL,AL ;存至BX
LEA SI,TABLE
MOV AL,[SI+BX] ;查表
MOV RSLT,AL ;保存結果
MOV AH,4CH
INT 21H
CODE ENDS
END START返回本章首頁第4章基本程序設計第18頁,共58頁,2023年,2月20日,星期一4.2分支程序設計分支程序使計算機具備判斷能力,計算機可以根據(jù)給定的條件進行判斷,并作出相應的處理,它可以把程序分成不同的處理段,實現(xiàn)情況不同的處理,從而使計算機具有一定的‘思維’能力。這是順序程序所能不能實現(xiàn)的。所以,分支程序是程序的重要組成結構之一。匯編語言的分支主要由轉(zhuǎn)移指令實現(xiàn),而過多的轉(zhuǎn)移指令會使程序的結構變得復雜,因而進行分支程序設計時進行合理安排是至關重要的。返回本章首頁返回上一節(jié)進入下一節(jié)第4章基本程序設計第19頁,共58頁,2023年,2月20日,星期一4.2.1單重分支單重分支是最簡單的分支結構,如果條件成立則完成某項操作,否則執(zhí)行其它操作或后續(xù)指令。其結構可以用圖4-1來表示。(a)條件不成立執(zhí)行后續(xù)指令(b)條件不同執(zhí)行不同操作
條件?
處理
Yes
No
條件?
處理2
Yes
No
處理1
第4章基本程序設計第20頁,共58頁,2023年,2月20日,星期一【例4.9】在存儲單元DAT中存放著一位十六進制數(shù),將其顯示到屏幕上。
分析:本題只需對該位十六進制數(shù)進行判斷,方法同例4.6相同。程序如下:
DATA SEGMENT
DAT DB 0CH
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA第4章基本程序設計第21頁,共58頁,2023年,2月20日,星期一START: MOV AX,DATA
MOV DS,AX
MOV AL,DAT
CMP AL,9
JG OTHR
ADD AL,30H ;小于10則轉(zhuǎn)換為數(shù)字(0~9)
JMP DISP
OTHR: ADD AL,37H ;大于10則轉(zhuǎn)換為大寫字母(A~F)
DISP: MOV DL,AL
MOV AH,2
INT 21H
DONE: MOV AH,4CH
INT 21H
CODE ENDS
END START第4章基本程序設計第22頁,共58頁,2023年,2月20日,星期一【例4.10】在字節(jié)存儲單元X、Y中各有一個無符號數(shù)。根據(jù)這兩個無符號數(shù)的大小,在屏幕顯示X≥Y或X<Y。
分析:兩個無符號數(shù)比較大小常用的方法是使用比較指令CMP,根據(jù)其對標志位的影響用無符號條件轉(zhuǎn)移指令實現(xiàn)轉(zhuǎn)移。程序如下:
DATA SEGMENT
DAT0 DB 98H
DAT1 DB 0A0H
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
第4章基本程序設計第23頁,共58頁,2023年,2月20日,星期一START: MOV AX,DATA
MOV DS,AX
MOV AL,X
CMP Y,AL ;比較
JA YGX ;X大則轉(zhuǎn)YGEX
MOV AL,‘≥’
JMP DISP
YGX: MOV AL,‘<’
DISP: MOV DL,‘X’ ;顯示比較結果
MOV AH,2
INT 21H
MOV DL,AL
INT 21H
MOV DL,‘Y’
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START第4章基本程序設計第24頁,共58頁,2023年,2月20日,星期一本例中,根據(jù)比較結果影響CF標志位。利用JA指令實現(xiàn)分支轉(zhuǎn)移,即Y≥X時轉(zhuǎn)YGDX。在分支處理中分別為顯示結果作準備(分別準備顯示X≥Y或X<Y)。DISP標號開始的程序段是用來顯示結果的。第4章基本程序設計第25頁,共58頁,2023年,2月20日,星期一4.2.2多重分支在程序設計中,更多的情況是對幾個條件同時進行判斷從而確定程序的轉(zhuǎn)移方向,此時只能采用數(shù)個單重分支的組合來完成,這就是多重分支結構。
【例4.11】編寫一程序,求:
X+10H (X<0)
Y= 32X (0≤X≤10)
X-90H (X>10)
其中X、Y都是有符號字變量
分析:本題有三個條件進行判斷,故屬于多重分支程序設計。在進行較為復雜的分支程序設計時,應先處理簡單分支,再處理復雜分支,這樣更方便編程。程序如下:
第4章基本程序設計第26頁,共58頁,2023年,2月20日,星期一STACK SEGMENTPARASTACK‘STACK’
DB 100DUP(0)
STACK ENDS
DATA SEGMENT
X DW?
Y DW?
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,X
CMP AX,0
JGE CASE23
ADD AX,10H ;第一種情況的計算結果
JMP RESULT第4章基本程序設計第27頁,共58頁,2023年,2月20日,星期一CASE23: CMP AX,10D
JG CASE3
MOV BX,30D
IMUL BX ;第二種情況的計算結果
JMP RESULT
CASE3: SUB AX,190H ;第三種情況的計算結果
RESULT: MOV Y,AX ;結果保存到變量Y中
MOV AH,4CH
INT 21H
CODE ENDS
END START第4章基本程序設計第28頁,共58頁,2023年,2月20日,星期一4.2.3用地址表實現(xiàn)分支當程序分支比較復雜時,可將各分支的入口地址存于地址表中,以實現(xiàn)分支程序設計。
【例4.12】從鍵盤上輸入一個數(shù)(<5),求其平方值,結果保存至RSLT單元。
分析:本題可用例4.8的方法,也可以用地址表實現(xiàn)。程序如下:
DATA SEGMENT
ADDR DW C0,C1,C2,C3,C4
RSLT DW ?
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA第4章基本程序設計第29頁,共58頁,2023年,2月20日,星期一START: MOV AX,DATA
MOV DS,AX
AGAIN: MOV AH,00H
INT 16H ;輸入數(shù)據(jù)
CMP AL,’0’
JB AGAIN
CMP AL,’4’
JA AGAIN ;不在0~4之間,重新輸入
AND AL,0FH ;ASCII碼轉(zhuǎn)換為數(shù)據(jù)
SHL AL,1 ;地址表為字類型,故乘2
XOR AH,AH
LEA BX,ADDR
ADD BX,AX
JMP WORDPTR[BX] ;用地址表實現(xiàn)分支第4章基本程序設計第30頁,共58頁,2023年,2月20日,星期一C0: MOV AL,0
JMP SAVE ;0的平方是0
C1: MOV AL,1
JMP SAVE ;1的平方是1
C2: MOV AL,2
MOV BL,AL
MUL BL
JMP SAVE ;2的平方是2*2
C3: MOV AL,3
MOV BL,AL
MUL BL
JMP SAVE ;3的平方是3*3
C4: MOV AL,4
MOV BL,AL
MUL BL ;4的平方是4*4
SAVE: MOV RSLT,AX ;保存
MOV AH,4CH
INT 21H
CODE ENDS
END START返回本章首頁第4章基本程序設計第31頁,共58頁,2023年,2月20日,星期一4.3循環(huán)程序設計在進行程序設計時,會出現(xiàn)某段程序反復多次執(zhí)行的情況,如果這段程序是連在一起反復執(zhí)行的,則可用循環(huán)程序結構來實現(xiàn)。其方法是用重復次數(shù)或某個條件控制循環(huán)程序的執(zhí)行。采用循環(huán)程序結構不僅使程序變得簡潔清晰,而且減少程序?qū)?nèi)存的占用,因此,循環(huán)程序是重要的程序結構之一。返回本章首頁返回上一節(jié)進入下一節(jié)第4章基本程序設計第32頁,共58頁,2023年,2月20日,星期一4.3.1循環(huán)程序的結構循環(huán)程序是多種多樣的,但一般認為循環(huán)程序由四部分構成:
1.初始化部分
本部分主要為循環(huán)程序作準備工作,如置循環(huán)次數(shù)、地址指針或關鍵字,寄存器置初值及標志位設置等。
2.循環(huán)工作部分
本部分是實際進行工作的部分,是循環(huán)結構的主體。
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)體。循環(huán)程序根據(jù)循環(huán)控制條件的不同,通常又分兩種結構,如圖4-2所示。第4章基本程序設計第33頁,共58頁,2023年,2月20日,星期一(a)先工作后判斷循環(huán)條件該結構為后判斷型循環(huán),循環(huán)次數(shù)已知,多用LOOP指令等構造循環(huán)。
初始化
循環(huán)條件滿足?
處
理
Yes
No
第4章基本程序設計第34頁,共58頁,2023年,2月20日,星期一(b)先判斷循環(huán)條件后工作該結構為先判斷型循環(huán),循環(huán)次數(shù)未知,多用條件轉(zhuǎn)移指令構造循環(huán)。
初始化
No
循環(huán)條件滿足?
處理
Yes
第4章基本程序設計第35頁,共58頁,2023年,2月20日,星期一4.3.2單重循環(huán)單重循環(huán)程序結構,程序中只有一個循環(huán)體,循環(huán)體內(nèi)不再含有其它循環(huán)體,下面舉例說明。
【例4.13】求1~400的所有偶數(shù)的和,結果保存到RSLT存儲單元。
分析:1~400間共有200個偶數(shù),故需要加200次,也就是說循環(huán)次數(shù)為200。由于程序中CX寄存器同時充當了循環(huán)計數(shù)器和200個偶數(shù)值,使每一次循環(huán)CX的值減2,故CX初值為400。程序如下:
DATA SEGMENT
RSLT DW ?
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA 第4章基本程序設計第36頁,共58頁,2023年,2月20日,星期一START: MOV AX,DATA
MOV DS,AX
MOV CX,400
XOR AX,AX
NEXT: ADD AX,CX ;計算偶數(shù)和
DEC CX
DEC CX
JNZ NEXT ;200個數(shù)未完則繼續(xù)循環(huán)
MOV RSLT,AX ;保存結果
MOV AH,4CH
INT 21H
CODE ENDS
END START第4章基本程序設計第37頁,共58頁,2023年,2月20日,星期一【例4.14】在以DAT為首地址的字緩沖區(qū)中存有一批數(shù)據(jù),數(shù)據(jù)個數(shù)為10,編程找出其最大的值,結果存入RSLT單元。
分析:求最大值通常采用逐個比較法,即把第一個數(shù)做比較標準,與其后的數(shù)比較。如標準數(shù)大,則再與下一個數(shù)比較;如果標準數(shù)小,則取大數(shù)做標準數(shù)。由于循環(huán)次數(shù)已知,故可采用圖4-2(a)的結構。程序如下:
DATA SEGMENT
DAT DW 1234H,0ABH,0ABCDH,9999H,0
DW 1,5678H,0BBCCH,9876H,5678H
RSLT DW ?
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA第4章基本程序設計第38頁,共58頁,2023年,2月20日,星期一START: MOV AX,DATA
MOV DS,AX
LEA SI,DAT ;SI做地址指針
MOV AX,[SI]
MOV CX,9 ;10個數(shù)共比較9次
INC SI
INC SI
NEXT: CMP AX,[SI]
JGE GOON ;AX大于下一個數(shù)則轉(zhuǎn)GOON
MOV AX,[SI] ;否則將大值付給AX
GOON: INC SI
INC SI ;修改地址指針
LOOP NEXT ;循環(huán)
MOV RSLT,AX ;保存結果
MOV AH,4CH
INT 21H
CODE ENDS
END START第4章基本程序設計第39頁,共58頁,2023年,2月20日,星期一【例4.15】在以DAT為首地址的字緩沖區(qū)中存有一批數(shù)據(jù),以‘*’作為結束,編程找出其最大的值,結果存入RSLT單元。
分析:本例與例4.14的不同在于數(shù)據(jù)個數(shù)未知,但有一個條件知道,就是該批數(shù)據(jù)以‘*’結束,故屬于條件控制循環(huán),循環(huán)次數(shù)未知的結構,即圖4-2(b)的結構。程序如下:
DATA SEGMENT
DAT DW 1234H,0ABH,0ABCDH,9999H,0,1111H,1010H
DW 1,5678H,0BBCCH,9876H,5678H,0FFH,‘*’
RSLT DW ?
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA第4章基本程序設計第40頁,共58頁,2023年,2月20日,星期一START: MOV AX,DATA
MOV DS,AX
LEA SI,DAT ;SI做地址指針
MOV AX,[SI]
NEXT: CMP WORDPTR[SI],‘*’
JZ SAVE
CMP AX,[SI]
JGE GOON ;AX大于下一個數(shù)則轉(zhuǎn)GOON
MOV AX,[SI] ;否則將大值付給AX
GOON: ADD SI,2
JMP NEXT ;循環(huán)
SAVE: MOV RSLT,AX ;保存結果
MOV AH,4CH
INT 21H
CODE ENDS
END START第4章基本程序設計第41頁,共58頁,2023年,2月20日,星期一4.3.3多重循環(huán)程序設計中,有時單重循環(huán)不能完成一項工作,需用多重循環(huán)完成。多重循環(huán)就是循環(huán)體內(nèi)含有其它循環(huán)體的結構,也稱為循環(huán)嵌套。多重循環(huán)以雙重循環(huán)最為常用,內(nèi)外層的循環(huán)由程序員用跳轉(zhuǎn)指令控制,要注意不同循環(huán)體之間的界限。
第4章基本程序設計第42頁,共58頁,2023年,2月20日,星期一0123456789ABCDEF
123456789ABCDEF0
23456789ABCDEF01
3456789ABCDEF012
456789ABCDEF0123
56789ABCDEF01234
6789ABCDEF012345
789ABCDEF0123456
89ABCDEF01234567
9ABCDEF012345678
ABCDEF0123456789
BCDEF0123456789A
CDEF0123456789AB
DEF0123456789ABC
EF0123456789ABCD
F0123456789ABCDE
【例4.16】在以STRG為首地址的緩沖區(qū)中存放著十六進制各位“0”~“F”的ASCII碼,編程以下面的格式將這些數(shù)據(jù)顯示到屏幕上。第4章基本程序設計第43頁,共58頁,2023年,2月20日,星期一分析:本題用雙重循環(huán)程序?qū)崿F(xiàn)是非常恰當?shù)?,?nèi)循環(huán)實現(xiàn)每行18個數(shù)據(jù)的顯示(含回車與換行的ASCII碼),外循環(huán)則控制顯示的行數(shù)16。程序如下:
DATASEGMENT
STRG DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 41H,42H,43H,44H,45H,46H
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 41H,42H,43H,44H,45H,46H
DATAENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DI,16 ;顯示行數(shù)為16
XOR BX,BX ;BX清零第4章基本程序設計第44頁,共58頁,2023年,2月20日,星期一NEXT: LEA SI,STRG
ADD SI,BX ;BX寄存器用于調(diào)整數(shù)據(jù)位置
MOV CX,16 ;每行顯示數(shù)據(jù)數(shù)
MOV AH,2
DISP: MOV DL,[SI]
INT 21H
MOV DL,’’ ;數(shù)據(jù)間以空格相間隔
INT 21H
INC SI
LOOP DISP ;內(nèi)循環(huán)
MOV DL,0AH ;換行
INT 21H
MOV DL,0DH ;回車
INT 21H
INC BX
DEC DI
JNZ NEXT ;外循環(huán)
MOV AH,4CH
INT 21H
CODE ENDS
END START第4章基本程序設計返回本章首頁第45頁,共58頁,2023年,2月20日,星期一實訓一分支程序設計實訓內(nèi)容:在存儲單元DAT中存放著一個字節(jié)數(shù)據(jù),判斷其是否為十六進制數(shù)據(jù),如是,則將其以十六進制形式顯示到屏幕上,否則顯示“NotHexadicimal”信息。分析:本題只需對該數(shù)據(jù)進行判斷,如果大于等于0且小于等于15,則是十六進制數(shù)據(jù),轉(zhuǎn)換為相應的ASCII碼即可顯示。方法同例4.9相似。如果不在上述范圍內(nèi),則顯示非十六進制信息。顯然這是一個分支程序。上機前,應在硬盤上建立MASM子目錄,并將EDIT編輯程序、MASM匯編程序、LINK連接程序和DEBUG調(diào)試程序拷貝至該子目錄下(注:也可拷貝具有相似功能的其它版本的匯編調(diào)試程序)。整個上機過程如下:第4章基本程序設計第46頁,共58頁,2023年,2月20日,星期一1.畫出程序流程圖如圖4-3所示AL←AL+37H顯示非十六制數(shù)據(jù)信息Y開始數(shù)據(jù)放入ALAL←AL+30H≥0?>9?≦15?YNYNN顯示結束圖4-3實訓一程序流程圖第4章基本程序設計第47頁,共58頁,2023年,2月20日,星期一2.用編輯程序編輯源程序設源程序名為SX1A.ASM.注意:源程序的擴展名必須是.ASM。編輯如下: C:\MASM\EDITSX1A.ASM在編輯環(huán)境下編輯源程序。參考源程序如下:DATA SEGMENT DAT DB 0CH MSG DB ‘NotHexadicimal.$’ DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA第4章基本程序設計第48頁,共58頁,2023年,2月20日,星期一START: MOV AX,DATA MOV DS,AX MOV AL,DAT CMP AL,0 JL DISP2 ;小于0則轉(zhuǎn)到DISP2 CMP AL,9 JG OTHER ADD AL,30H ;小于10則轉(zhuǎn)換為數(shù)字(0~9)的ASCII碼
JMP DISP1OTHER:CMP AL,0FH JG DISP2 ;大于15則轉(zhuǎn)到DISP2 ADD AL,37H ;大于10則轉(zhuǎn)換為大寫字母(A~F)的ASCII碼DISP1: MOV DL,AL MOV AH,2 INT 21H JMP DONEDISP2: LEA DX,MSG ;顯示“NotHexadicimal.”信息
MOV AH,9 INT 21HDONE: MOV AH,4CH INT 21HCODE ENDS END START第4章基本程序設計第49頁,共58頁,2023年,2月20日,星期一3.匯編源程序輸入以下命令行并按回車鍵:C:\MASM\MASMSX1AMicrosoft(R)MacroAssemblerVersion5.00Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.Sourcefilename[.ASM]:Sourcelisting[NUL.LST]:Cross-reference[NUL.CRF]:51698+417454Bytessymbolspacefree0WarningErrors0SevereErrorsMASM匯編程序?qū)υ闯绦蜻M行二次掃描檢查,如無誤,則形成SX1A.OBJ目標文件。如果有錯誤,則提示錯誤出處和錯誤原因。大家也可以通過列表文件檢查錯誤。如果源程序有錯誤,則在EDIT中進行修正,重新匯編,直至正確無誤。第4章基本程序設計第50頁,共58頁,2023年,2月20日,星期一4.連接目標文件形成可執(zhí)行文件輸入以下命令行并按回車鍵:C:\MASM\LINKSX1AMicrosoft(R)OverlayLinkerVersion3.60Copyright(C)MicrosoftCorp1985-1987.Allrightsreserved.ObjectModules[.OBJ]:myfileRunFile[MYFILE.EXE]:ListFile[NUL-MAP]:Libraries[.LIB]:Warning:nostacksegment則目標程序被連接為可執(zhí)行的.EXE文件。系統(tǒng)最后一行有一個警告信息,表示程序中沒有堆棧段,這并不影響程序的正常執(zhí)行,因為操作系統(tǒng)會自動為用戶程序分配堆??臻g。第4章基本程序設計第51頁,共58頁,2023年,2月20日,星期一5.用DEBUG調(diào)試程序?qū)蓤?zhí)行文件進行分析調(diào)試雖然形成了SX1A.EXE可執(zhí)行文件,但程序是否按題目要求完成各項功能還不能肯定,程序中可能還隱藏著某些錯誤,此時就應該用DEBUG調(diào)試程序進行跟蹤調(diào)試了。輸入如下命令: C:\MASM\DEBUGSX1A.EXE -出現(xiàn)DEBUG命令提示符后,就可以用DEBUG的各種命令進行跟蹤調(diào)試了。其中使用最多的是步跟蹤命令P及命令D等。如發(fā)現(xiàn)程序有隱含錯誤,則在EDIT中修正錯誤,重新匯編連接形成可執(zhí)行文件,再用DEBUG進行調(diào)試,直至正確無誤。最后,在DOS命令提示符下運行程序,結果如下:C第4章基本程序設計返回本章首頁第52頁,共58頁,2023年,2月20日,星期一實訓二循環(huán)程序設計實訓內(nèi)容:在以DAT為首地址的字數(shù)組中共有10個元素,都是無符號數(shù)。編程按從小到大的順序重新排列,結果存回原地址。分析:要將10個數(shù)按降序排列,必須首先在這10個數(shù)中找到最小數(shù),將其放在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中校級課題申報書
- 發(fā)票供銷合同范本
- 南匯家電運輸合同范本
- 保時捷合同范本
- 網(wǎng)球課題申報書格式要求
- 公司交保險合同范本
- 全國合同范本模板
- 合同范本是幾號字體
- 買賣小型合同范本
- 中介簽獨家合同范本
- 《社會應急力量建設基礎規(guī)范 第2部分:建筑物倒塌搜救》知識培訓
- 2024年河南省鄭州市二七區(qū)四中小升初數(shù)學試卷(含答案)
- 國有企業(yè)管理人員處分條例培訓2024
- 浙江省寧波市2025屆高三上學期一??荚嚁?shù)學試卷 含解析
- 代理記賬業(yè)務內(nèi)部規(guī)范(三篇)
- 腰椎間盤突出癥課件(共100張課件)
- 委托調(diào)解民事糾紛協(xié)議書合同
- 中醫(yī)四季養(yǎng)生之道課件
- 消防安全教育主題班會課件
- 《營養(yǎng)配餐》(教學設計)-2024-2025學年北師大版數(shù)學六年級上冊
- 《無機化學》課件-第6章 分子結構和晶體結構
評論
0/150
提交評論