微型計算機原理與接口技術(shù)(4)_第1頁
微型計算機原理與接口技術(shù)(4)_第2頁
微型計算機原理與接口技術(shù)(4)_第3頁
微型計算機原理與接口技術(shù)(4)_第4頁
微型計算機原理與接口技術(shù)(4)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章第四章 匯編語言程序設計匯編語言程序設計 匯編語言是利用指令的助記符、符號地址、標號來編寫的語言,它是機器語匯編語言是利用指令的助記符、符號地址、標號來編寫的語言,它是機器語言的符號表示,是較低級的語言。利用匯編語言編寫的程序稱為源程序,指令系統(tǒng)言的符號表示,是較低級的語言。利用匯編語言編寫的程序稱為源程序,指令系統(tǒng)中的每條指令都是構(gòu)成源程序的基本語句。但機器不能識別源程序,要通過匯編程中的每條指令都是構(gòu)成源程序的基本語句。但機器不能識別源程序,要通過匯編程序翻譯成二進制代碼的浮動目標程序,然后由連接程序?qū)⒛繕宋募c庫文件相連,序翻譯成二進制代碼的浮動目標程序,然后由連接程序?qū)⒛繕宋募c

2、庫文件相連,最后得到可執(zhí)行的程序,才可在機器上直接運行。最后得到可執(zhí)行的程序,才可在機器上直接運行。 一個完整的匯編程序編寫格式要包括以下幾部分:段定義、段分配、設置段一個完整的匯編程序編寫格式要包括以下幾部分:段定義、段分配、設置段地址、返回地址、返回DOSDOS語句及程序結(jié)束,需要時加上過程調(diào)用。語句及程序結(jié)束,需要時加上過程調(diào)用。 (1)(1)匯編語言編寫的原程序是分段的,要定義代碼段、數(shù)據(jù)段、堆棧段,每段匯編語言編寫的原程序是分段的,要定義代碼段、數(shù)據(jù)段、堆棧段,每段由段定義偽指令由段定義偽指令SEGMENTSEGMENT開始,開始,ENDSENDS結(jié)束,并賦予段名區(qū)分不同段。段定義的

3、基本結(jié)束,并賦予段名區(qū)分不同段。段定義的基本格式如下:格式如下: 段名段名 SEGMENTSEGMENT 段名段名 ENDSENDS 原程序中至少有一個代碼段,此時數(shù)據(jù)可放在代碼段中;堆棧段如果不定義,原程序中至少有一個代碼段,此時數(shù)據(jù)可放在代碼段中;堆棧段如果不定義,由計算機自動分配。段名可以自己定義,用字母和數(shù)字組成。計算機識別不同的段由計算機自動分配。段名可以自己定義,用字母和數(shù)字組成。計算機識別不同的段由段分配偽指令由段分配偽指令ASSUMEASSUME來完成。段分配的格式為:來完成。段分配的格式為: ASSUME CS ASSUME CS:段名,:段名,DSDS:段名,:段名,SSS

4、S:段名,:段名,ESES:段名:段名 (2)(2)過程調(diào)用由偽指令過程調(diào)用由偽指令PROCENDPPROCENDP實現(xiàn),過程的調(diào)用格式如下實現(xiàn),過程的調(diào)用格式如下( (也可省略也可省略) ): 過程名過程名 PROC FAR(NEAR)PROC FAR(NEAR);FARFAR表示遠調(diào)用,表示遠調(diào)用,NEARNEAR表示近調(diào)用可缺省表示近調(diào)用可缺省 過程名過程名 ENDPENDP (3) (3)若程序已經(jīng)分別定義了數(shù)據(jù)段、堆棧段和附加段,主程序的開始要設若程序已經(jīng)分別定義了數(shù)據(jù)段、堆棧段和附加段,主程序的開始要設置這些段的地址。代碼段的地址不能人為設置,由計算機分配。堆棧段和數(shù)據(jù)置這些段的地

5、址。代碼段的地址不能人為設置,由計算機分配。堆棧段和數(shù)據(jù)段設置的具體語句為;段設置的具體語句為; MOV AXMOV AX,STACK STACK ;送堆棧段地址;送堆棧段地址 MOV SSMOV SS,AXAX MOV AX, DATA MOV AX, DATA ;送數(shù)據(jù)段地址;送數(shù)據(jù)段地址 MOV DSMOV DS,AXAX (4) (4)程序執(zhí)行完畢要返回程序執(zhí)行完畢要返回DOSDOS操作系統(tǒng),有兩種方式實現(xiàn)。一種是在程序的操作系統(tǒng),有兩種方式實現(xiàn)。一種是在程序的開始部分編寫如下語句:開始部分編寫如下語句: PUSH DSPUSH DS MOV AX,0 MOV AX,0 PUSH AX

6、 PUSH AX 將將DSDS的內(nèi)容及的內(nèi)容及0 0作為段地址和偏移地址入棧,在程序結(jié)束時返回作為段地址和偏移地址入棧,在程序結(jié)束時返回DOSDOS。以上。以上三句語句必須寫在堆棧段設置后面,否則堆棧段的設置使一些指令不起作用了。三句語句必須寫在堆棧段設置后面,否則堆棧段的設置使一些指令不起作用了。第二種方法是在程序結(jié)束前使用第二種方法是在程序結(jié)束前使用DOSDOS功能調(diào)用指令,如下所示:功能調(diào)用指令,如下所示: MOV AXMOV AX,4C00H 4C00H INT 21H INT 21H (5) (5)全部源程序用全部源程序用ENDEND語句結(jié)尾,語句結(jié)尾,ENDEND后面可以加上程序執(zhí)

7、行起始的名稱后面可以加上程序執(zhí)行起始的名稱STARTSTART,匯編程序遇見,匯編程序遇見ENDEND語句就結(jié)束。語句就結(jié)束。4.1 4.1 匯編語言程序格式匯編語言程序格式 80868086系統(tǒng)中常用的匯編程序是系統(tǒng)中常用的匯編程序是MASM6.XMASM6.X版本,版本,MASMMASM中可使用的語句分成兩類:中可使用的語句分成兩類:指令性語句和偽指令語句。指令性語句和偽指令語句。一、指令性語句一、指令性語句 指令性語句與機器指令相對應,匯編程序可將它翻譯成目標代碼指令性語句與機器指令相對應,匯編程序可將它翻譯成目標代碼( (機器指令機器指令代碼代碼) )。語句格式為:。語句格式為:標號:

8、指令助記符標號:指令助記符 操作數(shù),操作數(shù)操作數(shù),操作數(shù) ;注釋;注釋 標號表示本指令語句的符號地址,標號后面必須緊跟冒號標號表示本指令語句的符號地址,標號后面必須緊跟冒號“:”。 指令助記符是該語句的指令名稱的代表符號,它指出指令的操作類型,匯編指令助記符是該語句的指令名稱的代表符號,它指出指令的操作類型,匯編程序?qū)⑵浞g成機器指令。它是語句中的關(guān)鍵字,因此不可省略。程序?qū)⑵浞g成機器指令。它是語句中的關(guān)鍵字,因此不可省略。 操作數(shù)表示參加本指令運算的數(shù)據(jù),根據(jù)指令要求可以有一個或多個操作數(shù),操作數(shù)表示參加本指令運算的數(shù)據(jù),根據(jù)指令要求可以有一個或多個操作數(shù),有的指令不需要操作數(shù),多個操作數(shù)

9、之間用逗號有的指令不需要操作數(shù),多個操作數(shù)之間用逗號“,”隔開,操作數(shù)與指令助記隔開,操作數(shù)與指令助記符之間用空格隔開。操作數(shù)可以是常數(shù)、變量、標號、寄存器名或表達式。符之間用空格隔開。操作數(shù)可以是常數(shù)、變量、標號、寄存器名或表達式。二、偽指令語句二、偽指令語句 偽指令語句沒有對應的機器指令,匯編程序匯編源程序時對偽指令進行處理,偽指令語句沒有對應的機器指令,匯編程序匯編源程序時對偽指令進行處理,它可完成數(shù)據(jù)定義,存儲區(qū)分配,段定義,段分配,指示程序結(jié)束等功能。偽指它可完成數(shù)據(jù)定義,存儲區(qū)分配,段定義,段分配,指示程序結(jié)束等功能。偽指令語句的格式為:令語句的格式為: 名字名字 偽指令指示符偽指

10、令指示符 操作數(shù),操作數(shù)操作數(shù),操作數(shù) ;注釋;注釋 名字是給偽指令取的名稱,它用符號地址表示,名字后不允許帶冒號名字是給偽指令取的名稱,它用符號地址表示,名字后不允許帶冒號“:”,名字可以省略。偽指令中的名字通常是變量名、段名、過程名、符號名等。名字可以省略。偽指令中的名字通常是變量名、段名、過程名、符號名等。 偽指令指示符是匯編程序偽指令指示符是匯編程序MASMMASM規(guī)定的符號,常用的有變量定義語句規(guī)定的符號,常用的有變量定義語句(DB(DB、DW)DW),符號定義語句符號定義語句(EQU(EQU、) ),段定義語句,段定義語句(SEGMENT.ENDS)(SEGMENT.ENDS),段

11、分配語句,段分配語句(ASSUME)(ASSUME),結(jié)構(gòu)定義語句結(jié)構(gòu)定義語句(STURC.ENDS)(STURC.ENDS),過程定義語句,過程定義語句(PROR.ENDP)(PROR.ENDP)等類型,后面將詳?shù)阮愋?,后面將詳細說明。細說明。 操作數(shù)是由偽指令具體要求的,有的偽指令不允許帶操作數(shù),有的偽指令要操作數(shù)是由偽指令具體要求的,有的偽指令不允許帶操作數(shù),有的偽指令要求帶多個操作數(shù),多個操作數(shù)之間必須用逗號分開。操作數(shù)可以是常數(shù)、變量、求帶多個操作數(shù),多個操作數(shù)之間必須用逗號分開。操作數(shù)可以是常數(shù)、變量、字符串、表達式等。字符串、表達式等。三、數(shù)據(jù)項三、數(shù)據(jù)項 匯編語言中使用的操作數(shù)

12、,可以是常數(shù),寄存器、存儲器、變量、標號或匯編語言中使用的操作數(shù),可以是常數(shù),寄存器、存儲器、變量、標號或表達式,其中常數(shù)、變量和標號是三種基本數(shù)據(jù)項。表達式,其中常數(shù)、變量和標號是三種基本數(shù)據(jù)項。1 1常數(shù)常數(shù) 常數(shù)必須是固定值,沒有屬性,是確定的數(shù)據(jù)。常數(shù)必須是固定值,沒有屬性,是確定的數(shù)據(jù)。2 2變量變量 變量通常指存放在存儲單元中的值,在程序運行中是可以修改的。所有的變量通常指存放在存儲單元中的值,在程序運行中是可以修改的。所有的變量都具有三個屬性。變量都具有三個屬性。 (1)(1)段值段值(SEGMENT)(SEGMENT)指變量所在段的段基址。指變量所在段的段基址。 (2)(2)段

13、內(nèi)偏移地址段內(nèi)偏移地址(OFFSET)(OFFSET):指變量地址與所在段首地址之間的地址偏移字:指變量地址與所在段首地址之間的地址偏移字節(jié)數(shù)。節(jié)數(shù)。 (3)(3)類型類型(TYPE)(TYPE):變量的類型屬性指變量中每個元素所包含的字節(jié)數(shù),類型有:變量的類型屬性指變量中每個元素所包含的字節(jié)數(shù),類型有:字節(jié)變量字節(jié)變量(BYTE)(BYTE)、宇變量、宇變量(WORD)(WORD)及雙字變量及雙字變量(DWORD)(DWORD)等。等。3 3標號標號 標號是可執(zhí)行指令語句的地址的符號表示,它可作為轉(zhuǎn)移指令的目標操作標號是可執(zhí)行指令語句的地址的符號表示,它可作為轉(zhuǎn)移指令的目標操作數(shù),以確定程序

14、轉(zhuǎn)向的目標地址,它具有三個屬性。數(shù),以確定程序轉(zhuǎn)向的目標地址,它具有三個屬性。 (1)(1)段值段值(SEGMENT)(SEGMENT):標號所在段的段基址。:標號所在段的段基址。 (2) (2)段內(nèi)偏移地址段內(nèi)偏移地址(OFFSET)(OFFSET):標號地址與所在段的段首址之間的偏移地址字:標號地址與所在段的段首址之間的偏移地址字節(jié)數(shù)。節(jié)數(shù)。 (3)(3)類型類型(TYPE)(TYPE):標號的類型屬性指在轉(zhuǎn)移指令中標號可轉(zhuǎn)移的距離,也稱:標號的類型屬性指在轉(zhuǎn)移指令中標號可轉(zhuǎn)移的距離,也稱距離屬性。類型距離屬性。類型NEARNEAR,表示此標號為近標號,只能實現(xiàn)本代碼段內(nèi)轉(zhuǎn)移或調(diào)用,表示此

15、標號為近標號,只能實現(xiàn)本代碼段內(nèi)轉(zhuǎn)移或調(diào)用,類型類型FARFAR,表示此標號為遠標號,可以作為其它代碼段中的目標地址,實現(xiàn)段間,表示此標號為遠標號,可以作為其它代碼段中的目標地址,實現(xiàn)段間轉(zhuǎn)移或調(diào)用。若標號后面緊跟冒號,表示隱含此標號距離屬性為轉(zhuǎn)移或調(diào)用。若標號后面緊跟冒號,表示隱含此標號距離屬性為NEARNEAR,也可用偽,也可用偽指令將此屬性改為指令將此屬性改為FARFAR。4.2 MASM4.2 MASM中的表達式中的表達式一、算術(shù)運算符一、算術(shù)運算符 加、減、乘、除、加、減、乘、除、MODMOD、SHLSHL、SHRSHR。運算對象與運算結(jié)果都是整數(shù)。運算對象與運算結(jié)果都是整數(shù)。二、邏

16、輯運算符二、邏輯運算符 邏輯運算符包括邏輯運算符包括AND(AND(與與) )、OR(OR(或或) )、NOT(NOT(非非) ),XOR(XOR(異或異或)4)4種,邏輯運算符是種,邏輯運算符是按位運算的,只能對常數(shù)進行運算,得到結(jié)果也是常數(shù)。按位運算的,只能對常數(shù)進行運算,得到結(jié)果也是常數(shù)。三、關(guān)系運算符三、關(guān)系運算符 關(guān)系運算符包括關(guān)系運算符包括EQ(EQ(相等相等) )、NE(NE(不等不等) )、LT(LT(小于小于) )、GT(GT(大于大于) )、LE(LE(小于或等小于或等于于) )、GE(GE(大于或等于大于或等于)6)6種。種。 關(guān)系運算符的兩個操作數(shù)必須是數(shù)據(jù),或是同一段

17、內(nèi)的兩個存儲單元的地址。關(guān)系運算符的兩個操作數(shù)必須是數(shù)據(jù),或是同一段內(nèi)的兩個存儲單元的地址。進行關(guān)系運算的比較操作后,結(jié)果是一個數(shù)值,若結(jié)果為真,輸出全是進行關(guān)系運算的比較操作后,結(jié)果是一個數(shù)值,若結(jié)果為真,輸出全是l l,即,即0FFH0FFH或或0FFFFH0FFFFH。若結(jié)果為假,輸出全是。若結(jié)果為假,輸出全是0 0。關(guān)系運算符一般與邏輯運算符組合起來。關(guān)系運算符一般與邏輯運算符組合起來使用。使用。 四、數(shù)值返回運算符四、數(shù)值返回運算符1 1OFFSETOFFSET格式:格式:OFFSETOFFSET變量或標號變量或標號OFFSETOFFSET返回標號或變量的偏移地址值。返回標號或變量的

18、偏移地址值。 2 2SEGSEG格式:格式:SEGSEG變量或標號變量或標號SEGSEG用來取變量或標號的段基值。用來取變量或標號的段基值。 3 3TYPETYPE格式:格式:TYPE TYPE 變量或標號變量或標號TYPETYPE加在變量前,返回變量的類型屬性,加在變量前,返回變量的類型屬性,TYPETYPE加在標號前,返回標號的距離屬性。加在標號前,返回標號的距離屬性。4 4LENGTHLENGTH格式:格式:LENGTH LENGTH 變量變量當變量中使用當變量中使用DUPDUP時,時,LENGTHLENGTH返回此變量所包含的單元數(shù),對其它變量則返回返回此變量所包含的單元數(shù),對其它變量

19、則返回1 1。 5.SIZE5.SIZE格式格式:SIZE:SIZE變量變量SIZESIZE運算符加在變量前,返回該變量包含的總字節(jié)數(shù)。運算符加在變量前,返回該變量包含的總字節(jié)數(shù)。SIZESIZELENGTHLENGTHTYPETYPE 五、修改屬性運算符五、修改屬性運算符1.1.段操作符段操作符 格式:段前綴:變量或地址表達式格式:段前綴:變量或地址表達式 段前綴有段寄存器段前綴有段寄存器CSCS、DSDS、ESES、SSSS后跟冒號后跟冒號“:”,用來表示某個變量或,用來表示某個變量或地址被修改到哪個段寄存器提供的段基址中。地址被修改到哪個段寄存器提供的段基址中。2 2PTRPTR 格式:

20、類型格式:類型/ /距離距離 PTR PTR 變量或標號變量或標號 其功能是將其功能是將PTRPTR左邊的類屬性賦給右邊的變量或標號。左邊的類屬性賦給右邊的變量或標號。PTRPTR本身并不分配存儲本身并不分配存儲單元,僅給已分配的存儲單元賦予新的屬性,以保證運算時操作數(shù)類型的匹配,單元,僅給已分配的存儲單元賦予新的屬性,以保證運算時操作數(shù)類型的匹配,常與類型常與類型BYTEBYTE、WORDWORD、NEARNEAR、FARFAR等連用。等連用。3 3THISTHIS 格式:變量格式:變量/ /標號標號 EQU THIS EQU THIS 類型類型/ /距離距離 THIS THIS的功能是將的

21、功能是將EQU THISEQU THIS右邊的類型右邊的類型/ /距離屬性,賦給左邊的變量距離屬性,賦給左邊的變量/ /標號,該標號,該變量或標號的段地址和偏移地址與下一個存儲單元的地址相同。變量或標號的段地址和偏移地址與下一個存儲單元的地址相同。4 4SHORTSHORT 格式:格式:SHORTSHORT標號標號 SHORTSHORT用來說明轉(zhuǎn)移類指令中轉(zhuǎn)向地址的屬性,指出轉(zhuǎn)向的目標地址與本指令用來說明轉(zhuǎn)移類指令中轉(zhuǎn)向地址的屬性,指出轉(zhuǎn)向的目標地址與本指令之間的距離在之間的距離在128128127127之間,即限制在短轉(zhuǎn)移范圍內(nèi)。之間,即限制在短轉(zhuǎn)移范圍內(nèi)。5 5HIGHHIGH和和LOWL

22、OW 格式:格式:H1GH/LOWH1GH/LOW變量或標號變量或標號 HIGHHIGH和和LOWLOW稱為字節(jié)分離運算符,對一個數(shù)或地址表達式,稱為字節(jié)分離運算符,對一個數(shù)或地址表達式,HIGHHIGH從中分離出從中分離出高位字節(jié),高位字節(jié),LOWLOW分離出低位字節(jié)。分離出低位字節(jié)。 六、其它運算符六、其它運算符1 1圓括號圓括號( ) ( ) 圓括號用來改變運算符的優(yōu)先級別,圓括號用來改變運算符的優(yōu)先級別,( )( )中的運算符具有最高優(yōu)先權(quán)。中的運算符具有最高優(yōu)先權(quán)。2 2方括號方括號 方括號主要用來表示地址表達式或多重變量的下標值。方括號主要用來表示地址表達式或多重變量的下標值。3

23、3尖括號尖括號,及圓點,及圓點運算符在結(jié)構(gòu)中專用,表示結(jié)構(gòu)中的變量在預置結(jié)構(gòu)付本時是否修改,修運算符在結(jié)構(gòu)中專用,表示結(jié)構(gòu)中的變量在預置結(jié)構(gòu)付本時是否修改,修改成什么數(shù)值。改成什么數(shù)值。運算符在結(jié)構(gòu)中專用,表示結(jié)構(gòu)付本名與變量名連接在一起,作為預置的結(jié)運算符在結(jié)構(gòu)中專用,表示結(jié)構(gòu)付本名與變量名連接在一起,作為預置的結(jié)構(gòu)付本中的各個變量。構(gòu)付本中的各個變量。4 4MASKMASK和和WIDTHWIDTHMASKMASK與與WIDTHWIDTH運算符在記錄中專用。運算符在記錄中專用。WIDTHWIDTH為記錄名為記錄名/ /字段名,運算后返回數(shù)值表示指定記錄或字段的位的長度。字段名,運算后返回數(shù)值

24、表示指定記錄或字段的位的長度。MASKMASK為字段名,返回數(shù)值為為字段名,返回數(shù)值為8 8位位/16/16位二進制數(shù),對應指定字段的各位置位二進制數(shù),對應指定字段的各位置“1”1”,其它位置其它位置“0”0”。 七、優(yōu)先級七、優(yōu)先級4.3 4.3 偽指令語句偽指令語句一、數(shù)據(jù)定義語句一、數(shù)據(jù)定義語句格式格式1 1:變量名:變量名 助記符助記符 操作數(shù),操作數(shù)操作數(shù),操作數(shù) ;注釋;注釋格式格式2 2:變量名:變量名 助記符助記符 n DUP(n DUP(操作數(shù),操作數(shù)操作數(shù),操作數(shù)) ) ;注釋;注釋功能:將操作數(shù)存入變量名指定的存儲單元中,或者只分配存儲空間不存入數(shù)功能:將操作數(shù)存入變量名

25、指定的存儲單元中,或者只分配存儲空間不存入數(shù)據(jù)。據(jù)。 變量名變量名它用符號表示,可以省略,作用與指令語句中的標號相同,但后面不它用符號表示,可以省略,作用與指令語句中的標號相同,但后面不跟冒號。匯編程序匯編時將此變量的助記符后的第一個字節(jié)的偏移地址作為它的跟冒號。匯編程序匯編時將此變量的助記符后的第一個字節(jié)的偏移地址作為它的符號地址。符號地址。助記符助記符所用偽指令助記符主要有:所用偽指令助記符主要有: DBDB:用來定義字節(jié),表示每個操作數(shù)占用一個字節(jié)。:用來定義字節(jié),表示每個操作數(shù)占用一個字節(jié)。 DWDW;用來定義字,表示每個操作數(shù)占用一個字。;用來定義字,表示每個操作數(shù)占用一個字。 DD

26、DD:用來定義雙字,表示每個操作數(shù)占用兩個字。:用來定義雙字,表示每個操作數(shù)占用兩個字。 DQDQ:用來定義四個字,表示每個操作數(shù)占用四個字。:用來定義四個字,表示每個操作數(shù)占用四個字。 DTDT:用來定義十個字節(jié),表示每個操作數(shù)占用十個字節(jié)。:用來定義十個字節(jié),表示每個操作數(shù)占用十個字節(jié)。 二、表達式賦值語句二、表達式賦值語句表達式賦值語句有兩種,賦值語句表達式賦值語句有兩種,賦值語句EQUEQU和等號語句,它們均不占用內(nèi)存。和等號語句,它們均不占用內(nèi)存。1 1賦值語句賦值語句EQUEQU 格式:符號名格式:符號名 EQU EQU 表達式表達式 功能:用來給變量,標號,常數(shù),指令,表達式等定

27、義一個符號名,程序中功能:用來給變量,標號,常數(shù),指令,表達式等定義一個符號名,程序中用到用到EQUEQU左邊的變量、標號時可用右邊的常數(shù)值或表達式代替,但一經(jīng)定義在同一左邊的變量、標號時可用右邊的常數(shù)值或表達式代替,但一經(jīng)定義在同一個程序模塊中不能重新定義。個程序模塊中不能重新定義。2 2等號語句等號語句 等號語句等號語句“”與與EQUEQU語句具有相同功能,區(qū)別僅在于語句具有相同功能,區(qū)別僅在于EQUEQU中左邊的標號不中左邊的標號不允許重新定義,而用允許重新定義,而用“”定義的語句允許重復定義。定義的語句允許重復定義。三、段定義語句三、段定義語句1.1.段定義語句段定義語句SEGMENT

28、ENDSSEGMENTENDS 格式格式: : 段名段名 SEGMENT SEGMENT 定位類型定位類型 組合類型組合類型 分類名分類名 邏輯段內(nèi)容邏輯段內(nèi)容 段名段名 ENDSENDS 功能:將一個邏輯段定義成一個整體。功能:將一個邏輯段定義成一個整體。 段定義語句中的參數(shù)設置,可以增強偽指令語句的功能。段定義語句允許嵌套段定義語句中的參數(shù)設置,可以增強偽指令語句的功能。段定義語句允許嵌套設置,即一個邏輯段內(nèi)再設置其它邏輯段,但不允許各個邏輯段相互交叉設置。設置,即一個邏輯段內(nèi)再設置其它邏輯段,但不允許各個邏輯段相互交叉設置。2.2.段分配語句段分配語句(ASSUME)(ASSUME) 在

29、在8086/80888086/8088系統(tǒng)中存儲器采用分段結(jié)構(gòu),各段容量系統(tǒng)中存儲器采用分段結(jié)構(gòu),各段容量64KB64KB,用戶可以設置,用戶可以設置多個邏輯段,但只允許多個邏輯段,但只允許4 4個邏輯段同時有效,段分配語句用來完成將邏輯段分別個邏輯段同時有效,段分配語句用來完成將邏輯段分別定義成代碼段,數(shù)據(jù)段,堆棧段及附加段。定義成代碼段,數(shù)據(jù)段,堆棧段及附加段。格式:格式:ASSUME CSASSUME CS:段名,:段名,DSDS:段名,:段名,SSSS:段名,:段名,ESES:段名:段名 功能:定義功能:定義4 4個邏輯段,指明段與段寄存器的關(guān)系。個邏輯段,指明段與段寄存器的關(guān)系。AS

30、SUME NOTHING ASSUME NOTHING 可以取消前面由可以取消前面由ASSUMEASSUME所指定的段寄存器。所指定的段寄存器。例:兩個例:兩個1616位無符號二進制數(shù)相乘。位無符號二進制數(shù)相乘。DATA SEGMENTDATA SEGMENT D1 DW 1234H D1 DW 1234H D2 DW 5678H D2 DW 5678H P1 DD ? P1 DD ? P2 DD ? P2 DD ?DATA ENDSDATA ENDSSTACK SEGMENT STACK STACKSTACK SEGMENT STACK STACK DW 100 DUP(?) DW 100

31、DUP(?)STACK ENDSSTACK ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARMAIN PROC FARSTART:MOV AX,STACKSTART:MOV AX,STACK MOV SS,AX MOV SS,AX PUSH DS PUSH DS SUB AX,AX SUB AX,AX PUSH AX PUSH AX MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX L1: MOV

32、 AX,D1 L1: MOV AX,D1 MUL D2 MUL D2 MOV BX,OFFSET P1 MOV BX,OFFSET P1 MOV BX,AX MOV BX,AX MOV BX+2,DX MOV BX+2,DX RET RETMAIN ENDPMAIN ENDPCODE ENDSCODE ENDS END START END START四、過程定義語句四、過程定義語句 過程也稱作子程序。在主程序中,經(jīng)常要用到一些程序段,程序段的功能過程也稱作子程序。在主程序中,經(jīng)常要用到一些程序段,程序段的功能和結(jié)構(gòu)相同,僅有一些變量賦值不同,此時可以將這些程序段獨立編寫,用過和結(jié)構(gòu)相同,僅有一

33、些變量賦值不同,此時可以將這些程序段獨立編寫,用過程定義語句進行定義,然后在主程序中對它進行過程調(diào)用。程定義語句進行定義,然后在主程序中對它進行過程調(diào)用。 格式:過程名格式:過程名 PROC PROC 屬性屬性 過程內(nèi)容過程內(nèi)容 RET NRET N 過程名過程名 ENDPENDP 功能:定義一個過程,主程序可以用功能:定義一個過程,主程序可以用CALLCALL指令調(diào)用它。指令調(diào)用它。 過程名過程名是給所定義的過程取的名字,不可缺省。它是主程序調(diào)用是給所定義的過程取的名字,不可缺省。它是主程序調(diào)用(CALL(CALL指令指令) )的目標操作數(shù),即子程序人口的符號地址。像標號一樣過程名具有三種屬

34、的目標操作數(shù),即子程序人口的符號地址。像標號一樣過程名具有三種屬性:性: 段屬性:為該過程所在段的段基址。段屬性:為該過程所在段的段基址。 偏移地址屬性:指該過程第一個字節(jié)與段首址之間距離字節(jié)。偏移地址屬性:指該過程第一個字節(jié)與段首址之間距離字節(jié)。 距離屬性為:距離屬性為:NEARNEAR或或FARFAR。格式中的屬性就指距離屬性,定義。格式中的屬性就指距離屬性,定義NEARNEAR允許過程允許過程在段內(nèi)調(diào)用,定義在段內(nèi)調(diào)用,定義FARFAR允許過程在段間調(diào)用,允許過程在段間調(diào)用,NEARNEAR為缺省使用。為缺省使用。 五、程序開始和結(jié)束語句五、程序開始和結(jié)束語句1.NAME1.NAME 格

35、式:格式:NAME NAME 程序名程序名 功能:為源程序目標模塊賦名字。功能:為源程序目標模塊賦名字。 NAMENAME為偽指令助記符,放在程序開始,在輸出匯編語言源程序的列表文為偽指令助記符,放在程序開始,在輸出匯編語言源程序的列表文件時,將在每一頁的開頭打印出該程序名。若源程序中省略件時,將在每一頁的開頭打印出該程序名。若源程序中省略NAMENAME偽指令,匯編程偽指令,匯編程序?qū)⒃次募髂繕四K的名字。序?qū)⒃次募髂繕四K的名字。 2.ORG2.ORG 格式:格式:ORG ORG 表達式表達式 功能:給匯編程序設置位置指針,指定下面語句的起始偏移地址功能:給匯編程序設置位置指針,指

36、定下面語句的起始偏移地址 ORGORG是偽指令助記符,不可缺省。是偽指令助記符,不可缺省。 表達式表達式給定的偏移地址值,表達式的計算結(jié)果必須是正整數(shù)。一般情給定的偏移地址值,表達式的計算結(jié)果必須是正整數(shù)。一般情況下段定義語句指出了段的起點,偏移地址為況下段定義語句指出了段的起點,偏移地址為0 0,段內(nèi)各個語句或數(shù)據(jù)的地址由,段內(nèi)各個語句或數(shù)據(jù)的地址由段地址開始依次類推可確定。當用戶要求指定某條指令或數(shù)據(jù)為某個指定地址時,段地址開始依次類推可確定。當用戶要求指定某條指令或數(shù)據(jù)為某個指定地址時,可用可用ORGORG語句來改變,語句來改變,ORGORG語句可以放在程序的任何位置。語句可以放在程序的

37、任何位置。 3.END3.END 格式:格式:END END 標號名標號名 功能:標記匯編源程序結(jié)束。功能:標記匯編源程序結(jié)束。 ENDEND是偽指令助記符,不可缺省,放在源程序的最后一行,每個模塊只是偽指令助記符,不可缺省,放在源程序的最后一行,每個模塊只有一個有一個ENDEND,匯編程序到,匯編程序到ENDEND語句停止匯編。語句停止匯編。 標號名標號名是該程序中第一條可執(zhí)行語句的標號名,可以缺省,若一個程是該程序中第一條可執(zhí)行語句的標號名,可以缺省,若一個程序包含多個模塊,序包含多個模塊,ENDEND后面帶的標號為主程序模塊中的標號名稱。后面帶的標號為主程序模塊中的標號名稱。 六、結(jié)構(gòu)定

38、義語句六、結(jié)構(gòu)定義語句1.1.結(jié)構(gòu)定義結(jié)構(gòu)定義 格式:結(jié)構(gòu)名格式:結(jié)構(gòu)名 STRUCSTRUC ( (用用DBDB,DWDW,DDDD等語句定義結(jié)構(gòu)中數(shù)據(jù)變量等語句定義結(jié)構(gòu)中數(shù)據(jù)變量) ) 結(jié)構(gòu)名結(jié)構(gòu)名 ENDSENDS 功能功能: :結(jié)構(gòu)定義語句可以把各種不同類型的數(shù)據(jù)放在同一個數(shù)據(jù)結(jié)構(gòu)中,便結(jié)構(gòu)定義語句可以把各種不同類型的數(shù)據(jù)放在同一個數(shù)據(jù)結(jié)構(gòu)中,便于某些數(shù)據(jù)處理的需要。于某些數(shù)據(jù)處理的需要。 結(jié)構(gòu)名結(jié)構(gòu)名結(jié)構(gòu)定義的名稱結(jié)構(gòu)定義的名稱, ,不可缺省,在不可缺省,在STRUCSTRUC與與ENDSENDS前的結(jié)構(gòu)名要相同,前的結(jié)構(gòu)名要相同,不允許超前引用。不允許超前引用。 STRUCENDS

39、STRUCENDS結(jié)構(gòu)定義偽指令助記符,不可缺省,必須成對出現(xiàn)。結(jié)構(gòu)定義偽指令助記符,不可缺省,必須成對出現(xiàn)。 結(jié)構(gòu)中數(shù)據(jù)變量用結(jié)構(gòu)中數(shù)據(jù)變量用DBDB,DWDW,DDDD等變量定義語句進行定義,定義后的結(jié)構(gòu)未分等變量定義語句進行定義,定義后的結(jié)構(gòu)未分配存儲空間,結(jié)構(gòu)中各個變量具有各自的局部偏移量,它是指各變量的第一字節(jié)配存儲空間,結(jié)構(gòu)中各個變量具有各自的局部偏移量,它是指各變量的第一字節(jié)與結(jié)構(gòu)起始地址之間的字節(jié)距離。它們的類型屬性取決于所采用的變量定義語句。與結(jié)構(gòu)起始地址之間的字節(jié)距離。它們的類型屬性取決于所采用的變量定義語句。只有在結(jié)構(gòu)被預置后,才有確定的存儲單元位置。只有在結(jié)構(gòu)被預置后,

40、才有確定的存儲單元位置。2 2結(jié)構(gòu)付本預置結(jié)構(gòu)付本預置 結(jié)構(gòu)定義后,在匯編過程中不產(chǎn)生目標代碼,也不分配存儲空間,必須先預結(jié)構(gòu)定義后,在匯編過程中不產(chǎn)生目標代碼,也不分配存儲空間,必須先預置結(jié)構(gòu)付本,匯編程序給每個結(jié)構(gòu)付本分配存儲空間置結(jié)構(gòu)付本,匯編程序給每個結(jié)構(gòu)付本分配存儲空間, ,此時結(jié)構(gòu)中的變量才與存此時結(jié)構(gòu)中的變量才與存儲單元發(fā)生關(guān)聯(lián)。結(jié)構(gòu)中允許修改的變量在不同的結(jié)構(gòu)付本中可被修改成不同的儲單元發(fā)生關(guān)聯(lián)。結(jié)構(gòu)中允許修改的變量在不同的結(jié)構(gòu)付本中可被修改成不同的數(shù)值。數(shù)值。 預置結(jié)構(gòu)付本的格式有如下兩種。預置結(jié)構(gòu)付本的格式有如下兩種。 格式格式1 1:結(jié)構(gòu)付本名:結(jié)構(gòu)付本名 結(jié)構(gòu)名結(jié)構(gòu)名

41、;注釋;注釋 格式格式2 2:結(jié)構(gòu)付本名:結(jié)構(gòu)付本名 結(jié)構(gòu)名結(jié)構(gòu)名 N DUP (N DUP () ) ;注釋;注釋 結(jié)構(gòu)付本名結(jié)構(gòu)付本名是給所預置的結(jié)構(gòu)付本起的名字,可以缺省。是給所預置的結(jié)構(gòu)付本起的名字,可以缺省。 結(jié)構(gòu)名結(jié)構(gòu)名與結(jié)構(gòu)定義時的結(jié)構(gòu)名相同,不可缺省。與結(jié)構(gòu)定義時的結(jié)構(gòu)名相同,不可缺省。 尖括號尖括號為專用運算符,表示在預置付本時,結(jié)構(gòu)中的變量改成什么值,為專用運算符,表示在預置付本時,結(jié)構(gòu)中的變量改成什么值,也可以不進行修改。也可以不進行修改。 尖括號中的元素值,可以缺省,表示此結(jié)構(gòu)付本對原結(jié)構(gòu)中的所有變量不進尖括號中的元素值,可以缺省,表示此結(jié)構(gòu)付本對原結(jié)構(gòu)中的所有變量不進

42、行修改。若有多個元素值,它們之間用逗號分開,對不修改的變量用逗號表示,行修改。若有多個元素值,它們之間用逗號分開,對不修改的變量用逗號表示,修改的元素值用修改量代替,其后序變量保持不變時,可不再寫元素值。修改的元素值用修改量代替,其后序變量保持不變時,可不再寫元素值。 若用第二種格式預置結(jié)構(gòu)付本,若用第二種格式預置結(jié)構(gòu)付本,N N表示需要預置相同的結(jié)構(gòu)付本的個數(shù)。表示需要預置相同的結(jié)構(gòu)付本的個數(shù)。七、外部偽指令和對準偽指令七、外部偽指令和對準偽指令 1 1外部偽指令外部偽指令 程序中包含多個模塊時,有些程序或數(shù)據(jù)在各個模塊間要相互共享,可用外程序中包含多個模塊時,有些程序或數(shù)據(jù)在各個模塊間要相

43、互共享,可用外部偽指令部偽指令PUBLICPUBLIC和和EXTRNEXTRN來實現(xiàn)此功能。其中來實現(xiàn)此功能。其中PUBLICPUBLIC用來定義共享模塊,用來定義共享模塊,EXTRNEXTRN用用來調(diào)用共享模塊。來調(diào)用共享模塊。格式:格式: PUBLIC PUBLIC 名稱,名稱,名稱,名稱, ;注釋;注釋 EXTRN EXTRN 名稱:類型,名稱:類型,名稱:類型,名稱:類型, ;注釋;注釋 2 2對準偽指令對準偽指令格式:格式:EVENEVEN功能:功能:EVENEVEN偽指令使下一語句的地址調(diào)整為偶地址。偽指令使下一語句的地址調(diào)整為偶地址。EVENEVEN直接放在某一語句前,匯編程序匯

44、編時就會完成將地址調(diào)整在偶地址上。直接放在某一語句前,匯編程序匯編時就會完成將地址調(diào)整在偶地址上。地址計數(shù)器的值地址計數(shù)器的值$表示當前正在匯編的指令的地址表示當前正在匯編的指令的地址 。3.LABEL3.LABEL LABEL LABEL偽指令給已定義的變量或標號取另一個名字,并可重新定義它的類偽指令給已定義的變量或標號取另一個名字,并可重新定義它的類型屬性,使同一變量或標號在不同地方被引用時,可采用不同的名字,具有型屬性,使同一變量或標號在不同地方被引用時,可采用不同的名字,具有不同的類型屬性,這樣提高了程序的靈活性。不同的類型屬性,這樣提高了程序的靈活性。 格式:名稱格式:名稱 LABE

45、L LABEL 類型屬性類型屬性 名稱名稱為為LABELLABEL語句下一行所使用的語句中的變量或標號取的別名。語句下一行所使用的語句中的變量或標號取的別名。 LABELLABEL偽指令助記符,不可缺省。偽指令助記符,不可缺省。 類型屬性類型屬性規(guī)定了所起別名的變量或標號的類型,此別名與原變量標規(guī)定了所起別名的變量或標號的類型,此別名與原變量標號具有相同的段基址及偏移地址。號具有相同的段基址及偏移地址。八、八、 高檔微機增加的偽指令高檔微機增加的偽指令模型方式的基本格式如下;模型方式的基本格式如下; MODEL SMALL MODEL SMALL ;存儲格式偽指令;存儲格式偽指令 STACK

46、STACK ;堆棧段定義;堆棧段定義 DATADATA . . ;數(shù)據(jù)定義;數(shù)據(jù)定義 CODECODE STARTUP STARTUP ;程序開始偽指令;程序開始偽指令 . . ;程序代碼;程序代碼 EXIT 0 EXIT 0 ;程序結(jié)束偽指令;程序結(jié)束偽指令 . . ;子程序代碼;子程序代碼 END END ;匯編結(jié)束偽指令;匯編結(jié)束偽指令 4.4 DOS4.4 DOS系統(tǒng)功能調(diào)用和系統(tǒng)功能調(diào)用和BIOSBIOS中斷調(diào)用中斷調(diào)用一、一、DOSDOS功能調(diào)用功能調(diào)用 DOSDOS系統(tǒng)功能調(diào)用分別實現(xiàn)設備管理、文件讀寫、文件管理和目錄管理等系統(tǒng)功能調(diào)用分別實現(xiàn)設備管理、文件讀寫、文件管理和目錄管

47、理等功能。每個子程序?qū)粋€功能號,所有的系統(tǒng)功能調(diào)用的格式是一致的,按功能。每個子程序?qū)粋€功能號,所有的系統(tǒng)功能調(diào)用的格式是一致的,按下面下面4 4步進行:步進行: (1) (1)系統(tǒng)功能號送到系統(tǒng)功能號送到AHAH寄存器中;寄存器中; (2)(2)入口參數(shù)送到指定寄存器中;入口參數(shù)送到指定寄存器中; (3)(3)用用1NT 21H1NT 21H指令執(zhí)行功能調(diào)用;指令執(zhí)行功能調(diào)用; (4)(4)根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況。根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況。 有些系統(tǒng)功能調(diào)用比較簡單,不需要設置人口參數(shù)或者沒有出口參數(shù)。有些系統(tǒng)功能調(diào)用比較簡單,不需要設置人口參數(shù)或者沒有出口參數(shù)。D

48、OSDOS系統(tǒng)功能調(diào)用的功能及入口系統(tǒng)功能調(diào)用的功能及入口/ /出口參數(shù)表,詳細見附錄出口參數(shù)表,詳細見附錄F F。1.DOS1.DOS鍵盤功能調(diào)用鍵盤功能調(diào)用 例例: : 開辟一個緩沖區(qū),從鍵盤輸入一個字符串,將輸入的字符數(shù)開辟一個緩沖區(qū),從鍵盤輸入一個字符串,將輸入的字符數(shù)CLCL寄存器寄存器, ,并并將指針指向字符串的第一個字符。將指針指向字符串的第一個字符。 BUFF DB 100BUFF DB 100 DB ? DB ? DB 100 DUP(?) DB 100 DUP(?)MOV AX,DATAMOV AX,DATAMOV DS,AXMOV DS,AXMOV DX,OFFSET B

49、UFFMOV DX,OFFSET BUFFMOV AH,0AHMOV AH,0AHINT 21HINT 21HMOV BX,DXMOV BX,DXMOV CL,BX+1MOV CL,BX+1ADD DX,2ADD DX,22.DOS2.DOS顯示功能調(diào)用顯示功能調(diào)用3.DOS3.DOS打印功能調(diào)用打印功能調(diào)用 5 5號功能調(diào)用完成將號功能調(diào)用完成將DLDL寄存器中的字符送到打印機,若需要回車換行,也寄存器中的字符送到打印機,若需要回車換行,也同樣將回車換行的字符碼送到同樣將回車換行的字符碼送到DLDL寄存器。寄存器。4.4.日期與時間設置日期與時間設置 5.5.異步通訊異步通訊6.6.返回操作

50、系統(tǒng)返回操作系統(tǒng) 4CH4CH功能調(diào)用能夠結(jié)束當前正在執(zhí)行的程序,返回操作系統(tǒng),屏幕顯示操作功能調(diào)用能夠結(jié)束當前正在執(zhí)行的程序,返回操作系統(tǒng),屏幕顯示操作提示符。提示符。 MOV AHMOV AH,4CH4CH INT 21H INT 21H 此功能調(diào)用無入口參數(shù)。此功能調(diào)用無入口參數(shù)。 二、二、BIOSBIOS中斷調(diào)用中斷調(diào)用 駐留在駐留在ROMROM中的中的BI0SBI0S提供了系統(tǒng)加電自檢,引導裝入提供了系統(tǒng)加電自檢,引導裝入I/0I/0設備的處理程序及接設備的處理程序及接口控制等功能模塊來處理所有的系統(tǒng)中斷。與口控制等功能模塊來處理所有的系統(tǒng)中斷。與DOSDOS功能調(diào)用相同,用戶可以直

51、接功能調(diào)用相同,用戶可以直接用指令設置參數(shù),然后中斷調(diào)用用指令設置參數(shù),然后中斷調(diào)用BIOSBIOS中的程序。中的程序。 4.5 4.5 程序設計方法程序設計方法 一般來說設計匯編語言源程序的基本步驟如下:一般來說設計匯編語言源程序的基本步驟如下:(1)(1)分析問題,抽象出描述問題的數(shù)學模型,并確定實現(xiàn)數(shù)學模型的算法。分析問題,抽象出描述問題的數(shù)學模型,并確定實現(xiàn)數(shù)學模型的算法。(2)(2)繪制程序流程圖,通常先畫粗框圖,在結(jié)構(gòu)模塊中再畫細框圖??驁D一般有起繪制程序流程圖,通常先畫粗框圖,在結(jié)構(gòu)模塊中再畫細框圖??驁D一般有起始框,執(zhí)行框,判斷框和終止框,如下圖示:始框,執(zhí)行框,判斷框和終止框

52、,如下圖示: (3)(3)分配存儲空間及工作單元。分配數(shù)據(jù)段,堆棧段,程序段各在內(nèi)存什么位置,分配存儲空間及工作單元。分配數(shù)據(jù)段,堆棧段,程序段各在內(nèi)存什么位置,各個寄存器主要做什么用。各個寄存器主要做什么用。(4)(4)按流程圖設計編寫程序。按流程圖設計編寫程序。(5)(5)靜態(tài)檢查,上機調(diào)試。靜態(tài)檢查,上機調(diào)試。( (一般分段調(diào)試較好一般分段調(diào)試較好) )(6)(6)程序運行,結(jié)果分析。程序運行,結(jié)果分析。 在進行匯編語言源程序設計時,通常用到四種程序結(jié)構(gòu):順序結(jié)構(gòu),分支在進行匯編語言源程序設計時,通常用到四種程序結(jié)構(gòu):順序結(jié)構(gòu),分支結(jié)構(gòu),循環(huán)結(jié)構(gòu),子程序結(jié)構(gòu)。結(jié)構(gòu),循環(huán)結(jié)構(gòu),子程序結(jié)構(gòu)。

53、 一、順序結(jié)構(gòu)一、順序結(jié)構(gòu) 順序結(jié)構(gòu)的程序一般是簡單程序,程序順序執(zhí)行,無分支,無循環(huán),也無轉(zhuǎn)順序結(jié)構(gòu)的程序一般是簡單程序,程序順序執(zhí)行,無分支,無循環(huán),也無轉(zhuǎn)移,圖中沒有判斷框。移,圖中沒有判斷框。 例:內(nèi)存中例:內(nèi)存中TABLETABLE開始存放開始存放0 09 9的平方值,通過人機對話,當任給定一個數(shù)的平方值,通過人機對話,當任給定一個數(shù)X(0X(09)9),查表得,查表得X X的平方值,放在的平方值,放在ALAL中。中。 MODEL SMALIMODEL SMALI 386386 STACK 100HSTACK 100H DATADATA TABLE DB 0 TABLE DB 0,1

54、 1,4 4,9 9,1616,2525,3636,4949,6464,8181 BUF DBP1ease input One number(09) BUF DBP1ease input One number(09):,0DH0DH,0AH0AH, $ CODE CODE STARTUP STARTUP ;說明程序起點,設置;說明程序起點,設置DS-SSDS-SS MOV DX MOV DX,OFFSEOFFSE丁丁BUF BUF ;9 9號功能調(diào)用,提示輸入一個數(shù)號功能調(diào)用,提示輸入一個數(shù) MOV AHMOV AH,9 9 INT 21H INT 21H MOV AH MOV AH,1 1

55、;1 1號功能調(diào)用,鍵人數(shù)送人號功能調(diào)用,鍵人數(shù)送人ALAL INT 21H INT 21H AND AL AND AL,0FH0FH MOV BX MOV BX,OFFSET TABLE OFFSET TABLE MOV AH MOV AH,0 0 ;查表得輸人數(shù)得平方值;查表得輸人數(shù)得平方值 ADD BXADD BX,AXAX MOV AL MOV AL,BX BX ;保存查表結(jié)果到;保存查表結(jié)果到ALAL EXIT 0EXIT 0 END END二、分支結(jié)構(gòu)二、分支結(jié)構(gòu)1.1.分支結(jié)構(gòu)分支結(jié)構(gòu) 一般情況下,程序順序執(zhí)行,但經(jīng)常要求程序根據(jù)不同條件選擇不同的處理一般情況下,程序順序執(zhí)行,但

56、經(jīng)常要求程序根據(jù)不同條件選擇不同的處理方法,這就需要用到分支結(jié)構(gòu),分支結(jié)構(gòu)如下圖所示。方法,這就需要用到分支結(jié)構(gòu),分支結(jié)構(gòu)如下圖所示。 2.2.多分支結(jié)構(gòu)多分支結(jié)構(gòu) 有的分支結(jié)構(gòu)為多分支,可以利用多個條件轉(zhuǎn)移指令來實現(xiàn),依次測試條件有的分支結(jié)構(gòu)為多分支,可以利用多個條件轉(zhuǎn)移指令來實現(xiàn),依次測試條件是否滿足,若滿足轉(zhuǎn)入相應分支人口,若不滿足繼續(xù)向下測試,直到全部測試完。是否滿足,若滿足轉(zhuǎn)入相應分支人口,若不滿足繼續(xù)向下測試,直到全部測試完。這種方法編程簡單,直觀,但運行速度慢,要依次檢查才能進入要求的人口。這種方法編程簡單,直觀,但運行速度慢,要依次檢查才能進入要求的人口。例:有例:有8 8個加

57、工子程序,人口地址分別為個加工子程序,人口地址分別為P1P1,P2P2,P8P8。編程實現(xiàn)檢測鍵盤輸入。編程實現(xiàn)檢測鍵盤輸入命令,使系統(tǒng)分別轉(zhuǎn)向命令,使系統(tǒng)分別轉(zhuǎn)向8 8個加工子程序。個加工子程序。 MOV AHMOV AH,1 1 INT 21H INT 21H ;1 1號功能調(diào)用,鍵盤接收號功能調(diào)用,鍵盤接收 CMP ALCMP AL,l l ;鍵值為;鍵值為1 1,轉(zhuǎn),轉(zhuǎn)1 1號加工子程序號加工子程序 JE PlJE Pl CMP AL CMP AL,2 2 ;鍵值為;鍵值為2 2,轉(zhuǎn),轉(zhuǎn)2 2號加工子程序號加工子程序 JE P2JE P2 CMP AL CMP AL,88 JE P8

58、JE P8 ;鍵值非;鍵值非1 18 8,轉(zhuǎn)向停止,轉(zhuǎn)向停止 JMP STJMP ST P1 P1: ;1 1號加工子程序號加工子程序 P8P8: ST ST: HLTHLT3.3.跳轉(zhuǎn)表實現(xiàn)多分跳轉(zhuǎn)表實現(xiàn)多分 利用跳轉(zhuǎn)表實現(xiàn)多分支,就克服了上面方法的缺點,可以直接找到相應人口。利用跳轉(zhuǎn)表實現(xiàn)多分支,就克服了上面方法的缺點,可以直接找到相應人口。利用這種方法要在存儲器中先建立一個跳轉(zhuǎn)表,表中包括每個分支的人口地址,利用這種方法要在存儲器中先建立一個跳轉(zhuǎn)表,表中包括每個分支的人口地址,跳轉(zhuǎn)指令或關(guān)鍵字,利用此表就可實現(xiàn)分支結(jié)構(gòu)。跳轉(zhuǎn)指令或關(guān)鍵字,利用此表就可實現(xiàn)分支結(jié)構(gòu)。(1)(1)根據(jù)表內(nèi)地址

59、分支根據(jù)表內(nèi)地址分支 跳轉(zhuǎn)表中存放了每個分支程序的人口地址,只要找到表地址,再將其中內(nèi)容跳轉(zhuǎn)表中存放了每個分支程序的人口地址,只要找到表地址,再將其中內(nèi)容取出,即可得到每個分支的人口地址。取出,即可得到每個分支的人口地址。 表地址跳轉(zhuǎn)表首地址表地址跳轉(zhuǎn)表首地址+ +偏移地址偏移地址 圖圖(a)(a)給出了跳轉(zhuǎn)表在內(nèi)存中的存放方法,圖給出了跳轉(zhuǎn)表在內(nèi)存中的存放方法,圖(b)(b)給出了按表地址分支的流程圖。給出了按表地址分支的流程圖。例:將上例中程序改成用跳轉(zhuǎn)表來實現(xiàn)例:將上例中程序改成用跳轉(zhuǎn)表來實現(xiàn) BASE DW P1BASE DW P1,P2P2,P3P3,P4 P4 ;定義跳轉(zhuǎn)表;定義跳

60、轉(zhuǎn)表 DW P5DW P5,P6P6,P7P7,P8P8 KEY DB KEY DB ? MOV AHMOV AH,1 1 ;鍵值在;鍵值在ALAL中中 INT 21HINT 21H AND AL AND AL,OFHOFH MOV BX MOV BX,OFFSET BASE OFFSET BASE ;取首地址;取首地址 MOV AHMOV AH,0 0 ADD AL ADD AL,ALAL ADD BX ADD BX,AX AX ;求表地址;求表地址 JMP WORD PTRBX JMP WORD PTRBX ;轉(zhuǎn)入相應入口地址;轉(zhuǎn)入相應入口地址 :(2)(2)根據(jù)表內(nèi)指令分支根據(jù)表內(nèi)指令分

溫馨提示

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

評論

0/150

提交評論