匯編語(yǔ)言程序設(shè)計(jì)-課件_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件_第5頁(yè)
已閱讀5頁(yè),還剩81頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章匯編語(yǔ)言程序設(shè)計(jì)5.1匯編語(yǔ)言程序格式5.5匯編語(yǔ)言設(shè)計(jì)5.4DOS功能調(diào)用5.3匯編語(yǔ)言的編寫(xiě)5.2常用偽指令教學(xué)重點(diǎn)

本章介紹程序結(jié)構(gòu)、偽指令、DOS功能調(diào)用。重點(diǎn):匯編語(yǔ)言程序的基本結(jié)構(gòu);偽指令及其使用方法;

DOS功能調(diào)用;基本的匯編語(yǔ)言程序設(shè)計(jì)方法。難點(diǎn):DOS功能調(diào)用的應(yīng)用匯編語(yǔ)言程序的設(shè)計(jì)精品資料你怎么稱(chēng)呼老師?如果老師最后沒(méi)有總結(jié)一節(jié)課的重點(diǎn)的難點(diǎn),你是否會(huì)認(rèn)為老師的教學(xué)方法需要改進(jìn)?你所經(jīng)歷的課堂,是講座式還是討論式?教師的教鞭“不怕太陽(yáng)曬,也不怕那風(fēng)雨狂,只怕先生罵我笨,沒(méi)有學(xué)問(wèn)無(wú)顏見(jiàn)爹娘……”“太陽(yáng)當(dāng)空照,花兒對(duì)我笑,小鳥(niǎo)說(shuō)早早早……”5.1匯編語(yǔ)言程序格式5.1.1程序結(jié)構(gòu)5.1.2匯編語(yǔ)言語(yǔ)句格式5.1.3匯編語(yǔ)言數(shù)據(jù)表示1、匯編語(yǔ)言的分段結(jié)構(gòu):匯編語(yǔ)言源程序數(shù)據(jù)段(DATA)作用:存放程序運(yùn)行所需要的數(shù)據(jù)和運(yùn)行結(jié)果堆棧段(STACK)作用:執(zhí)行數(shù)據(jù)的壓棧和彈棧操作,以及程序中的數(shù)據(jù)保護(hù)代碼段(CODE)作用:存放所編寫(xiě)的程序的代碼5.1.1程序結(jié)構(gòu)用開(kāi)始語(yǔ)句“SEGMENT”和結(jié)束語(yǔ)句“ENDS”來(lái)定義一個(gè)段2、語(yǔ)句類(lèi)型語(yǔ)句類(lèi)型指令語(yǔ)句作用:產(chǎn)生相應(yīng)的機(jī)器代碼,指定CPU做什么操作。偽指令語(yǔ)句作用:不產(chǎn)生相應(yīng)的機(jī)器代碼,僅控制匯編過(guò)程。宏指令語(yǔ)句作用:由編程者按照一定的規(guī)則來(lái)定義的一種較“宏大”的指令,包括多條指令或偽指令。5.1.1程序結(jié)構(gòu)例題1

DATASEGMENT

;定義DATA段

BUF1DB34H;定義第一個(gè)數(shù)據(jù)

BUF2DB2AH;定義第二個(gè)數(shù)據(jù)

SUMDB?;定義數(shù)據(jù)和單元

DATAENDS

;DATA結(jié)束STACKSEGMENTPARASTACK‘STACK’

;定義STACK段

DW200DUP(0)STACKENDS;STACK段結(jié)束SEGMENT 數(shù)據(jù)段開(kāi)始ENDS數(shù)據(jù)段結(jié)束數(shù)據(jù)段堆棧段例題1(續(xù))CODESEGMENT;定義CODE段ASSUMECS:CODE,DS:DATA,SS:STACK

;段分配START:MOVAX,DATAMOVDS,AX;填裝數(shù)據(jù)段寄存器DSMOVAL,BUF1;取第一個(gè)加數(shù)

ADDAL,BUF2;和第二個(gè)加數(shù)相加

MOVSUM,ALMOVAH,4CHINT21H;返回DOS狀態(tài)CODEENDS;CODE段結(jié)束

ENDSTART;整個(gè)源程序結(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é)束,同時(shí)指明程序起始點(diǎn)例題2(續(xù))指令語(yǔ)句偽指令語(yǔ)句定義符號(hào)、數(shù)據(jù),分配內(nèi)存單元,不產(chǎn)生機(jī)器代碼[名字]操作碼操作數(shù)[;注釋]匯編時(shí)翻譯成二進(jìn)制機(jī)器代碼[標(biāo)號(hào):]操作碼[操作數(shù),[操作數(shù)]][;注釋]指令語(yǔ)句標(biāo)號(hào)后有冒號(hào)“:”偽指令語(yǔ)句名字后沒(méi)有冒號(hào)指令語(yǔ)句、偽指令語(yǔ)句

5.1.2匯編語(yǔ)言語(yǔ)句格式名字由字母開(kāi)頭??捎上铝蟹?hào)組成:(1)大小寫(xiě)英文字母(A~Z,a~z)(2)數(shù)字(0~9)(3)特殊符號(hào)(?、@、_等)命名規(guī)則:

(1)數(shù)字不能作為名字的第一個(gè)符號(hào)。

(2)單獨(dú)的問(wèn)號(hào)(?)不能作為名字。

(3)最大有效長(zhǎng)度為31位。

(4)匯編語(yǔ)言中有特定含義的保留字(如操作碼、寄存器名等),不能作為名字使用。

(5)見(jiàn)名知義。如用BUFFER表示緩沖區(qū)、SUM表示累加和等。5.1.2匯編語(yǔ)言語(yǔ)句格式標(biāo)號(hào)的三種屬性段屬性偏移屬性類(lèi)型屬性定義變量的段起始地址。標(biāo)號(hào)偏移地址,從段起始地址到定義標(biāo)號(hào)的位置之間字節(jié)數(shù)。指出該標(biāo)號(hào)是在本段內(nèi)引用還是在其他段中引用。段內(nèi)引用屬性為NEAR;段間引用屬性為FAR。標(biāo)號(hào)在代碼段中定義。5.1.2匯編語(yǔ)言語(yǔ)句格式操作數(shù):用來(lái)指定參與操作的數(shù)據(jù)。多于一個(gè),之間用逗號(hào)分開(kāi)。可以是常數(shù)或表達(dá)式。操作碼與操作數(shù)例:MOVAX,BX5.1.2匯編語(yǔ)言語(yǔ)句格式操作碼:指明操作的性質(zhì)和功能,指令中的助記符都是操作碼無(wú)操作數(shù):一個(gè)操作數(shù):兩個(gè)操作數(shù):偽指令、宏指令可有多個(gè)操作數(shù):5.1.2匯編語(yǔ)言數(shù)據(jù)表示常量數(shù)值常量字符串常量

符號(hào)常數(shù)后綴:二進(jìn)制B、八進(jìn)制O或Q、十進(jìn)制D、十六進(jìn)制H。十進(jìn)制數(shù)可省掉后綴十六進(jìn)制數(shù)以A~F開(kāi)頭時(shí),前面須加數(shù)字0字符串在計(jì)算機(jī)中以ASCII碼存儲(chǔ)。如‘A’的存儲(chǔ)值是41H,‘AB’的存儲(chǔ)值是41、42H等。用EQU或“=”定義的符號(hào)常量。如用COUNTEQU3或COUNT=3定義后,COUNT是一個(gè)符號(hào)常數(shù),與數(shù)值3等價(jià)。變量段屬性偏移屬性類(lèi)型屬性定義變量的段起始地址變量所在段的段內(nèi)偏移地址變量類(lè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匯編語(yǔ)言數(shù)據(jù)表示運(yùn)算符及表達(dá)式算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符分析運(yùn)算符

+、—、*、/、MOD與數(shù)學(xué)運(yùn)算符的意義相同。取模是取余數(shù)。例:82MOD16; 結(jié)果為220HMOD7; 結(jié)果為4

AND、OR、NOT、XOR

運(yùn)算結(jié)果是一個(gè)常數(shù).EQ、NE、LT、GT、LE、GE兩個(gè)表達(dá)式比較時(shí),表達(dá)式表示方法/性質(zhì)要相同關(guān)系成立,結(jié)果為全1;不成立時(shí),為全0例如:指令MOVBX,32EQ45等價(jià)于MOVBX,0;綜合運(yùn)算符

SEG、OFFSET、LENGTH、SIZE、TYPE把存儲(chǔ)單元地址分解為段地址和偏移地址THIS、PTR

規(guī)定存儲(chǔ)單元的性質(zhì)5.1.2匯編語(yǔ)言數(shù)據(jù)表示常用偽指令等值偽指令等號(hào)偽指令解除定義偽指令定義變量偽指令定位偽指令5.2常用偽指令

格式〈符號(hào)名〉EQU〈表達(dá)式〉功能給符號(hào)名定義一個(gè)值、別的符號(hào)名、表達(dá)式或助記符。注

不能給一個(gè)符號(hào)重復(fù)定義與EQU類(lèi)似,但在同一個(gè)程序中,=可以對(duì)一個(gè)符號(hào)重新定義。格式

PURGE〈符號(hào)1,2…N〉功能

解除指定符號(hào)的定義,解除后,可用EQU重新定義。例

Y1EQU7;Y1的值為7PURGEY1;解除Y1的定義DB字節(jié)變量,以字節(jié)為單位分配存儲(chǔ)單元。DW字變量,以字為單位分配存儲(chǔ)單元。DD定義雙字,以4字節(jié)為單位分配存儲(chǔ)單元。DQ

定義4字變量,以8字節(jié)為單位分配存儲(chǔ)單元。DT

定義5字變量,以10字節(jié)為單位分配存儲(chǔ)單元設(shè)置當(dāng)前地址計(jì)數(shù)器的值例

DATASEGMENT

ORG10HBUFF1DW2000H

ORG20H

BUFF2DW4000HDATAENDS執(zhí)行后BUFF1的偏移地址值為10H,BUFF2的為20H。段定義偽指令段分配偽指令A(yù)SSUME說(shuō)明段寄存器和段名之間的對(duì)應(yīng)關(guān)系例ASSUMECS:CODE,DS:DATA段定義偽指令格式:

段名SEGMENT[定位類(lèi)型][組合方式][類(lèi)別名]·····

;指令句或偽指令句

段名ENDS5.2常用偽指令

成對(duì)使用,指定段的名稱(chēng)、范圍和段的定位類(lèi)型、組合類(lèi)型和分類(lèi)名。成對(duì)出現(xiàn),前后必須相同在同一模塊中,不同段的段名不能相同作用規(guī)定段的起始地址四種類(lèi)型的起始位置分別為(X表示可為0或1):(A)BYTEXXXXXXXXXXXXXXXXXXXXB(B)WORDXXXXXXXXXXXXXXXXXXX0B(C)PARAXXXXXXXXXXXXXXXX0000B(D)PAGEXXXXXXXXXXXX00000000B

以上分別表示以字節(jié)、字、節(jié)、頁(yè)的邊界為起始地址。如果缺省定位方式,則以節(jié)的邊界為起始地址。作用指示連接程序,把同名的段按照指定的方式組合起來(lái)形成一個(gè)新的段。組合方式NONE、PUBLIC、STACK、 COMMON、MEMORY、AT典型格式:STACKSEGMENTPARASTACK‘STACK’類(lèi)別名必須用單引號(hào)括起來(lái)連接程序把類(lèi)別名相同的段放在連續(xù)的存儲(chǔ)區(qū)域,先出現(xiàn)的段在前,后出現(xiàn)的在后,但對(duì)各段不能重新組合5.3匯編程序的編寫(xiě)

5.3.1段寄存器的填裝5.3.2匯編語(yǔ)言程序的編寫(xiě)過(guò)程

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è)置定位類(lèi)型:PARA組合類(lèi)型:STACKSSSP的內(nèi)容自動(dòng)填充指令填裝SP指令填裝SS類(lèi)似于DS、ES的填裝2、SS段寄存器的填裝

5.3.2匯編語(yǔ)言程序的編寫(xiě)過(guò)程1)用文本編輯器建立擴(kuò)展名為.ASM源文件。

2)用MASM程序吧擴(kuò)展名為.ASM的文件匯編成擴(kuò)展名為.OBJ的文件。

3)用LINX程序把擴(kuò)展名為.OBJ的文件連接成擴(kuò)展名為.EXE的文件。

4)在DOS方式下直接鍵入文件名就可執(zhí)行該程序。編輯程序DELINKTC編輯器WINDOWS文本編輯器EDIT匯編語(yǔ)言源程序的操作流程圖源程序文件EXMP.ASMASMMASMTASM匯編程序出錯(cuò)文件EXMP.OBJ(EXMP.LST)(EXMP.CRF)LINK連接程序出錯(cuò)文件EXMP.EXE(EXMP.MAP)(EXMP.LIB)DEBUG出錯(cuò)5.3.2匯編語(yǔ)言程序的編寫(xiě)過(guò)程連接的是.OBJ文件執(zhí)行的是.exe文件基本I/O系統(tǒng)BIOS主要功能:1.加電后的硬件測(cè)試程序;2.系統(tǒng)配置(如內(nèi)存大?。┑姆治龀绦?;3.顯示器、打印機(jī)、鍵盤(pán)、異步通信和軟驅(qū)的驅(qū)動(dòng)程序;4.日、時(shí)鐘控制程序;5.引導(dǎo)與裝入程序。BIOS?DOS系統(tǒng)中設(shè)置了兩層內(nèi)部子程序可供用戶(hù)使用:基本輸入輸出模塊BIOSDOS層功能模塊5.4DOS功能調(diào)用用途:方便高級(jí)用戶(hù)通過(guò)軟中斷和功能調(diào)用在 MS-DOS較低層次上和操作系統(tǒng)打交道。BIOS的部分軟中斷調(diào)用指令及功能軟中斷調(diào)用指令I(lǐng)NT10H供顯示調(diào)用的BIOS功能INT13H供磁盤(pán)驅(qū)動(dòng)器調(diào)用的BIOSINT14H供串行通信調(diào)用的BIOSINT16H供鍵盤(pán)輸入調(diào)用的BIOSINT17H供打印機(jī)調(diào)用的BIOS5.4DOS功能調(diào)用BIOS的調(diào)用格格式MOVAH,nn1nn1為功能號(hào),規(guī)定調(diào)用的功能INTnn2nn2為軟中斷調(diào)用的類(lèi)型碼,規(guī)定調(diào)用的類(lèi)型EXAMPLE:設(shè)置顯示器為80(列)×25(行)彩色方式MOVAL,03H;AL為入口參數(shù),規(guī)定顯示方式MOVAH,00H;00H為設(shè)置顯示器的功能號(hào)INT10H;10H為供顯示調(diào)用的類(lèi)型碼5.4DOS功能調(diào)用DOS系統(tǒng)功能調(diào)用(類(lèi)型碼:21H)為了使用方便,將DOS層功能模塊所提供的100個(gè)子程序從00H~63H統(tǒng)一順序編號(hào),調(diào)用方法如下:1.設(shè)置入口參數(shù)2.將子程序編號(hào)送入AH寄存器3.執(zhí)行中斷指令 INT21H5.4DOS功能調(diào)用功能號(hào) 功能 入口參數(shù)出口參數(shù)00H程序終止 無(wú) 無(wú)01H鍵盤(pán)輸入并回顯 無(wú)AL=輸入字符02H顯示字符 DL=輸出字符03H異步通信輸入 AL=輸入字符04H異步通信輸出DL=輸出字符05H 打印機(jī)輸出 DL=輸出字符06H 直接控制臺(tái)I/O5.4DOS功能調(diào)用功能號(hào)功能入口參數(shù)出口參數(shù)07H 鍵盤(pán)輸入無(wú)回顯 AL=輸入字符08H 同上但要檢測(cè)Ctrl-Break

09H顯示字符串 (見(jiàn)說(shuō)明)0AH 字符串輸入 (見(jiàn)說(shuō)明)4CH

返回DOS操作系統(tǒng)

更詳細(xì)情況可參見(jiàn)教材P333附錄5.4DOS功能調(diào)用‘A’‘’‘B’‘O’‘Y’‘$’說(shuō)明:①AH=09H為顯示字符串功能。

例如,顯示STRING中字符串:

STRINGDB‘ABOY’,’$’;

MOVDX,OFFSETSTRING;取STRING的偏移地址

MOVAH,09H;

INT21H;DS:DX輸出緩沖區(qū)

結(jié)束字符BACK5.4DOS功能調(diào)用AH=0AH為從鍵盤(pán)輸入字符串。入口參數(shù):DS:DX=輸入緩沖區(qū)地址,

[DS:DX]為輸入緩沖區(qū)的總長(zhǎng);出口參數(shù):[DS:DX+1]為輸入字符串的實(shí)長(zhǎng)(字符個(gè)數(shù))DS:DX+0輸入緩沖區(qū)

+1+2

輸入字符說(shuō)明:最大的實(shí)長(zhǎng)=總長(zhǎng)-1總長(zhǎng)實(shí)長(zhǎng)BACK5.4DOS功能調(diào)用DOS功能調(diào)用舉例例從鍵盤(pán)輸入字符串并回顯

算法

a.顯示‘Doyouwantinputastring? (Y/N)’,回車(chē),換行,‘$’; (09H功能)

b.從鍵盤(pán)輸入一個(gè)字符(Y/N), 若是‘y’或‘Y’則執(zhí)行c,否則到g

結(jié)束;(01H功能)

c.顯示‘Pleaseinputstring.’, 回車(chē),換行,‘$’;(09H功能)5.4DOS功能調(diào)用

算法d.輸入字符串到緩沖區(qū);在緩沖區(qū)輸入的字符串后加結(jié)束符‘$’;f.回顯輸入的字符串;g.結(jié)束。5.4DOS功能調(diào)用DOS功能調(diào)用舉例例從鍵盤(pán)輸入字符串并回顯

算法例密碼輸入程序算法及流程圖a.提示“PleaseInputYourPassword.”

b.用輸入字符不回顯方式一個(gè)一個(gè)輸 入密碼,每輸入1位密位顯示一個(gè)“*” 號(hào);密位可以1~8位,不足8位時(shí)以 “回車(chē)”結(jié)束,滿(mǎn)8位時(shí)自動(dòng)結(jié)束。

c.比較輸入的密碼。5.4DOS功能調(diào)用

算法e.密碼錯(cuò)誤,顯示“Wrong,Again!” 重新輸入輸入密碼。d.密碼正確,轉(zhuǎn)操作程序(以顯示 “OK!”結(jié)束)。

f.密碼輸入最多3次,3次均為錯(cuò)誤 時(shí)顯示“NO!”退出。5.4DOS功能調(diào)用例密碼輸入程序算法及流程圖主程序BL←03HSI←BUFF1偏輸入密碼(SUB1)比較密碼(SUB2)密碼對(duì)?BL-1≠0?顯示“NO!”顯示“OK!”顯示“Wrong,Again!”ENDLOPYYNNDONEAGAIN5.4DOS功能調(diào)用流程圖SUB1DI←BUFF2偏CX←08H輸入字符存字符是否回車(chē)?DI←DI+1顯示‘*’號(hào)CX-1≠0?RET子程序1LOP1YNYDONE1N5.4DOS功能調(diào)用流程圖SUB2DI←BUFF2偏CX←取密位比較1個(gè)字符DI←DI+1是否不相同?SI←SI+1AL←00HCX-1≠0?RET子程序2LOP2YNYDONE2NAL←0FFH5.4DOS功能調(diào)用流程圖5.5.0匯編語(yǔ)言設(shè)計(jì)基礎(chǔ)知識(shí)5.5.1順序結(jié)構(gòu)程序設(shè)計(jì)5.5.2分支結(jié)構(gòu)程序設(shè)計(jì)5.5.3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)5.5.4子程序結(jié)構(gòu)形式與操作5.5匯編程序設(shè)計(jì)一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟分析課題確定算法畫(huà)流程圖編寫(xiě)程序上機(jī)調(diào)試

當(dāng)接到程序設(shè)計(jì)的任務(wù)后,首先對(duì)任務(wù)進(jìn)行詳盡的分析,搞清楚已知的數(shù)據(jù)和想要得到的結(jié)果,程序應(yīng)該完成何種的功能。匯編語(yǔ)言設(shè)計(jì)的一般步驟一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟分析課題確定算法畫(huà)流程圖編寫(xiě)程序上機(jī)調(diào)試根據(jù)實(shí)際問(wèn)題的要求和指令系統(tǒng)的特點(diǎn),確定解決問(wèn)題的具體步驟。根據(jù)任務(wù)要求,對(duì)不同的計(jì)算方法進(jìn)行比較,選擇最適宜的算法。匯編語(yǔ)言設(shè)計(jì)的一般步驟一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟分析課題確定算法畫(huà)流程圖編寫(xiě)程序上機(jī)調(diào)試將解決問(wèn)題的具體步驟用一種約定的幾何圖形、指向線(xiàn)和必要的文字說(shuō)明描述出來(lái)的圖形。匯編語(yǔ)言設(shè)計(jì)的一般步驟一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟分析課題確定算法畫(huà)流程圖編寫(xiě)程序上機(jī)調(diào)試經(jīng)過(guò)上述各步驟后,解決問(wèn)題的思路已經(jīng)非常清楚,所以接下來(lái)就可以按流程圖的順序?qū)γ恳粋€(gè)功能框選用合適的指令編寫(xiě)出匯編語(yǔ)言程序。匯編語(yǔ)言設(shè)計(jì)的一般步驟一、匯編語(yǔ)言程序設(shè)計(jì)的一般步驟分析課題確定算法畫(huà)流程圖編寫(xiě)程序上機(jī)調(diào)試在應(yīng)用程序的設(shè)計(jì)中,幾乎沒(méi)有一個(gè)程序只經(jīng)過(guò)一次編寫(xiě)就完全成功的,所以必須經(jīng)過(guò)上機(jī)調(diào)試。匯編語(yǔ)言設(shè)計(jì)的一般步驟1.流程圖的概念 流程圖是由特定的幾何圖形、指向線(xiàn)、文字說(shuō)明來(lái)表示數(shù)據(jù)處理的步驟,形象描述邏輯控制結(jié)構(gòu)以及數(shù)據(jù)流程的示意圖。流程圖具有簡(jiǎn)潔、明了、直觀的特點(diǎn)。2.流程圖符號(hào)表示(1)開(kāi)始框:表示程序的開(kāi)始。開(kāi)始流程圖的畫(huà)法規(guī)定條件NY結(jié)束(3)判斷框

(2)處理框(執(zhí)行框)

(4)結(jié)束框結(jié)構(gòu)程序設(shè)計(jì)程序的每個(gè)部分都由有限結(jié)構(gòu)結(jié)合中的單元組成,并且只有單一的入口和單一的出口?;窘Y(jié)構(gòu)有:順序結(jié)構(gòu)(線(xiàn)性結(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)順序程序:一種無(wú)分支的程序,

CPU從第一條指令開(kāi)始依次執(zhí)行每一條指令,直到最后一條指令。特點(diǎn):指令順序執(zhí)行,無(wú)分支、無(wú)循環(huán)、無(wú)轉(zhuǎn)移。拆字程序程序的基本結(jié)構(gòu)例題開(kāi)始設(shè)置數(shù)據(jù)段和堆棧段地址設(shè)置堆棧指針取數(shù)據(jù)截取高四位右移四位例:設(shè)內(nèi)存DATA單元存放一個(gè)無(wú)符號(hào)字節(jié)數(shù)據(jù),編制程序?qū)⑵洳鸪蓛晌皇M(jìn)制數(shù),并存入HEX和HEX+1單元的低4位,HEX存放高位十六進(jìn)制數(shù),HEX+1單元存放低位十六進(jìn)制數(shù)解: 分析命題確定算法畫(huà)流程圖拆字程序取原數(shù)據(jù)結(jié)束保留高位十六進(jìn)制數(shù)截取低四位保存地位十六進(jìn)制數(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單元存放一個(gè)無(wú)符號(hào)字節(jié)數(shù)據(jù),編制程序?qū)⑵洳鸪蓛晌皇M(jìn)制數(shù),并存入HEX和HEX+1單元的低4位,HEX存放高位十六進(jìn)制數(shù),HEX+1單元存放低位十六進(jìn)制數(shù)解: 分析命題確定算法畫(huà)流程圖編寫(xiě)程序上機(jī)調(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和無(wú)條件轉(zhuǎn)移JMP指令用于實(shí)現(xiàn)程序的分支結(jié)構(gòu)。分支程序設(shè)計(jì)單分支if-then雙分支if-then-else判定:程序的邏輯根據(jù)某一條條件表達(dá)式為真或假時(shí),執(zhí)行兩個(gè)不同處理之一時(shí),便是雙分支結(jié)構(gòu)形式判定:有其中一個(gè)處理為空時(shí),就是單分支形式;如果分支處理中又嵌套有分支,或者說(shuō)具有多個(gè)分支走向時(shí),即為邏輯上的多分支形式。5.52分支程序設(shè)計(jì)例:寫(xiě)一個(gè)實(shí)現(xiàn)把一位十六進(jìn)制數(shù)轉(zhuǎn)化為對(duì)應(yīng)ASCII碼的程序。

分析命題確定算法十六進(jìn)制數(shù)碼與對(duì)應(yīng)的關(guān)系:0123………BCDEF30H31H32H33H42H43H44H45H46H這種對(duì)應(yīng)關(guān)系可表示為一個(gè)分段函數(shù):YX+30H(0<=X<=9)X+37H(0A<=X<=0FH)5.52分支程序設(shè)計(jì)分析命題確定算法畫(huà)流程圖開(kāi)始取十六進(jìn)制數(shù)X+30H0<=X<=9YN0A<=X<=0FHX+37H結(jié)束YN5.52分支程序設(shè)計(jì)例:寫(xiě)一個(gè)實(shí)現(xiàn)把一位十六進(jìn)制數(shù)轉(zhuǎn)化為對(duì)應(yīng)ASCII碼的程序。

分析命題確定算法畫(huà)流程圖編寫(xiě)程序上機(jī)調(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è)計(jì)例:寫(xiě)一個(gè)實(shí)現(xiàn)把一位十六進(jìn)制數(shù)轉(zhuǎn)化為對(duì)應(yīng)ASCII碼的程序。

DOWHILE結(jié)構(gòu)圖循環(huán)初始狀態(tài)循環(huán)控制條件循環(huán)體NY5.5.3循環(huán)程序設(shè)計(jì)DOUNTIL結(jié)構(gòu)圖循環(huán)初始狀態(tài)循環(huán)體循環(huán)控制條件YNDOWHILE結(jié)構(gòu)把對(duì)循環(huán)控制條件的判斷放在循環(huán)的入口,先判斷條件,滿(mǎn)足條件就執(zhí)行循環(huán)體,否則就退出循環(huán)DOUNTIL結(jié)構(gòu)先執(zhí)行一次循環(huán)體,然后再判斷控制條件,不滿(mǎn)足條件則繼續(xù)執(zhí)行循環(huán)操作,一旦滿(mǎn)足條件則退出循環(huán)5.5.3循環(huán)程序設(shè)計(jì)注意:循環(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)控制最常見(jiàn)的循環(huán)結(jié)束有:①用計(jì)數(shù)器控制循環(huán);②按問(wèn)題的條件控制循環(huán);③用開(kāi)關(guān)量控制循環(huán);2.循環(huán)程序設(shè)計(jì)實(shí)現(xiàn)(1)單重循環(huán)程序設(shè)計(jì)

例5-8

設(shè)計(jì)程序,完成從1累加到50(即1+2+...+49+50),結(jié)果保存在數(shù)據(jù)段SUM單元。5.5.3循環(huán)程序設(shè)計(jì)DATA SEGMENT SUM DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,0 ;工作寄存器清零

MOV CX,50 ;計(jì)數(shù)器賦初值

MOV BX,0 LP: INC BX ;循環(huán)體入口

ADD AX,BX DEC CX ;循環(huán)計(jì)數(shù)器修改

JNZ LP ;循環(huán)控制

MOV AH,4CH INT 21HCODE ENDS END START5.5.3循環(huán)程序設(shè)計(jì)例5-9

分類(lèi)統(tǒng)計(jì)字?jǐn)?shù)組ARRAY中正數(shù)、負(fù)數(shù)和零的個(gè)數(shù),并分別存入內(nèi)存字變量BUF1、BUF2和BUF3中,數(shù)組元素個(gè)數(shù)保存在數(shù)組的第一個(gè)字中。

DATA SEGMENTARRAY DW10 ;數(shù)據(jù)元素個(gè)數(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è)計(jì)START: MOV AX, DATA MOV DS, AX MOV AX, 0 ;用AX作為正數(shù)的計(jì)數(shù)器

MOV BX, 0 ;用BX作為負(fù)數(shù)的計(jì)數(shù)器

MOV DX, 0 ;用DX作為零的計(jì)數(shù)器

MOV DI, OFFSETARRAY

MOV CX,[DI] ;用CX來(lái)進(jìn)行循環(huán)計(jì)數(shù)

ADD DI, 2 ;用指針DI來(lái)訪問(wèn)整個(gè)數(shù)組AGAIN: CMP WORDPTR[DI],0;與0做比較

JG HIGH ;大于0,為正數(shù)

JE EQUAL ;等于0

INC BX ;小于0,為負(fù)數(shù),負(fù)數(shù)個(gè)數(shù)增1

JMP NEXT5.5.3循環(huán)程序設(shè)計(jì)HIGH: INC AX ;正數(shù)個(gè)數(shù)增1 JMP NEXTEQUAL: INC DX ;0的個(gè)數(shù)增1NEXT: INC DI INC DI LOOPAGAIN ;未完循環(huán)DONE: MOV BUF1, AX ;把統(tǒng)計(jì)數(shù)保存到內(nèi)存單元中

MOV BUF2, BX MOV BUF3, DX MOV AH, 4CH ;結(jié)束程序返回DOS INT 21HCODE ENDS END START5.5.3循環(huán)程序設(shè)計(jì)例5-10

假設(shè)在以BUF為首址的存儲(chǔ)單元中存放著一串字符,找出其中ASCII碼值最大的字符,并存入MAX單元中。程序存儲(chǔ)單元與寄存器分配:

CX:循環(huán)次數(shù)控制變量,初值為字符串的長(zhǎng)度﹣1,每次減1。

BX:BUF存儲(chǔ)區(qū)地址指針,初值指向BUF,每次加1。AL:用來(lái)求最大值的工作單元,保持某個(gè)時(shí)刻的最大值。

MAX:用來(lái)保存最終結(jié)果的字節(jié)單元。5.5.3循環(huán)程序設(shè)計(jì)圖5.8求最大字符的程序流程圖5.5.3循環(huán)程序設(shè)計(jì)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è)計(jì)

MOV AL,[BX];取出第一個(gè)字符

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è)計(jì)(2)多重循環(huán)程序設(shè)計(jì)

多重循環(huán)即循環(huán)體內(nèi)又嵌套循環(huán)。 基本思想和單重循環(huán)程序設(shè)計(jì)一致,但實(shí)現(xiàn)起來(lái)更復(fù)雜。 應(yīng)分別考慮各重循環(huán)的控制條件及其程序?qū)崿F(xiàn),相互之間不能混淆,即內(nèi)外層循環(huán)必須是嵌套的形式,不能出現(xiàn)交叉。5.5.3循環(huán)程序設(shè)計(jì)(2)多重循環(huán)程序設(shè)計(jì)例5-11

在變量BUF中有n個(gè)無(wú)符號(hào)數(shù)x1,x2,…,xn,將它們按由大到小的順序排列在BUF中,試編程實(shí)現(xiàn)。5.5.3循環(huán)程序設(shè)計(jì)采用選擇排序時(shí),存儲(chǔ)單元和寄存器分配如下:SI:用來(lái)控制外循環(huán)的循環(huán)計(jì)數(shù)器,初值為1,終值為N﹣1,每次遞增1。DI:用來(lái)控制內(nèi)循環(huán)的循環(huán)計(jì)數(shù)器,初值(SI)+1,終值為N,每次遞增1。AL:用來(lái)存放比較數(shù)據(jù)的寄存器。BUF:存放要排序數(shù)據(jù)的變量。N:存放要排序數(shù)據(jù)的個(gè)數(shù)。5.5.3循環(huán)程序設(shè)計(jì)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ù)的個(gè)數(shù) DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN: MOV AX, DATA MOV DS, AX MOV SI, 1 ;給外循環(huán)計(jì)數(shù)器賦初值15.5.3循環(huán)程序設(shè)計(jì)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)開(kāi)始

5.5.3循環(huán)程序設(shè)計(jì)JBE NEXT2 ;否則退出內(nèi)循環(huán),本循環(huán)結(jié)束準(zhǔn)備進(jì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è)計(jì)5.5.4子程序結(jié)構(gòu)形式與操作1.子程序的定義程序設(shè)計(jì)中,把多次重復(fù)出現(xiàn)、具有通用性、能夠完成特定處理任務(wù)的程序段編寫(xiě)成獨(dú)立的程序模塊。特性:(1)重復(fù)性;(2)通用性;(3)浮動(dòng)性;(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)用程序和子程序不在同一個(gè)代碼段中,則使用FAR屬性程序的主程序看作DOS調(diào)用的一個(gè)子程序,因而DOS對(duì)MAIN的調(diào)用以及MAIN中的RET就是FAR屬性。5.5.4子程序結(jié)構(gòu)形式與操作CALL和NEAR為調(diào)用指令基本功能:

將子程序的返回地址(即CALL指令的下一條指令的地址,簡(jiǎn)稱(chēng)斷點(diǎn)地址,包括段地址和偏移地址)壓入堆棧,以便執(zhí)行完子程序后能返回主程序,并從斷點(diǎn)處繼續(xù)往下執(zhí)行,然后按照某種尋址方式轉(zhuǎn)向子程序的入口地址去執(zhí)行子程序。子程序定義的語(yǔ)法格式:

<子程序名>PROCAttributeRET<子程序名>ENDPSUBT PROC PUSH AX ;現(xiàn)場(chǎng)保護(hù)PUSH BXPUSH CXPUSH DX…… ;子程序體POP DX ;現(xiàn)場(chǎng)恢復(fù)POP CXPOP BXPOP AXRETSUBT ENDP例5-13PUSH指令把子程序所需要使用的寄存器內(nèi)容保存在堆棧中POP指令把寄存器內(nèi)容恢復(fù)原狀5.5.4子程序結(jié)構(gòu)形式與操作注意:子程序中用到的寄存器是應(yīng)該保護(hù)的。如果使用寄存器在主程序和子程序之間傳送參數(shù),這種寄存器就不一定需要保護(hù),特別是向主程序回送結(jié)果的寄存器,更不應(yīng)該因保存和恢復(fù)寄存器而破壞了應(yīng)該向主程序傳送的信息。例5-14

假設(shè)在A、B、C、D四個(gè)字變量中各存放一個(gè)正整數(shù),試編寫(xiě)程序分別求出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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論