版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第5章匯編語言程序設(shè)計5.1匯編語言程序格式5.5匯編語言設(shè)計5.4DOS功能調(diào)用5.3匯編語言的編寫5.2常用偽指令教學(xué)重點
本章介紹程序結(jié)構(gòu)、偽指令、DOS功能調(diào)用。重點:匯編語言程序的基本結(jié)構(gòu);偽指令及其使用方法;
DOS功能調(diào)用;基本的匯編語言程序設(shè)計方法。難點:DOS功能調(diào)用的應(yīng)用匯編語言程序的設(shè)計精品資料你怎么稱呼老師?如果老師最后沒有總結(jié)一節(jié)課的重點的難點,你是否會認(rèn)為老師的教學(xué)方法需要改進?你所經(jīng)歷的課堂,是講座式還是討論式?教師的教鞭“不怕太陽曬,也不怕那風(fēng)雨狂,只怕先生罵我笨,沒有學(xué)問無顏見爹娘……”“太陽當(dāng)空照,花兒對我笑,小鳥說早早早……”5.1匯編語言程序格式5.1.1程序結(jié)構(gòu)5.1.2匯編語言語句格式5.1.3匯編語言數(shù)據(jù)表示1、匯編語言的分段結(jié)構(gòu):匯編語言源程序數(shù)據(jù)段(DATA)作用:存放程序運行所需要的數(shù)據(jù)和運行結(jié)果堆棧段(STACK)作用:執(zhí)行數(shù)據(jù)的壓棧和彈棧操作,以及程序中的數(shù)據(jù)保護代碼段(CODE)作用:存放所編寫的程序的代碼5.1.1程序結(jié)構(gòu)用開始語句“SEGMENT”和結(jié)束語句“ENDS”來定義一個段2、語句類型語句類型指令語句作用:產(chǎn)生相應(yīng)的機器代碼,指定CPU做什么操作。偽指令語句作用:不產(chǎn)生相應(yīng)的機器代碼,僅控制匯編過程。宏指令語句作用:由編程者按照一定的規(guī)則來定義的一種較“宏大”的指令,包括多條指令或偽指令。5.1.1程序結(jié)構(gòu)例題1
DATASEGMENT
;定義DATA段
BUF1DB34H;定義第一個數(shù)據(jù)
BUF2DB2AH;定義第二個數(shù)據(jù)
SUMDB?;定義數(shù)據(jù)和單元
DATAENDS
;DATA結(jié)束STACKSEGMENTPARASTACK‘STACK’
;定義STACK段
DW200DUP(0)STACKENDS;STACK段結(jié)束SEGMENT 數(shù)據(jù)段開始ENDS數(shù)據(jù)段結(jié)束數(shù)據(jù)段堆棧段例題1(續(xù))CODESEGMENT;定義CODE段ASSUMECS:CODE,DS:DATA,SS:STACK
;段分配START:MOVAX,DATAMOVDS,AX;填裝數(shù)據(jù)段寄存器DSMOVAL,BUF1;取第一個加數(shù)
ADDAL,BUF2;和第二個加數(shù)相加
MOVSUM,ALMOVAH,4CHINT21H;返回DOS狀態(tài)CODEENDS;CODE段結(jié)束
ENDSTART;整個源程序結(jié)束代碼段;example2.asm(文件名)stack
segment
stack
;定義堆棧段
dw512dup(?) ;堆棧段有512字空間stack ends
;堆棧段結(jié)束data segment
;定義數(shù)據(jù)段string db’Hello,Everybody!’,0dh,0ah,’$’data endscode segment’code’ ;定義代碼段
assumecs:code,ds:data,ss:stack例題2start: movax,data
;建立DS段地址
movds,axmovdx,offsetstring movah,9 int21h movax,4c00h
int21h;利用功能調(diào)用返回DOScode ends
;代碼段結(jié)束
endstart
;匯編結(jié)束,同時指明程序起始點例題2(續(xù))指令語句偽指令語句定義符號、數(shù)據(jù),分配內(nèi)存單元,不產(chǎn)生機器代碼[名字]操作碼操作數(shù)[;注釋]匯編時翻譯成二進制機器代碼[標(biāo)號:]操作碼[操作數(shù),[操作數(shù)]][;注釋]指令語句標(biāo)號后有冒號“:”偽指令語句名字后沒有冒號指令語句、偽指令語句
5.1.2匯編語言語句格式名字由字母開頭。可由下列符號組成:(1)大小寫英文字母(A~Z,a~z)(2)數(shù)字(0~9)(3)特殊符號(?、@、_等)命名規(guī)則:
(1)數(shù)字不能作為名字的第一個符號。
(2)單獨的問號(?)不能作為名字。
(3)最大有效長度為31位。
(4)匯編語言中有特定含義的保留字(如操作碼、寄存器名等),不能作為名字使用。
(5)見名知義。如用BUFFER表示緩沖區(qū)、SUM表示累加和等。5.1.2匯編語言語句格式標(biāo)號的三種屬性段屬性偏移屬性類型屬性定義變量的段起始地址。標(biāo)號偏移地址,從段起始地址到定義標(biāo)號的位置之間字節(jié)數(shù)。指出該標(biāo)號是在本段內(nèi)引用還是在其他段中引用。段內(nèi)引用屬性為NEAR;段間引用屬性為FAR。標(biāo)號在代碼段中定義。5.1.2匯編語言語句格式操作數(shù):用來指定參與操作的數(shù)據(jù)。多于一個,之間用逗號分開??梢允浅?shù)或表達式。操作碼與操作數(shù)例:MOVAX,BX5.1.2匯編語言語句格式操作碼:指明操作的性質(zhì)和功能,指令中的助記符都是操作碼無操作數(shù):一個操作數(shù):兩個操作數(shù):偽指令、宏指令可有多個操作數(shù):5.1.2匯編語言數(shù)據(jù)表示常量數(shù)值常量字符串常量
符號常數(shù)后綴:二進制B、八進制O或Q、十進制D、十六進制H。十進制數(shù)可省掉后綴十六進制數(shù)以A~F開頭時,前面須加數(shù)字0字符串在計算機中以ASCII碼存儲。如‘A’的存儲值是41H,‘AB’的存儲值是41、42H等。用EQU或“=”定義的符號常量。如用COUNTEQU3或COUNT=3定義后,COUNT是一個符號常數(shù),與數(shù)值3等價。變量段屬性偏移屬性類型屬性定義變量的段起始地址變量所在段的段內(nèi)偏移地址變量類型定義變量所占的字節(jié)數(shù)。如:BYTE(DB,1字節(jié))、WORD(DW,2字節(jié))、DWORD(DD,4字節(jié))、QWORD(DQ,8字節(jié))、TBYTE(DT,10字節(jié))。5.1.2匯編語言數(shù)據(jù)表示運算符及表達式算術(shù)運算符邏輯運算符關(guān)系運算符分析運算符
+、—、*、/、MOD與數(shù)學(xué)運算符的意義相同。取模是取余數(shù)。例:82MOD16; 結(jié)果為220HMOD7; 結(jié)果為4
AND、OR、NOT、XOR
運算結(jié)果是一個常數(shù).EQ、NE、LT、GT、LE、GE兩個表達式比較時,表達式表示方法/性質(zhì)要相同關(guān)系成立,結(jié)果為全1;不成立時,為全0例如:指令MOVBX,32EQ45等價于MOVBX,0;綜合運算符
SEG、OFFSET、LENGTH、SIZE、TYPE把存儲單元地址分解為段地址和偏移地址THIS、PTR
規(guī)定存儲單元的性質(zhì)5.1.2匯編語言數(shù)據(jù)表示常用偽指令等值偽指令等號偽指令解除定義偽指令定義變量偽指令定位偽指令5.2常用偽指令
格式〈符號名〉EQU〈表達式〉功能給符號名定義一個值、別的符號名、表達式或助記符。注
不能給一個符號重復(fù)定義與EQU類似,但在同一個程序中,=可以對一個符號重新定義。格式
PURGE〈符號1,2…N〉功能
解除指定符號的定義,解除后,可用EQU重新定義。例
Y1EQU7;Y1的值為7PURGEY1;解除Y1的定義DB字節(jié)變量,以字節(jié)為單位分配存儲單元。DW字變量,以字為單位分配存儲單元。DD定義雙字,以4字節(jié)為單位分配存儲單元。DQ
定義4字變量,以8字節(jié)為單位分配存儲單元。DT
定義5字變量,以10字節(jié)為單位分配存儲單元設(shè)置當(dāng)前地址計數(shù)器的值例
DATASEGMENT
ORG10HBUFF1DW2000H
ORG20H
BUFF2DW4000HDATAENDS執(zhí)行后BUFF1的偏移地址值為10H,BUFF2的為20H。段定義偽指令段分配偽指令A(yù)SSUME說明段寄存器和段名之間的對應(yīng)關(guān)系例ASSUMECS:CODE,DS:DATA段定義偽指令格式:
段名SEGMENT[定位類型][組合方式][類別名]·····
;指令句或偽指令句
段名ENDS5.2常用偽指令
成對使用,指定段的名稱、范圍和段的定位類型、組合類型和分類名。成對出現(xiàn),前后必須相同在同一模塊中,不同段的段名不能相同作用規(guī)定段的起始地址四種類型的起始位置分別為(X表示可為0或1):(A)BYTEXXXXXXXXXXXXXXXXXXXXB(B)WORDXXXXXXXXXXXXXXXXXXX0B(C)PARAXXXXXXXXXXXXXXXX0000B(D)PAGEXXXXXXXXXXXX00000000B
以上分別表示以字節(jié)、字、節(jié)、頁的邊界為起始地址。如果缺省定位方式,則以節(jié)的邊界為起始地址。作用指示連接程序,把同名的段按照指定的方式組合起來形成一個新的段。組合方式NONE、PUBLIC、STACK、 COMMON、MEMORY、AT典型格式:STACKSEGMENTPARASTACK‘STACK’類別名必須用單引號括起來連接程序把類別名相同的段放在連續(xù)的存儲區(qū)域,先出現(xiàn)的段在前,后出現(xiàn)的在后,但對各段不能重新組合5.3匯編程序的編寫
5.3.1段寄存器的填裝5.3.2匯編語言程序的編寫過程
1、DS、ES內(nèi)容的填裝例:CODESEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATA
MOVDS,AX
MOVES,AX
……
(DATA、STACK設(shè)置已省略。)5.3.1段寄存器的填裝用MOV指令填裝段寄存器DS、ES的值CODESEGMENT……DATAENDSSTACK1SEGMENTPARASTACK‘STACK’ DW200DUP(0)TOPLABELWORDSTACK1ENDSSTART:
……MOVAX,STACK1
MOVSS,AX
MOVSP,OFFSETTOP5.3.1段寄存器的填裝設(shè)置定位類型:PARA組合類型:STACKSSSP的內(nèi)容自動填充指令填裝SP指令填裝SS類似于DS、ES的填裝2、SS段寄存器的填裝
5.3.2匯編語言程序的編寫過程1)用文本編輯器建立擴展名為.ASM源文件。
2)用MASM程序吧擴展名為.ASM的文件匯編成擴展名為.OBJ的文件。
3)用LINX程序把擴展名為.OBJ的文件連接成擴展名為.EXE的文件。
4)在DOS方式下直接鍵入文件名就可執(zhí)行該程序。編輯程序DELINKTC編輯器WINDOWS文本編輯器EDIT匯編語言源程序的操作流程圖源程序文件EXMP.ASMASMMASMTASM匯編程序出錯文件EXMP.OBJ(EXMP.LST)(EXMP.CRF)LINK連接程序出錯文件EXMP.EXE(EXMP.MAP)(EXMP.LIB)DEBUG出錯5.3.2匯編語言程序的編寫過程連接的是.OBJ文件執(zhí)行的是.exe文件基本I/O系統(tǒng)BIOS主要功能:1.加電后的硬件測試程序;2.系統(tǒng)配置(如內(nèi)存大?。┑姆治龀绦?;3.顯示器、打印機、鍵盤、異步通信和軟驅(qū)的驅(qū)動程序;4.日、時鐘控制程序;5.引導(dǎo)與裝入程序。BIOS?DOS系統(tǒng)中設(shè)置了兩層內(nèi)部子程序可供用戶使用:基本輸入輸出模塊BIOSDOS層功能模塊5.4DOS功能調(diào)用用途:方便高級用戶通過軟中斷和功能調(diào)用在 MS-DOS較低層次上和操作系統(tǒng)打交道。BIOS的部分軟中斷調(diào)用指令及功能軟中斷調(diào)用指令I(lǐng)NT10H供顯示調(diào)用的BIOS功能INT13H供磁盤驅(qū)動器調(diào)用的BIOSINT14H供串行通信調(diào)用的BIOSINT16H供鍵盤輸入調(diào)用的BIOSINT17H供打印機調(diào)用的BIOS5.4DOS功能調(diào)用BIOS的調(diào)用格格式MOVAH,nn1nn1為功能號,規(guī)定調(diào)用的功能INTnn2nn2為軟中斷調(diào)用的類型碼,規(guī)定調(diào)用的類型EXAMPLE:設(shè)置顯示器為80(列)×25(行)彩色方式MOVAL,03H;AL為入口參數(shù),規(guī)定顯示方式MOVAH,00H;00H為設(shè)置顯示器的功能號INT10H;10H為供顯示調(diào)用的類型碼5.4DOS功能調(diào)用DOS系統(tǒng)功能調(diào)用(類型碼:21H)為了使用方便,將DOS層功能模塊所提供的100個子程序從00H~63H統(tǒng)一順序編號,調(diào)用方法如下:1.設(shè)置入口參數(shù)2.將子程序編號送入AH寄存器3.執(zhí)行中斷指令 INT21H5.4DOS功能調(diào)用功能號 功能 入口參數(shù)出口參數(shù)00H程序終止 無 無01H鍵盤輸入并回顯 無AL=輸入字符02H顯示字符 DL=輸出字符03H異步通信輸入 AL=輸入字符04H異步通信輸出DL=輸出字符05H 打印機輸出 DL=輸出字符06H 直接控制臺I/O5.4DOS功能調(diào)用功能號功能入口參數(shù)出口參數(shù)07H 鍵盤輸入無回顯 AL=輸入字符08H 同上但要檢測Ctrl-Break
09H顯示字符串 (見說明)0AH 字符串輸入 (見說明)4CH
返回DOS操作系統(tǒng)
更詳細(xì)情況可參見教材P333附錄5.4DOS功能調(diào)用‘A’‘’‘B’‘O’‘Y’‘$’說明:①AH=09H為顯示字符串功能。
例如,顯示STRING中字符串:
STRINGDB‘ABOY’,’$’;
MOVDX,OFFSETSTRING;取STRING的偏移地址
MOVAH,09H;
INT21H;DS:DX輸出緩沖區(qū)
結(jié)束字符BACK5.4DOS功能調(diào)用AH=0AH為從鍵盤輸入字符串。入口參數(shù):DS:DX=輸入緩沖區(qū)地址,
[DS:DX]為輸入緩沖區(qū)的總長;出口參數(shù):[DS:DX+1]為輸入字符串的實長(字符個數(shù))DS:DX+0輸入緩沖區(qū)
+1+2
輸入字符說明:最大的實長=總長-1總長實長BACK5.4DOS功能調(diào)用DOS功能調(diào)用舉例例從鍵盤輸入字符串并回顯
算法
a.顯示‘Doyouwantinputastring? (Y/N)’,回車,換行,‘$’; (09H功能)
b.從鍵盤輸入一個字符(Y/N), 若是‘y’或‘Y’則執(zhí)行c,否則到g
結(jié)束;(01H功能)
c.顯示‘Pleaseinputstring.’, 回車,換行,‘$’;(09H功能)5.4DOS功能調(diào)用
算法d.輸入字符串到緩沖區(qū);在緩沖區(qū)輸入的字符串后加結(jié)束符‘$’;f.回顯輸入的字符串;g.結(jié)束。5.4DOS功能調(diào)用DOS功能調(diào)用舉例例從鍵盤輸入字符串并回顯
算法例密碼輸入程序算法及流程圖a.提示“PleaseInputYourPassword.”
b.用輸入字符不回顯方式一個一個輸 入密碼,每輸入1位密位顯示一個“*” 號;密位可以1~8位,不足8位時以 “回車”結(jié)束,滿8位時自動結(jié)束。
c.比較輸入的密碼。5.4DOS功能調(diào)用
算法e.密碼錯誤,顯示“Wrong,Again!” 重新輸入輸入密碼。d.密碼正確,轉(zhuǎn)操作程序(以顯示 “OK!”結(jié)束)。
f.密碼輸入最多3次,3次均為錯誤 時顯示“NO!”退出。5.4DOS功能調(diào)用例密碼輸入程序算法及流程圖主程序BL←03HSI←BUFF1偏輸入密碼(SUB1)比較密碼(SUB2)密碼對?BL-1≠0?顯示“NO!”顯示“OK!”顯示“Wrong,Again!”ENDLOPYYNNDONEAGAIN5.4DOS功能調(diào)用流程圖SUB1DI←BUFF2偏CX←08H輸入字符存字符是否回車?DI←DI+1顯示‘*’號CX-1≠0?RET子程序1LOP1YNYDONE1N5.4DOS功能調(diào)用流程圖SUB2DI←BUFF2偏CX←取密位比較1個字符DI←DI+1是否不相同?SI←SI+1AL←00HCX-1≠0?RET子程序2LOP2YNYDONE2NAL←0FFH5.4DOS功能調(diào)用流程圖5.5.0匯編語言設(shè)計基礎(chǔ)知識5.5.1順序結(jié)構(gòu)程序設(shè)計5.5.2分支結(jié)構(gòu)程序設(shè)計5.5.3循環(huán)結(jié)構(gòu)程序設(shè)計5.5.4子程序結(jié)構(gòu)形式與操作5.5匯編程序設(shè)計一、匯編語言程序設(shè)計的一般步驟分析課題確定算法畫流程圖編寫程序上機調(diào)試
當(dāng)接到程序設(shè)計的任務(wù)后,首先對任務(wù)進行詳盡的分析,搞清楚已知的數(shù)據(jù)和想要得到的結(jié)果,程序應(yīng)該完成何種的功能。匯編語言設(shè)計的一般步驟一、匯編語言程序設(shè)計的一般步驟分析課題確定算法畫流程圖編寫程序上機調(diào)試根據(jù)實際問題的要求和指令系統(tǒng)的特點,確定解決問題的具體步驟。根據(jù)任務(wù)要求,對不同的計算方法進行比較,選擇最適宜的算法。匯編語言設(shè)計的一般步驟一、匯編語言程序設(shè)計的一般步驟分析課題確定算法畫流程圖編寫程序上機調(diào)試將解決問題的具體步驟用一種約定的幾何圖形、指向線和必要的文字說明描述出來的圖形。匯編語言設(shè)計的一般步驟一、匯編語言程序設(shè)計的一般步驟分析課題確定算法畫流程圖編寫程序上機調(diào)試經(jīng)過上述各步驟后,解決問題的思路已經(jīng)非常清楚,所以接下來就可以按流程圖的順序?qū)γ恳粋€功能框選用合適的指令編寫出匯編語言程序。匯編語言設(shè)計的一般步驟一、匯編語言程序設(shè)計的一般步驟分析課題確定算法畫流程圖編寫程序上機調(diào)試在應(yīng)用程序的設(shè)計中,幾乎沒有一個程序只經(jīng)過一次編寫就完全成功的,所以必須經(jīng)過上機調(diào)試。匯編語言設(shè)計的一般步驟1.流程圖的概念 流程圖是由特定的幾何圖形、指向線、文字說明來表示數(shù)據(jù)處理的步驟,形象描述邏輯控制結(jié)構(gòu)以及數(shù)據(jù)流程的示意圖。流程圖具有簡潔、明了、直觀的特點。2.流程圖符號表示(1)開始框:表示程序的開始。開始流程圖的畫法規(guī)定條件NY結(jié)束(3)判斷框
(2)處理框(執(zhí)行框)
(4)結(jié)束框結(jié)構(gòu)程序設(shè)計程序的每個部分都由有限結(jié)構(gòu)結(jié)合中的單元組成,并且只有單一的入口和單一的出口。基本結(jié)構(gòu)有:順序結(jié)構(gòu)(線性結(jié)構(gòu))選擇結(jié)構(gòu)(分支結(jié)構(gòu))循環(huán)結(jié)構(gòu)三種結(jié)構(gòu)可以任意組合和嵌套構(gòu)成復(fù)雜的程序。程序的基本結(jié)構(gòu)這三種結(jié)構(gòu)可歸納為五種邏輯結(jié)構(gòu):(1)順序結(jié)構(gòu)(2)雙分支結(jié)構(gòu)……(3)多分支結(jié)構(gòu)YN條件條件程序的基本結(jié)構(gòu)YN(4)DO_UNTIL循環(huán)結(jié)構(gòu)NY(5)DO_WHILE循環(huán)結(jié)構(gòu)程序的邏輯結(jié)構(gòu)格式程序的基本結(jié)構(gòu)順序程序:一種無分支的程序,
CPU從第一條指令開始依次執(zhí)行每一條指令,直到最后一條指令。特點:指令順序執(zhí)行,無分支、無循環(huán)、無轉(zhuǎn)移。拆字程序程序的基本結(jié)構(gòu)例題開始設(shè)置數(shù)據(jù)段和堆棧段地址設(shè)置堆棧指針取數(shù)據(jù)截取高四位右移四位例:設(shè)內(nèi)存DATA單元存放一個無符號字節(jié)數(shù)據(jù),編制程序?qū)⑵洳鸪蓛晌皇M制數(shù),并存入HEX和HEX+1單元的低4位,HEX存放高位十六進制數(shù),HEX+1單元存放低位十六進制數(shù)解: 分析命題確定算法畫流程圖拆字程序取原數(shù)據(jù)結(jié)束保留高位十六進制數(shù)截取低四位保存地位十六進制數(shù)保存結(jié)果 MOV SS,AX MOV SP,LENGTHSTK
MOV AL,DATA MOV AH,AL AND AL,0F0H MOV CL,04 SHR AL,CL MOV HEX,AL AND AH,0FH MOV HEX+1,AH MOV AX,4C00H INT 21HCSEGENDS END DISC例:設(shè)內(nèi)存DATA單元存放一個無符號字節(jié)數(shù)據(jù),編制程序?qū)⑵洳鸪蓛晌皇M制數(shù),并存入HEX和HEX+1單元的低4位,HEX存放高位十六進制數(shù),HEX+1單元存放低位十六進制數(shù)解: 分析命題確定算法畫流程圖編寫程序上機調(diào)試拆字程序SSEG SEGMENTSTACKSTK DB 20DUP(0)SSEG ENDSDSEG SEGMENTDATA DB 0B5HHEX DB 0,0DSEG ENDSCSEG SEGMENT ASSUMECS:CSEG,DS:DSEG ASSUMESS:SSEGDISC:MOV AX,DSEG MOV DS,AX MOV AX,SSEG條件轉(zhuǎn)移JCC和無條件轉(zhuǎn)移JMP指令用于實現(xiàn)程序的分支結(jié)構(gòu)。分支程序設(shè)計單分支if-then雙分支if-then-else判定:程序的邏輯根據(jù)某一條條件表達式為真或假時,執(zhí)行兩個不同處理之一時,便是雙分支結(jié)構(gòu)形式判定:有其中一個處理為空時,就是單分支形式;如果分支處理中又嵌套有分支,或者說具有多個分支走向時,即為邏輯上的多分支形式。5.52分支程序設(shè)計例:寫一個實現(xiàn)把一位十六進制數(shù)轉(zhuǎn)化為對應(yīng)ASCII碼的程序。
分析命題確定算法十六進制數(shù)碼與對應(yīng)的關(guān)系:0123………BCDEF30H31H32H33H42H43H44H45H46H這種對應(yīng)關(guān)系可表示為一個分段函數(shù):YX+30H(0<=X<=9)X+37H(0A<=X<=0FH)5.52分支程序設(shè)計分析命題確定算法畫流程圖開始取十六進制數(shù)X+30H0<=X<=9YN0A<=X<=0FHX+37H結(jié)束YN5.52分支程序設(shè)計例:寫一個實現(xiàn)把一位十六進制數(shù)轉(zhuǎn)化為對應(yīng)ASCII碼的程序。
分析命題確定算法畫流程圖編寫程序上機調(diào)試 JMP LAB2LAB1:ADDAL,37HLAB2:MOVASCII,AL MOVAH,4CH INT21HCODEENDSENDSTART DATA SEGMENTXXDB4ASCIIDB?DATAENDSDATA DB 0B5HCODESEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAL,0FH CMPAL,9 JALAB1 ADDAL,30H5.52分支程序設(shè)計例:寫一個實現(xiàn)把一位十六進制數(shù)轉(zhuǎn)化為對應(yīng)ASCII碼的程序。
DOWHILE結(jié)構(gòu)圖循環(huán)初始狀態(tài)循環(huán)控制條件循環(huán)體NY5.5.3循環(huán)程序設(shè)計DOUNTIL結(jié)構(gòu)圖循環(huán)初始狀態(tài)循環(huán)體循環(huán)控制條件YNDOWHILE結(jié)構(gòu)把對循環(huán)控制條件的判斷放在循環(huán)的入口,先判斷條件,滿足條件就執(zhí)行循環(huán)體,否則就退出循環(huán)DOUNTIL結(jié)構(gòu)先執(zhí)行一次循環(huán)體,然后再判斷控制條件,不滿足條件則繼續(xù)執(zhí)行循環(huán)操作,一旦滿足條件則退出循環(huán)5.5.3循環(huán)程序設(shè)計注意:循環(huán)次數(shù)等于0,選擇DOWHILE結(jié)構(gòu),否則使用DOUNTIL結(jié)構(gòu)。循環(huán)程序都可由如下四部分組成:(1)循環(huán)初始化部分(2)循環(huán)體(3)循環(huán)修改(4)循環(huán)控制最常見的循環(huán)結(jié)束有:①用計數(shù)器控制循環(huán);②按問題的條件控制循環(huán);③用開關(guān)量控制循環(huán);2.循環(huán)程序設(shè)計實現(xiàn)(1)單重循環(huán)程序設(shè)計
例5-8
設(shè)計程序,完成從1累加到50(即1+2+...+49+50),結(jié)果保存在數(shù)據(jù)段SUM單元。5.5.3循環(huán)程序設(shè)計DATA SEGMENT SUM DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,0 ;工作寄存器清零
MOV CX,50 ;計數(shù)器賦初值
MOV BX,0 LP: INC BX ;循環(huán)體入口
ADD AX,BX DEC CX ;循環(huán)計數(shù)器修改
JNZ LP ;循環(huán)控制
MOV AH,4CH INT 21HCODE ENDS END START5.5.3循環(huán)程序設(shè)計例5-9
分類統(tǒng)計字?jǐn)?shù)組ARRAY中正數(shù)、負(fù)數(shù)和零的個數(shù),并分別存入內(nèi)存字變量BUF1、BUF2和BUF3中,數(shù)組元素個數(shù)保存在數(shù)組的第一個字中。
DATA SEGMENTARRAY DW10 ;數(shù)據(jù)元素個數(shù)
DW230,-1437,26,-31,0,3458,0,10,-1,2350 POST DW0 NEGA DW0 ZERO DW0DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA5.5.3循環(huán)程序設(shè)計START: MOV AX, DATA MOV DS, AX MOV AX, 0 ;用AX作為正數(shù)的計數(shù)器
MOV BX, 0 ;用BX作為負(fù)數(shù)的計數(shù)器
MOV DX, 0 ;用DX作為零的計數(shù)器
MOV DI, OFFSETARRAY
MOV CX,[DI] ;用CX來進行循環(huán)計數(shù)
ADD DI, 2 ;用指針DI來訪問整個數(shù)組AGAIN: CMP WORDPTR[DI],0;與0做比較
JG HIGH ;大于0,為正數(shù)
JE EQUAL ;等于0
INC BX ;小于0,為負(fù)數(shù),負(fù)數(shù)個數(shù)增1
JMP NEXT5.5.3循環(huán)程序設(shè)計HIGH: INC AX ;正數(shù)個數(shù)增1 JMP NEXTEQUAL: INC DX ;0的個數(shù)增1NEXT: INC DI INC DI LOOPAGAIN ;未完循環(huán)DONE: MOV BUF1, AX ;把統(tǒng)計數(shù)保存到內(nèi)存單元中
MOV BUF2, BX MOV BUF3, DX MOV AH, 4CH ;結(jié)束程序返回DOS INT 21HCODE ENDS END START5.5.3循環(huán)程序設(shè)計例5-10
假設(shè)在以BUF為首址的存儲單元中存放著一串字符,找出其中ASCII碼值最大的字符,并存入MAX單元中。程序存儲單元與寄存器分配:
CX:循環(huán)次數(shù)控制變量,初值為字符串的長度﹣1,每次減1。
BX:BUF存儲區(qū)地址指針,初值指向BUF,每次加1。AL:用來求最大值的工作單元,保持某個時刻的最大值。
MAX:用來保存最終結(jié)果的字節(jié)單元。5.5.3循環(huán)程序設(shè)計圖5.8求最大字符的程序流程圖5.5.3循環(huán)程序設(shè)計STACK SEGMENTPARASTACK DB 200 DUP(0)STACK ENDSDATA SEGMENT BUFDB ‘ABCD5678bdcaMN’ N EQU $-BUF MAX DB ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOV AX,DATA MOV DS,AX MOV BX,OFFSETBUF ;BX指向字串首5.5.3循環(huán)程序設(shè)計
MOV AL,[BX];取出第一個字符
MOV CX,N-1;比較次數(shù)送CXNEXT1:INC BX ;BX指向下一字符
CMP AL, [BX] ;比較
JNCNEXT2 MOV AL,[BX]
;大數(shù)送ALNEXT2:LOOPNEXT;循環(huán)次數(shù)(CX
≠0)繼續(xù)循環(huán)
MOVMAX,AL ;MAX←最大數(shù)
MOVAH,4CH INT 21H CODE ENDS END BEGIN5.5.3循環(huán)程序設(shè)計(2)多重循環(huán)程序設(shè)計
多重循環(huán)即循環(huán)體內(nèi)又嵌套循環(huán)。 基本思想和單重循環(huán)程序設(shè)計一致,但實現(xiàn)起來更復(fù)雜。 應(yīng)分別考慮各重循環(huán)的控制條件及其程序?qū)崿F(xiàn),相互之間不能混淆,即內(nèi)外層循環(huán)必須是嵌套的形式,不能出現(xiàn)交叉。5.5.3循環(huán)程序設(shè)計(2)多重循環(huán)程序設(shè)計例5-11
在變量BUF中有n個無符號數(shù)x1,x2,…,xn,將它們按由大到小的順序排列在BUF中,試編程實現(xiàn)。5.5.3循環(huán)程序設(shè)計采用選擇排序時,存儲單元和寄存器分配如下:SI:用來控制外循環(huán)的循環(huán)計數(shù)器,初值為1,終值為N﹣1,每次遞增1。DI:用來控制內(nèi)循環(huán)的循環(huán)計數(shù)器,初值(SI)+1,終值為N,每次遞增1。AL:用來存放比較數(shù)據(jù)的寄存器。BUF:存放要排序數(shù)據(jù)的變量。N:存放要排序數(shù)據(jù)的個數(shù)。5.5.3循環(huán)程序設(shè)計STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSDATA SEGMENT BUF DB 0AH,8,15H,36H,6,20H,12H N EQU $-BUF;N為要排序數(shù)據(jù)的個數(shù) DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN: MOV AX, DATA MOV DS, AX MOV SI, 1 ;給外循環(huán)計數(shù)器賦初值15.5.3循環(huán)程序設(shè)計NEXT1: MOV DI,SI INC DI MOV AL, [BUF+SI-1]NEXT2: CMP AL, [BUF+DI-1] JAE NEXT3 XCHG [BUF+DI-1],AL MOV [BUF+SI-1],ALNEXT3: INC DI ;(DI)←(DI)+1 CMP DI,N ;若(DI)<N轉(zhuǎn)NEXT2,繼續(xù)執(zhí)行內(nèi)循環(huán)開始
5.5.3循環(huán)程序設(shè)計JBE NEXT2 ;否則退出內(nèi)循環(huán),本循環(huán)結(jié)束準(zhǔn)備進入下一輪循環(huán) INC SI ;(SI)←(SI)+1 CMP SI,N-1 ;比較(SI)與N﹣1 JBE NEXT1 ;若(SI)≤N-1轉(zhuǎn)NEXT1繼續(xù)循環(huán),否則退出 MOV AH,4CH INT 21HCODE ENDSEND BEGIN5.5.3循環(huán)程序設(shè)計5.5.4子程序結(jié)構(gòu)形式與操作1.子程序的定義程序設(shè)計中,把多次重復(fù)出現(xiàn)、具有通用性、能夠完成特定處理任務(wù)的程序段編寫成獨立的程序模塊。特性:(1)重復(fù)性;(2)通用性;(3)浮動性;(4)模塊化;主程序與子程序調(diào)用關(guān)系主程序K:調(diào)用子程序ADK:……J:調(diào)用子程序ADJ:…………子程序A……返回主程序5.5.4子程序結(jié)構(gòu)形式與操作例5-12
調(diào)用程序和子程序在同一代碼段中。
MAIN PROC FAR;主程序
…… CALL SUBR1
…… RET MAIN ENDP SUBR1 PROC NEAR;子程序(NEAR可省略)…… RET SUBR1 ENDPMAIN及其子程序SUBR1在同一代碼段中,SUBR1定義為NEAR屬性。如果調(diào)用程序和子程序不在同一個代碼段中,則使用FAR屬性程序的主程序看作DOS調(diào)用的一個子程序,因而DOS對MAIN的調(diào)用以及MAIN中的RET就是FAR屬性。5.5.4子程序結(jié)構(gòu)形式與操作CALL和NEAR為調(diào)用指令基本功能:
將子程序的返回地址(即CALL指令的下一條指令的地址,簡稱斷點地址,包括段地址和偏移地址)壓入堆棧,以便執(zhí)行完子程序后能返回主程序,并從斷點處繼續(xù)往下執(zhí)行,然后按照某種尋址方式轉(zhuǎn)向子程序的入口地址去執(zhí)行子程序。子程序定義的語法格式:
<子程序名>PROCAttributeRET<子程序名>ENDPSUBT PROC PUSH AX ;現(xiàn)場保護PUSH BXPUSH CXPUSH DX…… ;子程序體POP DX ;現(xiàn)場恢復(fù)POP CXPOP BXPOP AXRETSUBT ENDP例5-13PUSH指令把子程序所需要使用的寄存器內(nèi)容保存在堆棧中POP指令把寄存器內(nèi)容恢復(fù)原狀5.5.4子程序結(jié)構(gòu)形式與操作注意:子程序中用到的寄存器是應(yīng)該保護的。如果使用寄存器在主程序和子程序之間傳送參數(shù),這種寄存器就不一定需要保護,特別是向主程序回送結(jié)果的寄存器,更不應(yīng)該因保存和恢復(fù)寄存器而破壞了應(yīng)該向主程序傳送的信息。例5-14
假設(shè)在A、B、C、D四個字變量中各存放一個正整數(shù),試編寫程序分別求出A與B的最大公約數(shù)M,C與D的最大公約數(shù)N,再求出M與N之和,將結(jié)果存入RESULT字變量中。 本程序需兩次調(diào)用求最大公約數(shù)子程序,將兩次返回結(jié)果求和再存入RESULT字變量中。
5.5.4子程序結(jié)構(gòu)形式與操作STACKSEGMENT PARASTACK DB 200 DUP(0)STACKENDSDATA SEGMENT A DW 720B DW 81C DW 1150D DW 125 RESULTDW
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度環(huán)保設(shè)備租賃合同范本6篇
- 二零二五年度重型貨車定期保養(yǎng)及維修合同4篇
- 2025年度出口貨物運輸與跟蹤管理系統(tǒng)合作協(xié)議4篇
- 安全員培訓(xùn)與演練計劃制定能力提升
- 2025年度大米產(chǎn)業(yè)鏈綠色環(huán)保合作合同4篇
- 道路貨物運輸公司典型風(fēng)險案例分析與預(yù)防措施提煉
- 專業(yè)云直播技術(shù)服務(wù)協(xié)議2024版
- 2025年度企業(yè)培訓(xùn)需求分析服務(wù)合同范本4篇
- 2025年度合伙開設(shè)兒童攝影工作室合同(二零二五版)3篇
- 2025年銷售業(yè)務(wù)員勞動合同模板(含彈性工時規(guī)定)2篇
- 全國醫(yī)學(xué)博士英語統(tǒng)一考試詞匯表(10000詞全) - 打印版
- 最新《會計職業(yè)道德》課件
- 廣東省湛江市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)
- DB64∕T 1776-2021 水土保持生態(tài)監(jiān)測站點建設(shè)與監(jiān)測技術(shù)規(guī)范
- ?中醫(yī)院醫(yī)院等級復(fù)評實施方案
- 數(shù)學(xué)-九宮數(shù)獨100題(附答案)
- 理正深基坑之鋼板樁受力計算
- 學(xué)校年級組管理經(jīng)驗
- 10KV高壓環(huán)網(wǎng)柜(交接)試驗
- 未來水電工程建設(shè)抽水蓄能電站BIM項目解決方案
- 房屋出租家具電器清單
評論
0/150
提交評論