接口第3章 匯編語言及編程_第1頁
接口第3章 匯編語言及編程_第2頁
接口第3章 匯編語言及編程_第3頁
接口第3章 匯編語言及編程_第4頁
接口第3章 匯編語言及編程_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、3-1第三章第三章 匯編語言及編程匯編語言及編程3.1 3.1 匯編語言程序結(jié)構(gòu)與匯編語句匯編語言程序結(jié)構(gòu)與匯編語句3.2 3.2 偽指令語句偽指令語句3 3.3 .3 匯編語言編程環(huán)境匯編語言編程環(huán)境3 3.4 .4 DOS/BIOSDOS/BIOS功能調(diào)用功能調(diào)用3.5 3.5 三種基本結(jié)構(gòu)程序的設(shè)計三種基本結(jié)構(gòu)程序的設(shè)計3 3.6 .6 子程序設(shè)計與調(diào)用子程序設(shè)計與調(diào)用3-23.1 3.1 匯編語言程序結(jié)構(gòu)與匯編語句匯編語言程序結(jié)構(gòu)與匯編語句3.1.1 3.1.1 匯編語言源程序結(jié)構(gòu)匯編語言源程序結(jié)構(gòu) 3.1.2 3.1.2 匯編語言的語句匯編語言的語句3-33.1.1 3.1.1 匯編

2、語言源程序結(jié)構(gòu)匯編語言源程序結(jié)構(gòu) 80 80X86/PentiumX86/Pentium系列系列MPUMPU匯編語言都是以邏匯編語言都是以邏輯段為基礎(chǔ),按段的概念來組織代碼和數(shù)據(jù)的。輯段為基礎(chǔ),按段的概念來組織代碼和數(shù)據(jù)的。因此,源程序結(jié)構(gòu)與邏輯段的定義方法密切相因此,源程序結(jié)構(gòu)與邏輯段的定義方法密切相關(guān),而宏匯編語言關(guān),而宏匯編語言MASM 5.0MASM 5.0以上的版本中,邏以上的版本中,邏輯段既可用輯段既可用完整段完整段定義,又可用定義,又可用簡化段簡化段定義。定義。3-41. 1. 標(biāo)準(zhǔn)的單模塊源程序框架標(biāo)準(zhǔn)的單模塊源程序框架 .586 .586DATA SEGMENT USE16/

3、USE32DATA SEGMENT USE16/USE32;定義數(shù)據(jù)段定義數(shù)據(jù)段 ;數(shù)據(jù)定義偽指令序列;數(shù)據(jù)定義偽指令序列DATA ENDSDATA ENDSSTACK SEGMENT USE16/USE32 STACKSTACK SEGMENT USE16/USE32 STACK;定義堆棧段定義堆棧段 ;數(shù)據(jù)定義偽指令序列;數(shù)據(jù)定義偽指令序列STACK ENDSSTACK ENDSCODE SEGMENT USE16/USE32CODE SEGMENT USE16/USE32;定義代碼段定義代碼段 ASSUME CSASSUME CS:CODECODE,SSSS:STACKSTACK,DSD

4、S:DATADATA,ESES:DATADATASTART: MOV AXSTART: MOV AX,DATADATA;取數(shù)據(jù)段基址取數(shù)據(jù)段基址 MOV DSMOV DS,AXAX;建立建立DSDS的可尋址性的可尋址性 MOV ESMOV ES,AXAX ;建立建立ESES段的可尋址性段的可尋址性 ;核心程序段;核心程序段 MOV AHMOV AH,4CH4CH;返回返回DOSDOS操作系統(tǒng)操作系統(tǒng) INT 21HINT 21HCODE ENDSCODE ENDS END STARTEND START 一個源程序由若干邏輯段一個源程序由若干邏輯段組成。一般一個源程序具有數(shù)組成。一般一個源程序具

5、有數(shù)據(jù)段、附加數(shù)據(jù)段、堆棧段和據(jù)段、附加數(shù)據(jù)段、堆棧段和代碼段;代碼段;但只有代碼段是必不但只有代碼段是必不可少的??缮俚摹?采用完整段定義時,對程序采用完整段定義時,對程序中定義的邏輯段,要說明中定義的邏輯段,要說明邏輯邏輯段與段寄存器的尋址關(guān)系。段與段寄存器的尋址關(guān)系。ASSUME CSASSUME CS:CODECODE,SSSS:STACKSTACK,DSDS:DATADATA,ESES:DATADATA對數(shù)據(jù)段對數(shù)據(jù)段( (有時還有堆棧段有時還有堆棧段) ),程,程序中要包含序中要包含初始化段寄存器初始化段寄存器的語句。的語句。MOV AXMOV AX,DATADATAMOV DSM

6、OV DS,AXAXMOV ESMOV ES,AXAX程序中要包含程序中要包含返返回回DOSDOS的語句。的語句。MOV AHMOV AH,4CH4CHINT 21HINT 21H源程序(模塊)源程序(模塊)以以ENDEND偽指令結(jié)束偽指令結(jié)束 END STARTEND START3.1.1 3.1.1 匯編語言源程序結(jié)構(gòu)匯編語言源程序結(jié)構(gòu)3-53.1.1 3.1.1 匯編語言源程序結(jié)構(gòu)匯編語言源程序結(jié)構(gòu)(1) (1) 使用使用DOSDOS的的4 4CHCH號功能調(diào)用號功能調(diào)用這種方法是在代碼段結(jié)束前加調(diào)用語句:這種方法是在代碼段結(jié)束前加調(diào)用語句: MOV AH MOV AH,4CH 4CH

7、;功能號功能號4 4CHAHCHAH INT 21H INT 21H ;中斷調(diào)用中斷調(diào)用(2) (2) 使用使用2020H H號軟功能調(diào)用號軟功能調(diào)用調(diào)用方式是在代碼段結(jié)束前加調(diào)用語句:調(diào)用方式是在代碼段結(jié)束前加調(diào)用語句: INT 20H INT 20H(3) (3) 使用使用DOSDOS的的0 0號功能調(diào)用號功能調(diào)用調(diào)用方式是在代碼段結(jié)束前加調(diào)用語句:調(diào)用方式是在代碼段結(jié)束前加調(diào)用語句: MOV AHMOV AH,0 0 INT 21H INT 21H2.2.返回返回DOSDOS狀態(tài)的方法狀態(tài)的方法 3-6(4) (4) 將主程序定義為遠(yuǎn)過程將主程序定義為遠(yuǎn)過程 也稱為也稱為“標(biāo)準(zhǔn)序標(biāo)準(zhǔn)序”

8、方法。這種方法是在代碼段開方法。這種方法是在代碼段開始處按下述方式定義主程序:始處按下述方式定義主程序: CODE CODE SEGMENT SEGMENT ASSUME ASSUME 主過程名主過程名PROC FARPROC FARPUSH DS PUSH DS SUB AXSUB AX,AX AX ;標(biāo)準(zhǔn)序標(biāo)準(zhǔn)序 PUSH AXPUSH AX RET RET主過程名主過程名 ENDPENDP END END 主過程名主過程名3.1.1 3.1.1 匯編語言源程序結(jié)構(gòu)匯編語言源程序結(jié)構(gòu)3-7 指令語句指令語句 偽指令語句偽指令語句 宏指令語句宏指令語句3.1.2 3.1.2 匯編語言的語句匯

9、編語言的語句 語句是匯編語言程序的基本組成單位,用于規(guī)定匯編語句是匯編語言程序的基本組成單位,用于規(guī)定匯編語言的一個基本操作。匯編語言包含三種基本語句:語言的一個基本操作。匯編語言包含三種基本語句: 是可執(zhí)行語句是可執(zhí)行語句, ,由硬件由硬件( (CPUCPU) )完成其功能,完成其功能,匯匯編時產(chǎn)生目標(biāo)代碼編時產(chǎn)生目標(biāo)代碼 。不可執(zhí)行語句,不可執(zhí)行語句,其功能由相應(yīng)軟其功能由相應(yīng)軟件完成,件完成,不產(chǎn)生不產(chǎn)生目標(biāo)代碼目標(biāo)代碼。用戶定義的新指令,匯編用戶定義的新指令,匯編時產(chǎn)生相應(yīng)的目標(biāo)代碼。時產(chǎn)生相應(yīng)的目標(biāo)代碼。 3-8 標(biāo)號和名字標(biāo)號和名字分別是給指令單元和偽指令起的分別是給指令單元和偽指

10、令起的符號名稱,統(tǒng)稱為標(biāo)識符。符號名稱,統(tǒng)稱為標(biāo)識符。( (注意組成的語法規(guī)則注意組成的語法規(guī)則) ) 助記符和定義符助記符和定義符分別用于規(guī)定指令語句的操分別用于規(guī)定指令語句的操作性質(zhì)和偽指令語句的偽操作功能,統(tǒng)稱作性質(zhì)和偽指令語句的偽操作功能,統(tǒng)稱操作符操作符。 操作數(shù)操作數(shù)操作數(shù)允許有多個,這時各操作數(shù)之操作數(shù)允許有多個,這時各操作數(shù)之間要用逗號間要用逗號“,”隔開。隔開。3.1.2 3.1.2 匯編語言的語句匯編語言的語句指令語句:指令語句: 標(biāo)號:標(biāo)號: 助記符助記符 操作數(shù)操作數(shù) ;注釋;注釋 偽指令語句:偽指令語句: 名字名字 定義符定義符 操作數(shù)操作數(shù) ;注釋;注釋 1. 1.

11、 語句格式語句格式3-92. 2. 數(shù)數(shù) 據(jù)據(jù) 匯編語言中使用的數(shù)據(jù)有常數(shù)、變量和標(biāo)號。匯編語言中使用的數(shù)據(jù)有常數(shù)、變量和標(biāo)號。 (1) (1) 常數(shù)常數(shù) 常數(shù)是指那些在匯編過程中已常數(shù)是指那些在匯編過程中已有確定數(shù)值的有確定數(shù)值的量量,分為數(shù)值常數(shù)和字符串常數(shù)兩類。主要用作,分為數(shù)值常數(shù)和字符串常數(shù)兩類。主要用作: : 指令語句中的立即操作數(shù)指令語句中的立即操作數(shù) 基址、變址或基址加變址尋址中的位移量基址、變址或基址加變址尋址中的位移量 偽指令語句中用于給變量賦初值偽指令語句中用于給變量賦初值3.1.2 3.1.2 匯編語言的語句匯編語言的語句3-10 標(biāo)號標(biāo)號是指令的符號化地址,一定在代碼

12、段,而是指令的符號化地址,一定在代碼段,而變變量量是數(shù)據(jù)的符號化地址,是數(shù)據(jù)的符號化地址,一般在數(shù)據(jù)段,有時也可在一般在數(shù)據(jù)段,有時也可在代碼段定義代碼段定義。q 變量與標(biāo)號有三個共同屬性:變量與標(biāo)號有三個共同屬性: 段基址:段基址:所在段的起始地址所在段的起始地址( (SEG)SEG) 偏移值:偏移值:相對于段基址的位移量相對于段基址的位移量( (OFFSET)OFFSET) 類型:類型:所占字節(jié)數(shù)所占字節(jié)數(shù)( (TYPE)TYPE)(2) (2) 變量與標(biāo)號變量與標(biāo)號3.1.2 3.1.2 匯編語言的語句匯編語言的語句3-11q變量與標(biāo)號區(qū)別變量與標(biāo)號區(qū)別標(biāo)號可以用作標(biāo)號可以用作轉(zhuǎn)移控制類

13、指令的操作數(shù)轉(zhuǎn)移控制類指令的操作數(shù),但變量不能。但變量不能。變量可以用作變量可以用作基址、變址或基址加變址尋基址、變址或基址加變址尋址的位移量址的位移量,但標(biāo)號不能。但標(biāo)號不能。3.1.2 3.1.2 匯編語言的語句匯編語言的語句3-12 例例3.13.1 假設(shè)假設(shè)VAR1VAR1和和VAR2VAR2為字變量,為字變量,LABLAB為程序中為程序中的一個標(biāo)號,判斷下列指令是否正確,若錯誤請指出的一個標(biāo)號,判斷下列指令是否正確,若錯誤請指出錯誤之處:錯誤之處: ADD VAR1ADD VAR1,VAR2VAR2 SUB AL SUB AL,VAR1 VAR1 JNZ VAR1 JNZ VAR1

14、JMP LABSI JMP LABSI JMP NEAR LAB JMP NEAR LAB MOV AX MOV AX,VAR1BXVAR1BX JMP VAR2BX JMP VAR2BX錯,不允許存儲器變量間直接傳數(shù)錯,不允許存儲器變量間直接傳數(shù)錯,源與目的操作數(shù)錯,源與目的操作數(shù)類型不一致類型不一致錯,變量不能用作條錯,變量不能用作條件轉(zhuǎn)移指令的操作數(shù)件轉(zhuǎn)移指令的操作數(shù)錯,標(biāo)號不能用作變錯,標(biāo)號不能用作變址尋址的位移量址尋址的位移量錯,缺錯,缺PTRPTR運(yùn)算符運(yùn)算符正確正確正確正確3.1.2 3.1.2 匯編語言的語句匯編語言的語句3-133. 3. 表達(dá)式表達(dá)式 表達(dá)式是匯編語句操作數(shù)

15、的基本形式,由運(yùn)表達(dá)式是匯編語句操作數(shù)的基本形式,由運(yùn)算符和運(yùn)算對象組成。算符和運(yùn)算對象組成。算術(shù)運(yùn)算符算術(shù)運(yùn)算符邏輯運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符關(guān)系運(yùn)算符匯編語言特定的運(yùn)算符匯編語言特定的運(yùn)算符運(yùn)算符運(yùn)算符常數(shù)、變量和標(biāo)號常數(shù)、變量和標(biāo)號操作數(shù)操作數(shù)構(gòu)成程序的段和偏移量構(gòu)成程序的段和偏移量 運(yùn)算對象運(yùn)算對象3.1.2 3.1.2 匯編語言的語句匯編語言的語句3-14 指在匯編過程中能夠由匯編程序計算出數(shù)值的表指在匯編過程中能夠由匯編程序計算出數(shù)值的表達(dá)式。可作為達(dá)式??勺鳛橹噶钪械牧⒓床僮鲾?shù)和數(shù)據(jù)區(qū)中的初值指令中的立即操作數(shù)和數(shù)據(jù)區(qū)中的初值使用。使用。例如:例如: MOV BX MOV BX,

16、0FFF0H AND 0B234H0FFF0H AND 0B234H MOV AL MOV AL,4CH EQ 24CH EQ 2 MOV AH MOV AH,4CH GT 14CH GT 1 MOV AX MOV AX,SEG LABLESEG LABLE表達(dá)式又分為數(shù)值表達(dá)式和地址表達(dá)式:表達(dá)式又分為數(shù)值表達(dá)式和地址表達(dá)式:3.1.2 3.1.2 匯編語言的語句匯編語言的語句q數(shù)值表達(dá)式數(shù)值表達(dá)式3-15 其值表示存儲器地址,一般都是段內(nèi)的偏移地其值表示存儲器地址,一般都是段內(nèi)的偏移地址。與變量一樣,地址表達(dá)式也具有段值、偏移值址。與變量一樣,地址表達(dá)式也具有段值、偏移值和類型屬性。地址表

17、達(dá)式主要用來表示指令語句中和類型屬性。地址表達(dá)式主要用來表示指令語句中的操作數(shù),的操作數(shù),例如:例如: MOV AX MOV AX,BASEEAXEBXBASEEAXEBX JMP JMP BASEEAXBASEEAX LEA BXLEA BX,BASE+12BASE+123.1.2 3.1.2 匯編語言的語句匯編語言的語句q地址表達(dá)式地址表達(dá)式3-163.2.1 3.2.1 程序結(jié)構(gòu)偽指令語句程序結(jié)構(gòu)偽指令語句3.2.2 3.2.2 符號定義偽指令符號定義偽指令3.2.3 3.2.3 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令3.2.4 3.2.4 過程與宏定義偽指令過程與宏定義偽指令3.2.5 3.2.

18、5 結(jié)構(gòu)定義偽指令結(jié)構(gòu)定義偽指令 3.2 3.2 偽指令語句偽指令語句3-173.2.1 3.2.1 程序結(jié)構(gòu)偽指令語句程序結(jié)構(gòu)偽指令語句方式選擇偽指令方式選擇偽指令完整段定義偽指令完整段定義偽指令指定地址偽指令指定地址偽指令模塊定義偽指令模塊定義偽指令 這類語句是與程序結(jié)構(gòu)緊密相關(guān)的基本偽指令語這類語句是與程序結(jié)構(gòu)緊密相關(guān)的基本偽指令語句,用于說明句,用于說明CPUCPU的類型、邏輯段結(jié)構(gòu)、源程序的類型、邏輯段結(jié)構(gòu)、源程序( (或?;蚰K塊) )起止信息和段內(nèi)存的安排等。主要包括起止信息和段內(nèi)存的安排等。主要包括: : 3-181. 1. 方式選擇偽指令方式選擇偽指令 方式選擇偽指令用于通知

19、匯編程序,當(dāng)前的方式選擇偽指令用于通知匯編程序,當(dāng)前的源程序指令是哪一種源程序指令是哪一種CPUCPU指令,經(jīng)過匯編鏈接之后指令,經(jīng)過匯編鏈接之后生成的目標(biāo)程序在哪一種生成的目標(biāo)程序在哪一種CPUCPU機(jī)型上運(yùn)行。不屬于機(jī)型上運(yùn)行。不屬于選定選定CPUCPU的指令均為非法指令。所以,的指令均為非法指令。所以,方式選擇偽方式選擇偽指令本質(zhì)上也就是指令集選擇偽指令指令本質(zhì)上也就是指令集選擇偽指令。 通常通常, ,方式選擇偽指令放在程序的頭部方式選擇偽指令放在程序的頭部, ,作為作為源程序的第一條語句。缺省時默認(rèn)源程序的第一條語句。缺省時默認(rèn)80868086指令集。指令集。 3.2.1 3.2.1

20、程序結(jié)構(gòu)偽指令語句程序結(jié)構(gòu)偽指令語句3-192. 2. 完整段定義偽指令完整段定義偽指令 采用完整段定義偽指令可具體控制匯編程序采用完整段定義偽指令可具體控制匯編程序(MASMMASM)和鏈接程序(和鏈接程序(LINKLINK)在內(nèi)存中組織代在內(nèi)存中組織代碼和數(shù)據(jù)的方式。碼和數(shù)據(jù)的方式。 主要包括主要包括段定義語句段定義語句和和段寄存器說明語句段寄存器說明語句。 3.2.1 3.2.1 程序結(jié)構(gòu)偽指令語句程序結(jié)構(gòu)偽指令語句3-203.2.1 3.2.1 程序結(jié)構(gòu)偽指令語句程序結(jié)構(gòu)偽指令語句 段定義語句段定義語句 格式:格式:段名段名 SEGMENTSEGMENT 定位類型定位類型,組合類型組合

21、類型,字長選擇字長選擇,類別類別 段體段體 ;由指令、偽指令和宏指令語句組成;由指令、偽指令和宏指令語句組成段名段名 ENDSENDS 說明:說明: (1) (1) SEGMENT/ENDSSEGMENT/ENDS是一對段定義語句是一對段定義語句, ,一個邏輯段從一個邏輯段從SEGMENTSEGMENT語句開始,到語句開始,到ENDSENDS語句結(jié)束。語句結(jié)束。(2) (2) 段名段名是用戶定義的段的標(biāo)識符,用于指明段的基址。是用戶定義的段的標(biāo)識符,用于指明段的基址。 (3) (3) 4 4個可選參數(shù)個可選參數(shù)用于為源程序的匯編、連接提供必要的信用于為源程序的匯編、連接提供必要的信息,特別是模

22、塊化程序,各個模塊如何定位息,特別是模塊化程序,各個模塊如何定位, ,彼此之間如何連彼此之間如何連接,將較多地涉及到接,將較多地涉及到定位類型定位類型和和組合類型組合類型的選擇。的選擇。指定段起點(diǎn)的邊界類型指定段起點(diǎn)的邊界類型: : BYTE BYTE(字節(jié))字節(jié)) WORD WORD(字)字) DWORD DWORD(雙字)雙字) PARA PARA(節(jié))節(jié)) PAGE PAGE(頁)頁) 定位類型定位類型告訴鏈接程序本段與其它模塊中同名段的組合連接關(guān)系告訴鏈接程序本段與其它模塊中同名段的組合連接關(guān)系: : PUBLIC PUBLIC 連接到同一個物理段中連接到同一個物理段中 STACK S

23、TACK 連接到同一個物理堆棧段中連接到同一個物理堆棧段中, ,并給并給SS:ESPSS:ESP賦值賦值 COMMON COMMON 產(chǎn)生一個覆蓋段。產(chǎn)生一個覆蓋段。 MEMORY MEMORY AT AT表達(dá)式表達(dá)式 組合類型組合類型定義段中使用的偏移地址和寄存器的字長定義段中使用的偏移地址和寄存器的字長 USE16 USE16 表示該段字長為表示該段字長為1616位位 USE32 USE32 表示該段字長為表示該段字長為3232位位字長選擇字長選擇3-21 組合連接組合連接舉例:舉例:模塊模塊2 2(從模塊):(從模塊):DSEG SEGMENT COMMONDSEG SEGMENT CO

24、MMON ARRAY_B DW 200 DUP(?) ARRAY_B DW 200 DUP(?)DSEG ENDSDSEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACK DW 50 DUP(?) DW 50 DUP(?)SSEG ENDSSSEG ENDSCSEG SEGMENT PUBLICCSEG SEGMENT PUBLIC CSEG ENDSCSEG ENDS ENDEND模塊模塊1 1(主模塊):(主模塊):DSEG SEGMENT COMMONDSEG SEGMENT COMMON ARRAY_A DW 100 DUP(?) ARRAY_A DW

25、 100 DUP(?)DSEG ENDSDSEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACK DW 50 DUP(?) DW 50 DUP(?)SSEG ENDSSSEG ENDSCSEG SEGMENT PUBLICCSEG SEGMENT PUBLIC ASSUME CS:CSEG,DS:DSEG,SS:SSEG ASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART: MOV AXSTART: MOV AX,DSEGDSEG MOV DS MOV DS,AXAX CSEG ENDSCSEG ENDS END START END STA

26、RTCSEGCSEGDSEGDSEG( (共共400400字節(jié)字節(jié)) )模塊模塊2 2代碼代碼模塊模塊2 2數(shù)據(jù)數(shù)據(jù)SSEGSSEG( (共共200200字節(jié)字節(jié)) )模塊模塊1 1代碼代碼模塊模塊2 2堆棧堆棧模塊模塊1 1數(shù)據(jù)數(shù)據(jù)邏輯段組合示意圖邏輯段組合示意圖模塊模塊1 1堆棧堆棧3.2.1 3.2.1 程序結(jié)構(gòu)偽指令語句程序結(jié)構(gòu)偽指令語句3-22 段寄存器說明語句段寄存器說明語句 格式:格式: ASSUME ASSUME 段寄存器段寄存器: :段名段名 ,段寄存器,段寄存器: :段名,段名, 功能功能: : 說明源程序中定義的段由那個段寄存器去尋址。說明源程序中定義的段由那個段寄存器去

27、尋址。 說明:說明: CSCS只能用于包含有程序的段只能用于包含有程序的段, ,反之含有程序的段也反之含有程序的段也只能以只能以CSCS作為段寄存器。作為段寄存器。SSSS也一樣,只能與堆棧段對應(yīng)。也一樣,只能與堆棧段對應(yīng)。 CSCS所對應(yīng)的段名必須在該語句之前有定義。所對應(yīng)的段名必須在該語句之前有定義。 該語句是該語句是說明性語句。說明性語句。 3.2.1 3.2.1 程序結(jié)構(gòu)偽指令語句程序結(jié)構(gòu)偽指令語句3-233.3. 指定地址偽指令指定地址偽指令 格式格式: : ORG ORG 偏移地址偏移地址 ORG $ + ORG $ + 偏移地址偏移地址功能功能: : 該偽指令以其指定的偏移地址或

28、由該偽指令以其指定的偏移地址或由$ $ 給出的給出的當(dāng)前地址加上指定的偏移地址作為當(dāng)前開始分配和當(dāng)前地址加上指定的偏移地址作為當(dāng)前開始分配和使用的偏移地址。使用的偏移地址。3.2.1 3.2.1 程序結(jié)構(gòu)偽指令語句程序結(jié)構(gòu)偽指令語句3-244. 4. 模塊定義偽指令模塊定義偽指令 模塊定義偽指令包括模塊開始和模塊結(jié)束語句。模塊定義偽指令包括模塊開始和模塊結(jié)束語句。 (1) (1) 模塊開始語句模塊開始語句( (NAME)NAME) 格式:格式:NAME NAME 模塊名模塊名 功能:功能:指示源程序開始,并指出該源程序的模塊名。指示源程序開始,并指出該源程序的模塊名。 (2) (2) 模塊結(jié)束

29、語句模塊結(jié)束語句( (END)END) 格式:格式:END END 標(biāo)號標(biāo)號/ /過程名過程名 功能:功能:模塊結(jié)束語句表示源程序到此結(jié)束。模塊結(jié)束語句表示源程序到此結(jié)束。 3.2.1 3.2.1 程序結(jié)構(gòu)偽指令語句程序結(jié)構(gòu)偽指令語句3-253.2.2 3.2.2 符號定義偽指令符號定義偽指令格式格式: :賦值語句:賦值語句:符號名符號名 EQU EQU 表達(dá)式表達(dá)式 功能功能: : 都是用符號名代替表達(dá)式的值。但都是用符號名代替表達(dá)式的值。但賦值賦值語句定義的符號名不能重新定義語句定義的符號名不能重新定義,而,而等號等號語句語句允許。允許。1. 1. 符號常數(shù)定義偽指令符號常數(shù)定義偽指令等號

30、等號語句:語句:符號名符號名 = = 表達(dá)式表達(dá)式 3-26 例例3.23.2 賦值語句與等號賦值語句與等號語句舉例語句舉例。賦值語句:賦值語句:X EQU 50X EQU 50Y EQU X +10Y EQU X +10COUNT EQU $ - ARRYCOUNT EQU $ - ARRY等號等號語句語句:CON = 5CON = 5BASE = 200HBASE = 200H BASE = BASE + 10HBASE = BASE + 10H;重新定義重新定義BASEBASE3.2.2 3.2.2 符號定義偽指令符號定義偽指令3-272. 定義符號名偽指令定義符號名偽指令格式:格式:

31、符號名符號名 LABEL LABEL 類型類型 功能:功能:將緊跟在本偽指令后的標(biāo)號、操作碼、過程或變將緊跟在本偽指令后的標(biāo)號、操作碼、過程或變量建立新的符號名,并刷新其類型,但它并不為新指定量建立新的符號名,并刷新其類型,但它并不為新指定的變量或標(biāo)號分配存儲空間。的變量或標(biāo)號分配存儲空間。 例如:例如: SUB_FAR LABEL FAR ;遠(yuǎn)調(diào)用入口遠(yuǎn)調(diào)用入口 SUB_NEAR: MOV AL,SI ;近調(diào)用入口近調(diào)用入口 兩個標(biāo)號兩個標(biāo)號SUB_FAR和和SUB_NEAR均指向同一條均指向同一條指令,前者為遠(yuǎn)標(biāo)號,后者為近標(biāo)號。指令,前者為遠(yuǎn)標(biāo)號,后者為近標(biāo)號。 3.2.2 3.2.2

32、符號定義偽指令符號定義偽指令3-283.2.3 3.2.3 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令偽指令格式偽指令格式: :DBDBDWDWDDDDDFDFDQDQDTDT數(shù)據(jù)項(xiàng)數(shù)據(jù)項(xiàng) ,數(shù)據(jù)項(xiàng),數(shù)據(jù)項(xiàng),數(shù)據(jù)項(xiàng),數(shù)據(jù)項(xiàng) 變量名變量名 功能功能: : 是為數(shù)據(jù)項(xiàng)或項(xiàng)表分配存儲空間,給是為數(shù)據(jù)項(xiàng)或項(xiàng)表分配存儲空間,給它們賦初值,并用一個符號名(稱為變量)與之它們賦初值,并用一個符號名(稱為變量)與之相聯(lián)系。相聯(lián)系。8 8位(字節(jié))位(字節(jié))1616位(字)位(字)3232位(雙字)位(雙字)4848位(長字)位(長字)6464位(四字)位(四字)8080位(十字節(jié))位(十字節(jié)) 3-29使用說明使用說明:

33、: 給變量賦初值可以是賦確定的值,也可以是賦不確給變量賦初值可以是賦確定的值,也可以是賦不確定的值定的值( (用用“?”“?”表示表示),),還可以是用還可以是用DUPDUP運(yùn)算符建立的多次拷運(yùn)算符建立的多次拷貝。貝。 例例3.33.3 使用使用8080X86X86匯編語言的偽操作命令定義:匯編語言的偽操作命令定義: VAL DB 93 DUP(5VAL DB 93 DUP(5,2 DUP(2 DUP(1,2 DUP(3),4)2 DUP(2 DUP(1,2 DUP(3),4) 則在則在VALVAL存儲區(qū)內(nèi)前存儲區(qū)內(nèi)前1010個字節(jié)單元的數(shù)據(jù)是個字節(jié)單元的數(shù)據(jù)是 ? 解:由內(nèi)向外逐層展開,分別

34、相當(dāng)于:解:由內(nèi)向外逐層展開,分別相當(dāng)于: 93 93 DUP(5DUP(5,2 DUP(2 DUP(12 DUP(2 DUP(1,3 3,3)3),4)4) 93 DUP(5 93 DUP(5,2 DUP(12 DUP(1,3 3,3 3,1 1,3 3,3 3,4)4) 93 DUP(5,1,3,3,1,3,3,4,1,3,3,1,3,3,4) 93 DUP(5,1,3,3,1,3,3,4,1,3,3,1,3,3,4)即表示重復(fù)即表示重復(fù)9393個數(shù)據(jù)序列個數(shù)據(jù)序列: : 5 5,1 1,3 3,3 3,1 1,3 3,3 3,4 4,1 1,3 3,3 3,1 1,3 3,3 3,443

35、.2.3 3.2.3 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令3-30 使用使用SEGSEG、OFFSETOFFSET、TYPETYPE、LENGTHLENGTH和和SIZESIZE運(yùn)算符求變量的各種屬性時,特別要注意:運(yùn)算符求變量的各種屬性時,特別要注意: 對對LENGTHLENGTH運(yùn)算符,如果變量是用重復(fù)數(shù)據(jù)運(yùn)算符,如果變量是用重復(fù)數(shù)據(jù)操作符操作符DUPDUP說明的,則返回外層說明的,則返回外層DUPDUP給定的給定的值;如果沒有值;如果沒有DUPDUP說明,則返回值總是說明,則返回值總是1 1。 對對SIZESIZE運(yùn)算符有:運(yùn)算符有:SIZE =TYPESIZE =TYPELENGTHLENGT

36、H使用說明使用說明: :3.2.3 3.2.3 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令3-31 解解: : 此題有兩層此題有兩層DUPDUP定義,但最外層定義,但最外層DUPDUP給定的值給定的值為為100100,所以:,所以: (BXBX)= = 數(shù)組數(shù)組ARRAYARRAY的偏移地址;的偏移地址; (CXCX)= = 數(shù)組數(shù)組ARRAYARRAY的長度的長度 = 100 = 100; (SISI)= = 數(shù)組數(shù)組ARRAYARRAY的類型的類型 = 2 = 2。 例例3.43.4 若數(shù)組若數(shù)組ARRAYARRAY在數(shù)據(jù)段中已作如下定義:在數(shù)據(jù)段中已作如下定義: ARRAY DW 100 DUP(12

37、3HARRAY DW 100 DUP(123H,3 DUP(?)3 DUP(?),1234H1234H試指出下列指令執(zhí)行后,有關(guān)寄存器的內(nèi)容是多少?試指出下列指令執(zhí)行后,有關(guān)寄存器的內(nèi)容是多少?MOVMOV BX BX,OFFSET ARRAYOFFSET ARRAYMOVMOV CX CX,LENGTH ARRAYLENGTH ARRAYMOVMOV SI SI,0 0ADDADD SI SI,TYPE ARRAYTYPE ARRAY3.2.3 3.2.3 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令3-32 操作符操作符“$”“$”是取地址計數(shù)器的當(dāng)前值,常用于表是取地址計數(shù)器的當(dāng)前值,常用于表達(dá)式定義數(shù)

38、組長度。達(dá)式定義數(shù)組長度。0100H03H0101H00H0102H06H0103H01H0104H05H0105H00H0106H06H0107H00H0108H07H0109H08H010AH08H010BH09H解:畫出數(shù)組解:畫出數(shù)組ARYARY的內(nèi)存分配圖。的內(nèi)存分配圖。(AXAX)=ARY+2=0102H =0106H=ARY+2=0102H =0106H(BXBX)=ARY+10=010AH=0908H=ARY+10=010AH=0908H使用說明使用說明: :3.2.3 3.2.3 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令3-33 使用使用DBDB、DWDW、DDDD定義串?dāng)?shù)據(jù)定義串?dāng)?shù)據(jù)(

39、 (用用 定定義的字符串義的字符串) )時時, ,允許定義的串長度不同,字符的允許定義的串長度不同,字符的存放順序也不相同:存放順序也不相同: DBDB是從左至右順序?yàn)槊總€字符分配一個字節(jié)單是從左至右順序?yàn)槊總€字符分配一個字節(jié)單元;元; DWDW是從左至右順序?yàn)槊渴菑淖笾劣翼樞驗(yàn)槊? 2 個字符分配一個字單個字符分配一個字單元,且前面的字符在高字節(jié)元,且前面的字符在高字節(jié), ,串長度不能超過串長度不能超過2 2; DDDD是從左至右順序?yàn)槊渴菑淖笾劣翼樞驗(yàn)槊? 4 個字符分配一個雙字個字符分配一個雙字單元,也是按前面的字符在高字節(jié)順序存放,單元,也是按前面的字符在高字節(jié)順序存放,串長度不能超過

40、串長度不能超過4 4。3.2.3 3.2.3 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令3-34 例例3.63.6 今需在變量名為今需在變量名為STRINGSTRING的數(shù)據(jù)區(qū)中順的數(shù)據(jù)區(qū)中順次存放數(shù)據(jù)次存放數(shù)據(jù)AA、BB、CC、DD、EE、FF、GG、HH,請寫出分別用匯請寫出分別用匯編命令編命令DBDB、DWDW和和DDDD實(shí)現(xiàn)的語句。實(shí)現(xiàn)的語句。解:解:用用DBDB、DWDW和和DDDD實(shí)現(xiàn)的語句分別為:實(shí)現(xiàn)的語句分別為: STRING DB ABCDEFGHSTRING DB ABCDEFGH STRING DW BASTRING DW BA,DCDC,F(xiàn)EFE,HGHG STRING DD DCB

41、ASTRING DD DCBA,HGFEHGFE3.2.3 3.2.3 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令3-353.2.4 3.2.4 過程與宏定義偽指令過程與宏定義偽指令過程定義偽指令過程定義偽指令宏定義偽指令宏定義偽指令宏和過程的比較宏和過程的比較3-36格式:格式:過程名過程名 PROC PROC 屬性屬性 ;過程體;過程體 RETRET RET RET 過程名過程名 ENDPENDP 說明:說明: 過程允許嵌套調(diào)用,還可以遞歸調(diào)用。過程允許嵌套調(diào)用,還可以遞歸調(diào)用。 過程與邏輯段也可以相互嵌套,但決不允過程與邏輯段也可以相互嵌套,但決不允許過程與段交叉覆蓋。許過程與段交叉覆蓋。 過程又稱為

42、子程序。它是一段必須通過過程又稱為子程序。它是一段必須通過CALLCALL指令調(diào)指令調(diào)用才能執(zhí)行的程序段,執(zhí)行完后通過一條用才能執(zhí)行的程序段,執(zhí)行完后通過一條RETRET指令返回原指令返回原調(diào)用處。過程需先定義才能調(diào)用。調(diào)用處。過程需先定義才能調(diào)用。 過程體中必須至少包含一過程體中必須至少包含一條條RETRET指令,這是過程的出口。指令,這是過程的出口。但也允許過程有多條但也允許過程有多條RETRET指令,指令,即過程有多個出口。即過程有多個出口。1.1.過程定義偽指令過程定義偽指令 3.2.4 3.2.4 過程與宏定義偽指令過程與宏定義偽指令 3-37宏定義格式:宏定義格式: 宏名宏名 MA

43、CRO MACRO 形式參數(shù)表形式參數(shù)表 ;宏體;宏體 ENDM ENDM 說明:說明:宏定義的宏名必須唯一,稱為宏定義的宏名必須唯一,稱為宏指令宏指令。宏指令。宏指令一經(jīng)定義就可以在源程序的任何地方調(diào)用。相當(dāng)于由用戶一經(jīng)定義就可以在源程序的任何地方調(diào)用。相當(dāng)于由用戶給匯編程序提供了一個新的操作碼。給匯編程序提供了一個新的操作碼。 宏調(diào)用格式:宏調(diào)用格式: 宏名宏名 實(shí)際參數(shù)表實(shí)際參數(shù)表 3.2.4 3.2.4 過程與宏定義偽指令過程與宏定義偽指令 宏的概念與過程很相似,也是用一個宏的概念與過程很相似,也是用一個宏名字宏名字來代替源來代替源程序中經(jīng)常要用到的一個程序模塊。程序中經(jīng)常要用到的一個

44、程序模塊。 2. 2. 宏定義偽指令宏定義偽指令 3-383.2.4 3.2.4 過程與宏定義偽指令過程與宏定義偽指令 使用宏定義和宏調(diào)用時要注意使用宏定義和宏調(diào)用時要注意兩個問題兩個問題: 對帶參數(shù)的宏指令,宏調(diào)用時實(shí)際參數(shù)與形對帶參數(shù)的宏指令,宏調(diào)用時實(shí)際參數(shù)與形式參數(shù)的類型要一致式參數(shù)的類型要一致,以免產(chǎn)生無效調(diào)用,以免產(chǎn)生無效調(diào)用 。 宏調(diào)用是用宏體中定義的指令序列替換宏指宏調(diào)用是用宏體中定義的指令序列替換宏指令,所以令,所以宏體內(nèi)的標(biāo)號要用宏體內(nèi)的標(biāo)號要用LOCALLOCAL偽指令說明為偽指令說明為局部標(biāo)號局部標(biāo)號,以免多次調(diào)用宏時,發(fā)生標(biāo)號重復(fù),以免多次調(diào)用宏時,發(fā)生標(biāo)號重復(fù)定義錯

45、誤。定義錯誤。LOCALLOCAL偽指令格式:偽指令格式: LOCAL LOCAL 標(biāo)號標(biāo)號11,標(biāo)號,標(biāo)號2 2, 3-39 解:解:宏定義如下:宏定義如下: MOVE MACRO MOVE MACRO SARYSARY,DARYDARY LOCAL LPLOCAL LP MOV SI MOV SI,0 0 MOV CX MOV CX,100100 LP LP: MOV AL MOV AL,SARYSISARYSI MOV DARYSI MOV DARYSI,ALAL INC SI INC SI LOOP LP LOOP LP ENDM ENDM 例例3.73.7 定義宏定義宏MOVEMOV

46、E,其功能是將一個有其功能是將一個有100100個字個字節(jié)元素的數(shù)組搬移到另一個數(shù)據(jù)區(qū)。節(jié)元素的數(shù)組搬移到另一個數(shù)據(jù)區(qū)。進(jìn)行宏調(diào)用:進(jìn)行宏調(diào)用: MOVE FIRST MOVE FIRST,SECONDSECOND宏展開如下:宏展開如下: MOV SI MOV SI,0 0 MOV CX MOV CX,100100?0000:MOV AL?0000:MOV AL,F(xiàn)IRSTSIFIRSTSI MOV SECONDSI MOV SECONDSI,ALAL INC SI INC SI LOOP ?0000 LOOP ?00003.2.4 3.2.4 過程與宏定義偽指令過程與宏定義偽指令 3-403

47、. 3. 宏和過程的比較宏和過程的比較 宏和過程都可簡化源程序的書寫,因而也減少了程序宏和過程都可簡化源程序的書寫,因而也減少了程序出錯的可能性。但兩者使用上也有區(qū)別出錯的可能性。但兩者使用上也有區(qū)別: :3.2.4 3.2.4 過程與宏定義偽指令過程與宏定義偽指令 (1) (1) 宏操作可以直接傳遞和接收參數(shù),而過程不能直宏操作可以直接傳遞和接收參數(shù),而過程不能直接帶參數(shù)接帶參數(shù)。當(dāng)過程之間需要傳遞參數(shù)時,必須通過堆棧、。當(dāng)過程之間需要傳遞參數(shù)時,必須通過堆棧、寄存器或存儲器來進(jìn)行,編程比宏要復(fù)雜。寄存器或存儲器來進(jìn)行,編程比宏要復(fù)雜。 所以所以, ,宏匯編適合于代碼較短宏匯編適合于代碼較短

48、, ,傳送參數(shù)較多的子功能段使傳送參數(shù)較多的子功能段使用用, ,子程序適合于代碼較長子程序適合于代碼較長, ,調(diào)用比較頻繁的子功能段使用。調(diào)用比較頻繁的子功能段使用。 (3) (3) 引入宏操作并不會在執(zhí)行目標(biāo)代碼時增加額外的引入宏操作并不會在執(zhí)行目標(biāo)代碼時增加額外的時間開銷時間開銷,但過程調(diào)用由于要保護(hù)和恢復(fù)現(xiàn)場及斷點(diǎn),因,但過程調(diào)用由于要保護(hù)和恢復(fù)現(xiàn)場及斷點(diǎn),因此會延長目標(biāo)程序的執(zhí)行時間。此會延長目標(biāo)程序的執(zhí)行時間。 (2) (2) 子程序不管被調(diào)用多少次它都只被匯編一次,即子程序不管被調(diào)用多少次它都只被匯編一次,即有唯一的一段目標(biāo)代碼有唯一的一段目標(biāo)代碼; ;而宏指令則調(diào)用多少次就匯編多

49、少而宏指令則調(diào)用多少次就匯編多少次,每次調(diào)用都要在程序中展開并保留宏體中的每一行。次,每次調(diào)用都要在程序中展開并保留宏體中的每一行。3-413.2.5 3.2.5 結(jié)構(gòu)定義偽指令結(jié)構(gòu)定義偽指令 在一些應(yīng)用中,常需要將一些不同類型的數(shù)據(jù)組在一些應(yīng)用中,常需要將一些不同類型的數(shù)據(jù)組合成一個有機(jī)整體。這時就要用到匯編語言的結(jié)構(gòu)化合成一個有機(jī)整體。這時就要用到匯編語言的結(jié)構(gòu)化數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)結(jié)構(gòu)。 與前述的字節(jié)、字類型數(shù)據(jù)不同,一個結(jié)構(gòu)必與前述的字節(jié)、字類型數(shù)據(jù)不同,一個結(jié)構(gòu)必須先經(jīng)定義后才可以說明屬于這種結(jié)構(gòu)類型的變量須先經(jīng)定義后才可以說明屬于這種結(jié)構(gòu)類型的變量,這是因?yàn)榻Y(jié)構(gòu)的組成是千變?nèi)f化的。所以圍繞

50、結(jié)構(gòu)這是因?yàn)榻Y(jié)構(gòu)的組成是千變?nèi)f化的。所以圍繞結(jié)構(gòu)定義,有兩種偽指令語句定義,有兩種偽指令語句: :2. 2. 結(jié)構(gòu)變量說明與賦初值語句結(jié)構(gòu)變量說明與賦初值語句 1. 1. 結(jié)構(gòu)類型說明語句結(jié)構(gòu)類型說明語句( (STRUC/ENDS)STRUC/ENDS)3-423.2.5 3.2.5 結(jié)構(gòu)定義偽指令結(jié)構(gòu)定義偽指令 語句格式:語句格式: 結(jié)構(gòu)名結(jié)構(gòu)名 STRUCSTRUC ;結(jié)構(gòu)體結(jié)構(gòu)體,由數(shù)據(jù)定義語句構(gòu)成,由數(shù)據(jù)定義語句構(gòu)成 結(jié)構(gòu)名結(jié)構(gòu)名 ENDSENDSDATE STRUCDATE STRUC MONTH DB MONTH DB ? DAY DB DAY DB ? YEAR DW YEAR

51、DW ?DATE ENDSDATE ENDS 結(jié)構(gòu)結(jié)構(gòu)DATEDATE的存儲形式的存儲形式MONTHMONTH(1 1字節(jié))字節(jié))DAYDAY(1 1字節(jié))字節(jié))YEARYEAR(2 2字節(jié))字節(jié)) 結(jié)構(gòu)的定義明確地描述了該結(jié)構(gòu)的組織形式,它告訴結(jié)構(gòu)的定義明確地描述了該結(jié)構(gòu)的組織形式,它告訴匯編程序?qū)儆谶@種組織形式的變量使用內(nèi)存的模式。例如匯編程序?qū)儆谶@種組織形式的變量使用內(nèi)存的模式。例如: : 1. 1. 結(jié)構(gòu)類型說明語句結(jié)構(gòu)類型說明語句( (STRUC/ENDS)STRUC/ENDS)3-43語句格式:語句格式: 變量名變量名 結(jié)構(gòu)名結(jié)構(gòu)名 域值表域值表 例如:例如: VAR DATE 4

52、 VAR DATE 2004H結(jié)構(gòu)變量結(jié)構(gòu)變量VARVAR的存儲形式的存儲形式MONTHMONTH(1 1字節(jié))字節(jié))DAYDAY(1 1字節(jié))字節(jié))YEARYEAR(2 2字節(jié))字節(jié))0404H H0303H H 0 04H4H2020H HVARVAR3. 3. 結(jié)構(gòu)的引用結(jié)構(gòu)的引用有兩種方法:有兩種方法:結(jié)構(gòu)變量名結(jié)構(gòu)變量名. .域名域名 基址或變址寄存器基址或變址寄存器.域名域名MOV AXMOV AX, VAR.YEARVAR.YEARMOV CLMOV CL, VAR.DAYVAR.DAY上述引用也可用如下方法上述引用也可用如下方法: :MOV BXMOV BX,OFFSET VA

53、ROFFSET VAR MOV AXMOV AX,BX.YEARBX.YEARMOV CLMOV CL,BX.DAYBX.DAY3.2.5 3.2.5 結(jié)構(gòu)定義偽指令結(jié)構(gòu)定義偽指令2. 2. 結(jié)構(gòu)變量說明與賦初值語句結(jié)構(gòu)變量說明與賦初值語句 3-443.3 3.3 匯編語言編程環(huán)境匯編語言編程環(huán)境 與其它程序設(shè)計語言一樣,匯編語言程序的開與其它程序設(shè)計語言一樣,匯編語言程序的開發(fā)過程可歸結(jié)為:發(fā)過程可歸結(jié)為: 就需求分析、模塊劃分和算法確定等工作而言,就需求分析、模塊劃分和算法確定等工作而言,各種程序設(shè)計語言是類似的,均可按軟件工程的方各種程序設(shè)計語言是類似的,均可按軟件工程的方法進(jìn)行,法進(jìn)行

54、,但編程和調(diào)試則因程序設(shè)計語言而異但編程和調(diào)試則因程序設(shè)計語言而異。 需求分析需求分析 根據(jù)需求和規(guī)模等因素劃分模塊根據(jù)需求和規(guī)模等因素劃分模塊 確定各功能模塊的求解算法、并定義所需的確定各功能模塊的求解算法、并定義所需的數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) 進(jìn)行編程和調(diào)試進(jìn)行編程和調(diào)試3-45 對匯編語言而言,根據(jù)數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)行編碼到對匯編語言而言,根據(jù)數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)行編碼到形成可用程序的形成可用程序的過程如下:過程如下: 需求分析、需求分析、數(shù)據(jù)結(jié)構(gòu)和算法數(shù)據(jù)結(jié)構(gòu)和算法匯編語言源程序匯編語言源程序文件文件 * *. .ASMASM目標(biāo)代碼程序目標(biāo)代碼程序文件文件 * *. .OBJOBJ可執(zhí)行程序可執(zhí)行

55、程序文件文件 * *. .EXEEXE可用程序可用程序連接連接編輯編輯匯編匯編調(diào)試調(diào)試3.3 3.3 匯編語言編程環(huán)境匯編語言編程環(huán)境3-46應(yīng)用程序應(yīng)用程序外設(shè)硬件接口外設(shè)硬件接口BIOSBIOSDOSDOS DOSDOS操作系統(tǒng)操作系統(tǒng)和和ROM BIOSROM BIOS系統(tǒng)系統(tǒng)各為各為用戶提供了一組例行用戶提供了一組例行子程序,用于完成基子程序,用于完成基本本I/OI/O設(shè)備、內(nèi)存、設(shè)備、內(nèi)存、文件和作業(yè)的管理,文件和作業(yè)的管理,以及時鐘、日歷的讀以及時鐘、日歷的讀出和設(shè)置等功能。出和設(shè)置等功能。 3.4 3.4 DOS/BIOSDOS/BIOS功能調(diào)用功能調(diào)用 3-47順序結(jié)構(gòu)順序結(jié)構(gòu)

56、分支結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)3.5 3.5 三種三種基本結(jié)構(gòu)程序的設(shè)計基本結(jié)構(gòu)程序的設(shè)計程序的基本結(jié)構(gòu)形式有三種程序的基本結(jié)構(gòu)形式有三種: : 理論上,三種理論上,三種基本基本結(jié)構(gòu)是完備的,即任何功結(jié)構(gòu)是完備的,即任何功能的程序都可由順序、分支和循環(huán)三種結(jié)構(gòu)實(shí)現(xiàn)。能的程序都可由順序、分支和循環(huán)三種結(jié)構(gòu)實(shí)現(xiàn)。 3-483.5.1 3.5.1 順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序設(shè)計 順序程序又稱直線程序。順序程序又稱直線程序。其特點(diǎn)是順序執(zhí)行的,其特點(diǎn)是順序執(zhí)行的,無分支,無循環(huán),也無轉(zhuǎn)移,只作直線運(yùn)行。無分支,無循環(huán),也無轉(zhuǎn)移,只作直線運(yùn)行。 在實(shí)際應(yīng)用中,純粹用順序結(jié)構(gòu)編寫的完整程在實(shí)際應(yīng)用中,

57、純粹用順序結(jié)構(gòu)編寫的完整程序很少見,但是在程序段中它卻是大量的存在。所序很少見,但是在程序段中它卻是大量的存在。所以掌握它是編寫復(fù)雜應(yīng)用程序的基礎(chǔ)。以掌握它是編寫復(fù)雜應(yīng)用程序的基礎(chǔ)。3-493.5.2 3.5.2 分支結(jié)構(gòu)程序設(shè)計分支結(jié)構(gòu)程序設(shè)計 在許多實(shí)際問題中,往往需要根據(jù)不同的情在許多實(shí)際問題中,往往需要根據(jù)不同的情況和給定的條件做出不同的處理。要設(shè)計這樣的況和給定的條件做出不同的處理。要設(shè)計這樣的程序,必須事先把各種可能出現(xiàn)的情況及處理方程序,必須事先把各種可能出現(xiàn)的情況及處理方法都編寫在程序中,以后計算機(jī)運(yùn)行程序時,可法都編寫在程序中,以后計算機(jī)運(yùn)行程序時,可自動根據(jù)運(yùn)行的結(jié)果做出判

58、斷,有條件地選擇執(zhí)自動根據(jù)運(yùn)行的結(jié)果做出判斷,有條件地選擇執(zhí)行不同的程序段,按這種要求編寫的程序稱為分行不同的程序段,按這種要求編寫的程序稱為分支程序。支程序。 3-50分支分支1 1條件條件結(jié)束結(jié)束開始開始Y YN N分支分支2 2( (b) b) 完全分支結(jié)構(gòu)完全分支結(jié)構(gòu)分支程序分支程序條件條件結(jié)束結(jié)束開始開始Y YN N( (a) a) 不完全分支結(jié)構(gòu)不完全分支結(jié)構(gòu)分支分支1 1結(jié)束結(jié)束開始開始條件條件i ii=1i=1i=ni=n分支分支2 2分支分支n ni=2i=2( (c)c) 多分支結(jié)構(gòu)多分支結(jié)構(gòu)IF 條件條件 THEN 分支程序分支程序IF 條件條件 THEN 分支分支1 1

59、 ELSE 分支分支2 2分支程序的結(jié)構(gòu)有三種形式分支程序的結(jié)構(gòu)有三種形式: : 3.5.2 3.5.2 分支結(jié)構(gòu)程序設(shè)計分支結(jié)構(gòu)程序設(shè)計 3-51根據(jù)根據(jù)X(-128 X 127)X(-128 X 127)的值求出的值求出Y Y。例例3.93.9 變量變量X X的符號函數(shù)定義如下的符號函數(shù)定義如下: :Y=1 X00 X=0-1 X01. 1. 利用比較與條件轉(zhuǎn)移指令實(shí)現(xiàn)分支利用比較與條件轉(zhuǎn)移指令實(shí)現(xiàn)分支 這種方法適合于不完全分支和完全分支這兩種結(jié)構(gòu),這種方法適合于不完全分支和完全分支這兩種結(jié)構(gòu),對分支較少的多分支結(jié)構(gòu)也可用。對分支較少的多分支結(jié)構(gòu)也可用。 3.5.2 3.5.2 分支結(jié)構(gòu)程

60、序設(shè)計分支結(jié)構(gòu)程序設(shè)計 3-52例例3.93.9程序程序: :DATASEGMENTX DB 0F8HY DB ?DATAENDS CODESEGMENTASSUME CS:CODE,DS:DATASTART: MOVAX,DATAMOVDS,AXMOVAL,X;取變量取變量X X的值的值CMPAL,0;X X與與0 0比較比較JGBIGRJEFINISH;X=0,Y=0MOVAL,0FFH;X 0,Y=1FINISH: MOVY,AL;保存函數(shù)值保存函數(shù)值Y YMOVAH,4CHINT21HCODEENDSENDSTART3.5.2 3.5.2 分支結(jié)構(gòu)程序設(shè)計分支結(jié)構(gòu)程序設(shè)計 3-53這種

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論