匯編語(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è),還剩88頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)4.1 匯編語(yǔ)言的基本語(yǔ)法(1) 用編輯程序建立 .ASM源文件;(2) 用匯編程序把 .ASM文件轉(zhuǎn)匯編成 .OBJ文件;(3) 用鏈接程序把 .OBJ文件連接成.EXE文件;(4) 用DOS命令直接鍵入文件名就可執(zhí)行該程序。 常用的匯編程序有Microsoft公司推出的宏匯編程MASM和BORLAND公司推出的TASM。我們采用QASM2.7版。4.1.1匯編程序的建立過(guò)程4.1 匯編語(yǔ)言的基本語(yǔ)法(1) 用編輯程序建立 .ASM源4.1.1匯編程序的建立過(guò)程4.1.1匯編程序的建立過(guò)程 為運(yùn)行匯編語(yǔ)言程序,至少要在磁盤上提供以下文件:(1) 編輯程序,如E

2、DIT.EXE;(2) 匯編程序,如MASM.EXE;(3) 連接程序,如LINK.EXE;(4) 調(diào)試程序,如DEBUG.COM。4.1.1匯編程序的建立過(guò)程 為運(yùn)行匯編語(yǔ)言程序,至少要在磁盤上提供以下文件:4.1【例】將變量VAR1和VAR2相減,并將結(jié)果送入變量RESULT。DATA SEGMENT ;定義數(shù)據(jù)段 VAR1 DW 7654H ;定義變量VAR1初值為7654H VAR2 DW 2345H ;定義變量VAR2初值為2345H RESULT DW ? ;定義變量RESULTDATA ENDS ;數(shù)據(jù)段結(jié)束CODE SEGMENT ;定義代碼段 ASSUME CS: CODE

3、, DS: DATA ;為各個(gè)邏輯段指定段寄存器4.1.2 匯編語(yǔ)言程序格式【例】將變量VAR1和VAR2相減,并將結(jié)果送入變量RESUSTART: MOV AX, DATA ;初始化數(shù)據(jù)段寄存器DS MOV DS, AX MOV AX, VAR1 ;變量VAR1送AX SUB AX, VAR2 ;AX-VAR2結(jié)果送AX MOV RESULT, AX ;結(jié)果送變量RESULT MOV AH, 4CH ;調(diào)用4CH號(hào)DOS中斷 INT 21H ;返回操作系統(tǒng)CODE ENDS ;代碼段結(jié)束 END START ;匯編結(jié)束4.1.2 匯編語(yǔ)言程序格式START: MOV AX, DATA 物理地

4、址是由段地址和偏移地址組合而成的,匯編程序在把源程序轉(zhuǎn)換為目標(biāo)程序時(shí),必須確定標(biāo)號(hào)和變量(代碼段和數(shù)據(jù)段的符號(hào)地址)的偏移地址,并且需要把有關(guān)信息通過(guò)目標(biāo)模塊傳送給連接程序,以便連接程序把不同的段和模塊連接在一起,形成一個(gè)可執(zhí)行程序。為此,需要用段定義偽操作。4.1.2 匯編語(yǔ)言程序格式 物理地址是由段地址和偏移地址組合而成的,匯編程序在把SEGMENT_NAMESEGMENTSEGMENT_NAMEENDS 其中,刪節(jié)號(hào)部分對(duì)于數(shù)據(jù)段、附加段和堆棧段來(lái)說(shuō),一般是存儲(chǔ)單元的定義、分配等偽操作;對(duì)于代碼段則是指令及偽操作。4.1.2 匯編語(yǔ)言程序格式SEGMENT_NAMESEGMENT4.1.

5、2 匯編 還必須明確段和段寄存器的關(guān)系,可用ASSUME偽操作來(lái)實(shí)現(xiàn),其格式為 ASSUME :段名,. ASSUME :NOTHING其中,段寄存器名必須是CS、DS、ES和SS中的一個(gè),而段名則必須是由SEGMENT定義的段中的段名。ASSUME NOTHING則可取消前面由ASSUME所指定的段寄存器。4.1.2 匯編語(yǔ)言程序格式 還必須明確段和段寄存器的關(guān)系,可用ASSUME偽操作 較為完整的匯編源程序段定義。DATE_SEG1 SEGMENT;定義數(shù)據(jù)段DATE_SEG1 ENDSDATA_SEG2 SEGMENT;定義數(shù)據(jù)附加段 DATA_SEG2 ENDSCODE_SEG SEG

6、MENT;定義代碼段 ASSUME CS:CODE_SEG,DS:DATA_SEG1,ES:DATA_SEG2START:;開始執(zhí)行的入口地址4.1.2 匯編語(yǔ)言程序格式 較為完整的匯編源程序段定義。4.1.2 匯編語(yǔ)言;設(shè)置DS寄存器為當(dāng)前數(shù)據(jù)段MOVAX,DATA_SEG1 ;將數(shù)據(jù)段地址賦予DSMOVDS,AX;設(shè)置ES寄存器為當(dāng)前附加段MOVAX,DATA_SEG2 ;將附加數(shù)據(jù)段地址賦予ESMOVES,AXCODE_SEGENDS ;代碼段定義結(jié)束ENDSTART ;源程序結(jié)束4.1.2 匯編語(yǔ)言程序格式;設(shè)置DS寄存器為當(dāng)前數(shù)據(jù)段4.1.2 匯編語(yǔ)言程序格式 由于ASSUME偽操作

7、只是指定某個(gè)段分配給哪一個(gè)段寄存器,它并不能把段地址裝入段寄存器中,要把段地址裝入段寄存器中,就必須在代碼段中有對(duì)段地址裝入相應(yīng)的段寄存器中的指令??捎脙蓷lMOV指令完成這一操作。但是,代碼段CS不需要這樣做,這一操作是在程序初始化時(shí)完成的。4.1.2 匯編語(yǔ)言程序格式 由于ASSUME偽操作只是指定某個(gè)段分配給哪一個(gè)段寄 匯編語(yǔ)言源程序由若干條語(yǔ)句組成,語(yǔ)句分為如下兩類。 1) 指令語(yǔ)句 指令語(yǔ)句能完成一定的操作功能,能夠翻譯成機(jī)器代碼的語(yǔ)句。 指令語(yǔ)句的格式為: 【標(biāo)號(hào):】 指令助記符 【操作數(shù)】 【;注釋】4.1.3匯編語(yǔ)言程序的語(yǔ)句類型 匯編語(yǔ)言源程序由若干條語(yǔ)句組成,語(yǔ)句分為如下兩類

8、。4 2) 偽指令語(yǔ)句 偽指令語(yǔ)句也叫指示性語(yǔ)句,它只是為匯編程序在翻譯匯編語(yǔ)言源程序時(shí)提供有關(guān)信息,并不翻譯成機(jī)器代碼,所以也不占用執(zhí)行時(shí)間。 偽指令的格式為: 【符號(hào)名】 偽指令定義符 【參數(shù)表】 【;注釋】 4.1.3匯編語(yǔ)言程序的語(yǔ)句類型 2) 偽指令語(yǔ)句4.1.3匯編語(yǔ)言程序的語(yǔ)句類型 4.2.1 常量 1常量的類型 (1)數(shù)值型常量 二進(jìn)制數(shù):以字母B結(jié)尾,例:10101001B。 十進(jìn)制數(shù):以字母D結(jié)尾(或省略),例:5678。 十六進(jìn)制數(shù):以字母H結(jié)尾,由09,AF所組成,以字母AF開頭的十六進(jìn)制數(shù),須在字母前加上數(shù)字0。4.2 偽指令 4.2.1 常量4.2 偽指令 (2)字

9、符串常量 字符串常量是用單引號(hào)或雙引號(hào)括起來(lái)的一個(gè)或多個(gè)字符,如ABC或“ABC”,字符在機(jī)器內(nèi)是以ASCII存放。字母大、小寫在計(jì)算機(jī)內(nèi)存放的是不同的數(shù)值,例如,B在內(nèi)存中為42H,b在內(nèi)存中為62H。 4.2.1 常量 (2)字符串常量4.2.1 常量 2常量或表達(dá)式賦值偽指令 可以用賦值偽指令給常量或表達(dá)式賦值,程序中凡是需要用到的地方就可以用這個(gè)符號(hào)名來(lái)代替 (1)等值偽指令(EQU) 格式:符號(hào)名 EQU 表達(dá)式 功能:將表達(dá)式的值賦給符號(hào)名。 SUM EOU 34H ;將常數(shù)34H賦給 SUM NUM EQU EBP+31H ;EBP+3賦以NUM 4.2.1 常量 2常量或表達(dá)式

10、賦值偽指令4.2.1 常 (2)等號(hào)偽指令 格式:符號(hào)名表達(dá)式 功能:將表達(dá)式的值賦給符號(hào)名。 MATH=20H ENG=3 ENG=MATH+ENG+10H 等號(hào)語(yǔ)句與EQU語(yǔ)句有同樣的功能,區(qū)別在于在同一源程序中,EQU語(yǔ)句不允許對(duì)符號(hào)重復(fù)定義,而等號(hào)語(yǔ)句允許對(duì)符號(hào)重復(fù)定義。4.2.1 常量 (2)等號(hào)偽指令4.2.1 常量 1. 變量的屬性 段屬性(SEG):變量所在段的段基址,它通常放在DS、ES、SS段寄存器中。 偏移屬性(OFFSET):從變量所在段的起始地址到定義變量位置之間的字節(jié)數(shù)。 類型屬性(TYPE):指變量占用存儲(chǔ)單元的字節(jié)數(shù)。字節(jié)變量類型為BYTE,字變量類型為WORD

11、,雙字變量類型為DWORD。4.2.2 變量 1. 變量的屬性4.2.2 變量 2. 變量定義偽指令 變量定義偽指令是為操作數(shù)分配存儲(chǔ)單元,并給這個(gè)存儲(chǔ)單元取一個(gè)名字,即變量名,同時(shí)為變量賦以初值。 【變量名】 DB/DW/DD/DF/DQ/DT 表達(dá)式l, 功能:為變量分配存儲(chǔ)單元,表達(dá)式可以是數(shù)值表達(dá)式、地址表達(dá)式、字符串、?、用逗號(hào)隔開的上述各項(xiàng)或DUP(表達(dá)式)。4.2.2 變量 2. 變量定義偽指令4.2.2 變量 (1)數(shù)值變量定義語(yǔ)句 NUM DB 100,45H ;將64H,45H賦給字節(jié)變量NUM SUM DW 3456H ;將3456H賦給字變量SUM TOTAL DD 2

12、2334455H ;將22334455H賦給雙字變量 TOTAL 4.2.2 變量 (1)數(shù)值變量定義語(yǔ)句4.2.2 變量4.2.2 變量4.2.2 變量 (2)字符串變量定義語(yǔ)句 定義字符串變量可以用DB偽指令,它為字符串中的每個(gè)字符分配一個(gè)字節(jié)的存儲(chǔ)單元,在存儲(chǔ)單元中存放的是字符的ASCII碼值。 ABC DB ABCDEF ;將字符串賦給變量ABC DATE DB BA,DC ;將兩個(gè)字符串賦給變量DATE 4.2.2 變量 (2)字符串變量定義語(yǔ)句4.2.2 變量4.2.2 變量4.2.2 變量 (3)預(yù)分配存儲(chǔ)單元 “?” 語(yǔ)句可以為數(shù)據(jù)項(xiàng)分配存儲(chǔ)單元,但是存儲(chǔ)單元中不預(yù)置確定的值,

13、所以常用來(lái)預(yù)留存儲(chǔ)單元。 BVAR DB ? ;預(yù)分配1個(gè)字節(jié)單元 DVAR DW ?,?,? ;預(yù)分配3個(gè)字單元4.2.2 變量 (3)預(yù)分配存儲(chǔ)單元4.2.2 變量 (4)重復(fù)數(shù)據(jù)定義 DUP語(yǔ)句可以重復(fù)進(jìn)行數(shù)據(jù)定義操作,用帶DUP的表達(dá)式可以為若干重復(fù)數(shù)據(jù)分配存儲(chǔ)單元,DUP表達(dá)式也可以嵌套。 D1 DB 3 DUP(0) ;定義D1為3個(gè)全為0的字節(jié)單元 D2 DW l0 DUP(0ABCDH) ;定義D2為10個(gè)全為0ABCDH的字單元 D3 DD 2 DUP (20H, 2 DUP(10H) ;定義D3為20H,10H,10H, 20H,10H,10H4.2.2 變量 (4)重復(fù)數(shù)

14、據(jù)定義4.2.2 變量 標(biāo)號(hào)是可執(zhí)行語(yǔ)句的符號(hào)地址,用來(lái)表示指令在存儲(chǔ)器中的位置。經(jīng)常在轉(zhuǎn)移指令中目標(biāo)操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)移指令的目標(biāo)地址。標(biāo)號(hào)之后必需有一個(gè)冒號(hào)“:” 。 1標(biāo)號(hào)的屬性 (1)段屬性(SEG):指標(biāo)號(hào)所在段的段基址,它通常放在DS、ES、SS段寄存器中。 4.2.3 標(biāo)號(hào) 標(biāo)號(hào)是可執(zhí)行語(yǔ)句的符號(hào)地址,用來(lái)表示指令在存 (2)偏移屬性(OFFSET):指標(biāo)號(hào)所在段中的偏移地址,即標(biāo)號(hào)所在的地址與段基址之間的字節(jié)數(shù)。 (3)類型屬性或距離屬性(TYPE):用來(lái)說(shuō)明該標(biāo)號(hào)是段內(nèi)引用還是段間引用。段內(nèi)引用時(shí)為NEAR屬性,指針占兩個(gè)字節(jié);段間引用時(shí)為FAR屬性,指針占4個(gè)字節(jié)。

15、4.2.3 標(biāo)號(hào) (2)偏移屬性(OFFSET):指標(biāo)號(hào)所在段中的 2定義類型屬性偽指令LABEL 語(yǔ)句格式: 變量名或標(biāo)號(hào) LABEL 類型 (1)與變量連用,給下一條語(yǔ)句中的變量取個(gè)新的名字,并可重新定義它的類型,其類型可以是BYTE、WORD或DWORD 。 (2)與標(biāo)號(hào)連用 ,給指令地址定義一個(gè)新的標(biāo)號(hào),并可改變其類型屬性NEAR或FAR 。4.2.3 標(biāo)號(hào) 2定義類型屬性偽指令LABEL4.2.3 分為數(shù)值表達(dá)式和地址表達(dá)式兩種類型。表達(dá)式的運(yùn)算是在匯編時(shí)由匯編程序完成的,表達(dá)式的運(yùn)算結(jié)果作為操作數(shù)參加指令規(guī)定的操作。 1. 數(shù)值表達(dá)式 MOV AX, 2+10H 指令中源操作數(shù)是一

16、個(gè)數(shù)值表達(dá)式,其運(yùn)算結(jié)果是個(gè)數(shù)值,指令執(zhí)行后AX中存放的是該表達(dá)式的值。4.2.4 表達(dá)式 分為數(shù)值表達(dá)式和地址表達(dá)式兩種類型。表達(dá)式的 2. 地址表達(dá)式 地址表達(dá)式的結(jié)果是一個(gè)存儲(chǔ)單元的地址。當(dāng)這個(gè)地址中存放的是數(shù)據(jù)時(shí),稱為變量;當(dāng)這個(gè)地址中存放的是指令時(shí),則稱為標(biāo)號(hào)。例如: MOV AX,ES:BX+1001H 指令中源操作數(shù)是地址表達(dá)式,其結(jié)果是一個(gè)存儲(chǔ)單元的地址。4.2.4 表達(dá)式 4.2.4 表達(dá)式 1. 算術(shù)運(yùn)算符 算術(shù)運(yùn)算符:、*、等,參加運(yùn)算的數(shù)和運(yùn)算的結(jié)果均為整數(shù),除法運(yùn)算的結(jié)果取商的整數(shù)部分。 2. 邏輯運(yùn)算符 邏輯運(yùn)算符:AND、OR、XOR和NOT,用于對(duì)常量進(jìn)行按位操

17、作。 4.2.5 運(yùn)算符 1. 算術(shù)運(yùn)算符4.2.5 運(yùn)算符 注意,邏輯運(yùn)算符與邏輯指令在形式上是一樣的,但它們?cè)谡Z(yǔ)句中的位置不同。表達(dá)式中的邏輯運(yùn)算符是只出現(xiàn)在指令的操作數(shù)部分,是由匯編程序匯編時(shí)完成運(yùn)算;而邏輯指令是出現(xiàn)在指令的操作碼部分,其運(yùn)算是在指令執(zhí)行時(shí)進(jìn)行的。 OR AL,BH OR 80H MOV AL,CL AND 10000000B 4.2.5 運(yùn)算符 注意,邏輯運(yùn)算符與邏輯指令在形式上是一樣的, 3. 關(guān)系運(yùn)算符 包括GT(大于)、GE(大于等于)、LT(小于)、LE(小于等于)、EQ(等于)和NE(不等于)6種。對(duì)兩個(gè)操作數(shù)進(jìn)行比較運(yùn)算,結(jié)果為邏輯值。 MOV AX, 1

18、1 EQ 1011B ;111011B為真,(AX)0FFFFH MOV BX, 10H EQ 32 ;10H=32為假,(BX)04.2.5 運(yùn)算符 3. 關(guān)系運(yùn)算符4.2.5 運(yùn)算符 4. 修改屬性運(yùn)算符PTR 修改屬性運(yùn)算符PTR可以臨時(shí)改變變量或標(biāo)號(hào)原有的類型屬性并賦予其新的類型屬性。 DATA DB 10H,11H,12H,13H MOV EAX, DWORD PTR DATA ;修改DATA為雙字型變量 4.2.5 運(yùn)算符 4. 修改屬性運(yùn)算符PTR4.2.5 運(yùn)算符 5. 取值運(yùn)算符 取值運(yùn)算符包括SEG(返回段地址)、OFFSET(返回偏移地址)、TYPE(返回類型字節(jié)數(shù))、L

19、ENGTH(返回變量單元數(shù))和SIZE(返回變量總字節(jié)數(shù))。它們不改變?cè)僮鲾?shù)的屬性,只是取操作數(shù)的某一屬性,返回的結(jié)果是一個(gè)數(shù)值。4.2.5 運(yùn)算符 5. 取值運(yùn)算符4.2.5 運(yùn)算符 (1)SEG運(yùn)算符 SEG運(yùn)算符加在變量名或標(biāo)號(hào)之前,返回的數(shù)值是該變量或標(biāo)號(hào)所在段的段基址。例如; MOV AX,SEG VAR 如果變量VAR所在段的段基址為1000H,則該指令執(zhí)行后AX的內(nèi)容為1000H。 4.2.5 運(yùn)算符 (1)SEG運(yùn)算符4.2.5 運(yùn)算符 (2)OFFSET運(yùn)算符 OFFSET運(yùn)算符加在變量名或標(biāo)號(hào)之前,返回的數(shù)值是該變量或標(biāo)號(hào)的偏移基址。例如: MOV BX,OFFSET V

20、AR 如果變量VAR在段內(nèi)的偏移地址為2000H,則該指令執(zhí)行后BX的內(nèi)容為2000H。4.2.5 運(yùn)算符 (2)OFFSET運(yùn)算符4.2.5 運(yùn)算符 (3)TYPE運(yùn)算符 TYPE運(yùn)算符加在變量名之前,返回的數(shù)值是該變量的類型字節(jié)數(shù),DB為1,DW為2。當(dāng)TYPE加在標(biāo)號(hào)之前,返回的數(shù)值是這個(gè)標(biāo)號(hào)的類型屬件值, NEAR為1,F(xiàn)AR為2。 A1 DB 1,2,3,4,5,6,7,8 A2 DW l234H,5678H SF LABEL FAR SN: MOV BL, TYPE A1 ;BL=1 MOV BH, TYPE A2 ;BH=2 MOV DH, TYPE SF ;DH=2 4.2.5

21、 運(yùn)算符 (3)TYPE運(yùn)算符4.2.5 運(yùn)算符 (4)LENGTH運(yùn)算符 加在變量名之前,返回的數(shù)值是變量中所定義的元素個(gè)數(shù)。如果變量是用DUP說(shuō)明的,則返回DUP前面的數(shù)值;如果沒有DUP說(shuō)明,則返回的值總是1。 B1 DB 100 DUP(0) B2 DW 4321H, 3859H MOV BX,LENGTH B1 ;等效MOV BX,100 MOV AX,LENGTH B2 ;等效MOV AX,14.2.5 運(yùn)算符 (4)LENGTH運(yùn)算符4.2.5 運(yùn)算符 (5)SIZE運(yùn)算符 該運(yùn)算符加在變量名之前,返回的數(shù)值是該變量所分配的字節(jié)總數(shù)。它等于LEGTH和TYPE兩個(gè)運(yùn)算符返回的乘積

22、。例如,對(duì)于上例中所定義的變量B1、B2的返回值如下所示。 MOV BX, SIZE B1 ;(BX)=100 MOV CX, SIZE B2 ;(CX)=24.2.5 運(yùn)算符 (5)SIZE運(yùn)算符4.2.5 運(yùn)算符 內(nèi)存是分段管理的,程序的不同部分應(yīng)放在特定的段中。段定義偽指令就是為程序的分段而設(shè)置的。 段名 SEGMENT 段名 ENDS 任何邏輯段總是從SEGMNT語(yǔ)句開始,以ENDS語(yǔ)句結(jié)束,成對(duì)出現(xiàn)。 4.2.6 段定義偽指令 內(nèi)存是分段管理的,程序的不同部分應(yīng)放在特定的 ASSUME 段寄存器名:段名,段寄存器名:段名, 該語(yǔ)句通知匯編程序源程序中定義的段由哪個(gè)段寄存器尋址。 AS

23、SUME語(yǔ)句是非執(zhí)行語(yǔ)句,要求放在代碼段內(nèi)的段定義語(yǔ)句之后。4.2.7 段寄存器指派偽指令 ASSUME 段寄存器名:段名,段寄存 ASSUME語(yǔ)句僅僅約定了對(duì)邏輯段進(jìn)行尋址操作時(shí)使用哪個(gè)段寄存器,而段寄存器的初值還必須在程序中用指令設(shè)置。 MOV AX,DATA MOV DS,AX 對(duì)CS的賦值是由操作系統(tǒng)系統(tǒng)自動(dòng)完成的,程序員不用設(shè)置。4.2.7 段寄存器指派偽指令 ASSUME語(yǔ)句僅僅約定了對(duì)邏輯段進(jìn)行尋 ORG 表達(dá)式 ORG偽指令用來(lái)指定該語(yǔ)句之后的程序或數(shù)據(jù)開始存放的偏移地址。 ORG 2000H VAR1 DB 2,3,45H ;從偏移地址2000H開始存放變量VAR1 4.2.

24、8 移動(dòng)地址指針偽指令 4.2.8 移動(dòng)地址指針偽指令 在匯編語(yǔ)言中,可以用$表示當(dāng)前位置計(jì)數(shù)器的值。 DATA SEGMENT STR DB GOOD COUNT EQU $ STR DATA ENDS $表示當(dāng)前的偏移地址,變量名STR表示上一條語(yǔ)句中變量STR的偏移地址,$STR表示兩個(gè)偏移地址之差,是以變量STR為首地址的連續(xù)字節(jié)數(shù),即STR為首地址的字符個(gè)數(shù)。4.2.9 當(dāng)前位置計(jì)數(shù)器$ 在匯編語(yǔ)言中,可以用$表示當(dāng)前位置計(jì)數(shù)器的值 END偽指令作為匯編語(yǔ)言源程序的結(jié)束語(yǔ)句,一般放在源程序的最后一行。一個(gè)程序模塊只允許有一個(gè)END語(yǔ)句。 格式: END 標(biāo)號(hào)4.2.10 程序結(jié)束偽指

25、令END 4.2.10 程序結(jié)束偽指令END 為方便程序員編寫輸入/輸出程序,系統(tǒng)提供了兩組功能程序。一組固化在BIOS內(nèi),由幾十個(gè)內(nèi)部子程序組成,它們能完成對(duì)I/O設(shè)備、文件、磁盤等的管理和操作。另一組是操作系統(tǒng)DOS為用戶提供的使用輸入輸出設(shè)備的系統(tǒng)資源,它不僅使用簡(jiǎn)單,而且可以確保所開發(fā)的軟件在同一操作系統(tǒng)下的兼容性。4.3 操作系統(tǒng)資源的使用 為方便程序員編寫輸入/輸出程序,系統(tǒng)提供了兩組功能程 1. 系統(tǒng)功能調(diào)用方法 系統(tǒng)功能調(diào)用INT 21H是一個(gè)有近90個(gè)子功能的中斷服務(wù)程序,這些子功能的編號(hào)稱為功能號(hào)。INT 21H的功能大致可以分為四個(gè)方面:設(shè)備管理、目錄管理、文件管理和其他

26、。設(shè)置功能號(hào)n(AH)設(shè)置入口參數(shù)執(zhí)行INT 21H分析出口參數(shù)4.3.1 DOS系統(tǒng)功能調(diào)用 1. 系統(tǒng)功能調(diào)用方法設(shè)置功能號(hào)n(AH)設(shè)置入口 2.基本I/O功能調(diào)用 (1)單個(gè)字符鍵盤輸入(1、7、8號(hào)功能) 執(zhí)行1號(hào)功能調(diào)用時(shí),系統(tǒng)將掃描鍵盤,等待用戶按鍵,一但有鍵按下,就將鍵值(相應(yīng)字符的ASCII碼值)讀入,先檢查是否是鍵,若是,則退出命令執(zhí)行;否則,將鍵值送入AL寄存器,同時(shí)將這個(gè)字符顯示在屏幕上。4.3.1 DOS系統(tǒng)功能調(diào)用 2.基本I/O功能調(diào)用 4.3.1 DOS系統(tǒng) MOV AH,1 INT 21H AH8與AH=1功能類同,只是不在屏幕上顯示輸入的字符:而AH=7 ,

27、則只將輸入字符的ASCII碼送入AL,不顯示,也不對(duì)字符做檢查是否是鍵。 4.3.1 DOS系統(tǒng)功能調(diào)用4.3.1 DOS系統(tǒng)功能調(diào)用 (2)單個(gè)字符輸出(2號(hào)功能) 執(zhí)行2號(hào)功能調(diào)用時(shí),要求將要顯示字符的ASCII碼(入口參數(shù))送給寄存器DL,顯示時(shí)光標(biāo)跟隨字符移動(dòng)。并檢查是否是,若是,則退出命令。 MOV DL, “:” MOV AH, 2 INT 21H 上述代碼實(shí)現(xiàn)將字符“:”送入屏幕顯示的功能。4.3.1 DOS系統(tǒng)功能調(diào)用 (2)單個(gè)字符輸出(2號(hào)功能)4.3.1 DOS系 (3)輸出字符串(9號(hào)功能) 執(zhí)行9號(hào)功能調(diào)用時(shí),要求DS:DX必須指向內(nèi)存中一個(gè)以“$”作為結(jié)束標(biāo)志的字符

28、串(入口參數(shù))。 BUF DB HOW DO YOU DO ?$ MOV DX, OFFSET BUF MOV AH, 9 INT 21H 如果希望光標(biāo)能自功換行,那么可在字符串結(jié)束字符$之前加上回車和換行的ASCII碼(0DH,0AH)。4.3.1 DOS系統(tǒng)功能調(diào)用 (3)輸出字符串(9號(hào)功能)4.3.1 DOS系統(tǒng) (4)字符串輸入(10號(hào)功能) 10號(hào)功能調(diào)用的功能是從鍵盤接收字符串并送到用戶指定的輸入緩沖區(qū)中,它要求DS:DX必須指向內(nèi)存中一個(gè)將要存放字符串的緩沖區(qū)的首地址。 BUF DB 30, ?, 30 DUP(?) MOV DX, OFFSET BUF MOV AH, 0AH

29、 INT 21H4.3.1 DOS系統(tǒng)功能調(diào)用 (4)字符串輸入(10號(hào)功能)4.3.1 DOS系 (5)程序結(jié)束返回操作系統(tǒng)(4C號(hào)功能) 執(zhí)行4C號(hào)功能調(diào)用時(shí),將使程序結(jié)束并返回操作系統(tǒng),一般在程序結(jié)束處,編寫指令: MOV AH,4CH INT 21H4.3.1 DOS系統(tǒng)功能調(diào)用 (5)程序結(jié)束返回操作系統(tǒng)(4C號(hào)功能)4. BIOS(Basic Input/Output System)是IBM-PC機(jī)的監(jiān)控程序,它固化在微型機(jī)主板的ROM中,它的內(nèi)容主要有系統(tǒng)測(cè)試程序(POST)、初始化引導(dǎo)程序(BOOT)、I/O設(shè)備的基本驅(qū)動(dòng)程序和許多常用程序模塊,它們一般以中斷服務(wù)程序的形式存在

30、。4.3.2 BIOS系統(tǒng)功能調(diào)用 BIOS(Basic Input/Output S4.3.2 BIOS系統(tǒng)功能調(diào)用4.3.2 BIOS系統(tǒng)功能調(diào)用 由圖可見,BIOS程序直接建立在硬件基礎(chǔ)上,磁盤操作系統(tǒng)(DOS)和其他操作系統(tǒng)建立在BIOS基礎(chǔ)上,各種高級(jí)語(yǔ)言則建立在操作系統(tǒng)基礎(chǔ)上。用戶程序可以使用高級(jí)語(yǔ)言,也可以調(diào)用DOS或其他操作系統(tǒng),還可以調(diào)用BIOS,甚至直接指揮硬件設(shè)備。4.3.2 BIOS系統(tǒng)功能調(diào)用 由圖可見,BIOS程序直接建立在硬件基礎(chǔ)上,磁盤操作 應(yīng)用程序調(diào)用DOS提供的系統(tǒng)功能,完成輸入/輸出或其他操作,用戶可以少考慮硬件,實(shí)現(xiàn)起來(lái)容易。優(yōu)點(diǎn)是程序的效率高,缺點(diǎn)是需

31、要程序員對(duì)硬件性能有較深的了解,編程復(fù)雜,所以一般不直接對(duì)硬件編程。 4.3.2 BIOS系統(tǒng)功能調(diào)用 應(yīng)用程序調(diào)用DOS提供的系統(tǒng)功能,完成輸入/輸出或 BIOS中斷程序處于DOS功能調(diào)用和硬件環(huán)境之間,和DOS功能調(diào)用相比,其優(yōu)點(diǎn)是效率高,缺點(diǎn)是編程相對(duì)復(fù)雜;和直接對(duì)硬件編程相比,優(yōu)點(diǎn)是實(shí)現(xiàn)相對(duì)容易,缺點(diǎn)是效率相對(duì)低。 (1) 有些功能DOS沒有提供,但BIOS提供了; (2) 有些場(chǎng)合無(wú)法使用DOS功能調(diào)用; (3) 其他原因。4.3.2 BIOS系統(tǒng)功能調(diào)用 BIOS中斷程序處于DOS功能調(diào)用和硬件環(huán)境之間,和4.4 匯編程序設(shè)計(jì) 程序是計(jì)算機(jī)命令(語(yǔ)句)的有序組合,這些語(yǔ)句的組合主要

32、有四大結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)。下面分別加以說(shuō)明。4.4 匯編程序設(shè)計(jì) 順序結(jié)構(gòu)的程序是一種最簡(jiǎn)單的程序,是沒有分支、沒有循環(huán)的直線運(yùn)行的程序。實(shí)際上,程序中大多數(shù)代碼段的指令都是順序執(zhí)行的,即使是循環(huán)程序和分支程序其主體部分也是順序執(zhí)行的。順序結(jié)構(gòu)作為完整的程序很少見,一般作為程序的部分使用。4.4.1 順序程序設(shè)計(jì)4.4.1 順序程序設(shè)計(jì) 例4-1 假設(shè)x、y為單字節(jié)正整數(shù),編程計(jì)算 Z=(x23y) / 2。 結(jié)果Z用兩個(gè)字節(jié)來(lái)存放。 根據(jù)題意,只要順序的計(jì)算出x2、3y和(x23y) / 2便可。4.4.1 順序程序設(shè)計(jì) 例4-1 假設(shè)x、y為單字節(jié)正整數(shù),編程計(jì)

33、算4.4DATA SEGMENT X DB 25 Y DB 32 Z DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV AL, X MUL AL ;求X2 4.4.1 順序程序設(shè)計(jì)DATA SEGMENT4.4.1 順序程序設(shè)計(jì) MOV BL, Y ADD BL, BL ;Y+Y ADD BL, Y ;Y+Y+Y SUB AX, BX ;X23Y SHR AX, 1 ;(X23Y)/ 2 MOV Z, AX ;結(jié)果送Z MOV AH, 4CH ;返回操作系統(tǒng) INT 21HCO

34、DE ENDS END START ;匯編結(jié)束4.4.1 順序程序設(shè)計(jì) MOV BL, Y 4.4.1 例4-2 用查表的方法將一位十六進(jìn)制數(shù)轉(zhuǎn)換成與它相應(yīng)的ASCII碼。 使用查表的方法,要建立一個(gè)表TABLE,在表中按照十六進(jìn)制數(shù)從小到大的順序放入它們對(duì)應(yīng)的ASCII碼值。然后再利用查表指令XLAT實(shí)現(xiàn)。編制的源程序如下: STACK1 SEGMENT STACK DW 20H DUP(0) ;建立堆棧段 STACK1 ENDS4.4.1 順序程序設(shè)計(jì) 例4-2 用查表的方法將一位十六進(jìn)制數(shù)轉(zhuǎn)換成與它相DATA SEGMENT TABLES DB 30H,31H,32H,33H,34H,3

35、5H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H HEX DB 04H ;假定要查的十六進(jìn)制數(shù)為4 ASCI DB ? ;存放查表的結(jié)果DATA ENDSCOSEG SEGMENT ASSUME CS:COSEG, DS:DATA, SS:STACK14.4.1 順序程序設(shè)計(jì)DATA SEGMENT4.4.1 順序程序BEING: MOV AX, DATA MOV DS, AX MOV BX, OFFSET TABLES MOV AL, HEX ;表內(nèi)位移量送AL XLAT ;查表 MOV ASCI,AL ;結(jié)果送ASCI MOV DL, AL MOV

36、 AH, 2 ;調(diào)用DOS中斷2號(hào) INT 21H MOV AH, 4CH ;返回操作系統(tǒng) INT 21HCOSEG ENDS END BEING4.4.1 順序程序設(shè)計(jì)BEING: MOV AX, DATA.2 分支程序設(shè)計(jì) 分支程序利用條件轉(zhuǎn)移指令對(duì)運(yùn)算結(jié)果的狀態(tài)標(biāo)志進(jìn)行判斷,以實(shí)現(xiàn)轉(zhuǎn)移功能。實(shí)現(xiàn)分支的要素有兩個(gè): (1)使用能影響狀態(tài)標(biāo)志的指令,如算術(shù)邏輯指令、移位指令和位測(cè)試指令等,將狀態(tài)標(biāo)志設(shè)置為能正確反映條件成立與否的狀態(tài)。 (2)使用條件轉(zhuǎn)移指令,對(duì)狀態(tài)位進(jìn)行測(cè)試判斷,確定程序如何轉(zhuǎn)移,形成分支。4.4.2 分支程序設(shè)計(jì) 分支程序利用條件4.4.2 分支程序設(shè)計(jì)4.

37、4.2 分支程序設(shè)計(jì) 例4-3 奇校驗(yàn)程序 標(biāo)準(zhǔn)ASCII碼的最高位沒有使用,可以用作傳輸?shù)男r?yàn)位。如果使包含校驗(yàn)位在內(nèi)的數(shù)據(jù)中“1”的個(gè)數(shù)恒定為奇數(shù),就是奇校驗(yàn)。程序首先通過(guò)鍵盤輸入一個(gè)字符,如果字符的ASCII碼中“1”的個(gè)數(shù)為奇數(shù),則令最高位為“0”,否則令最高位為“1”。程序如下:4.4.2 分支程序設(shè)計(jì) 例4-3 奇校驗(yàn)程序4.4.2 分支程序設(shè)計(jì)CODE SEGMENT ;定義代碼段,此題沒有數(shù)據(jù)段 ASSUME CS: CODESTART: MOV AH, 1 INT 21H ;鍵盤輸入, AL輸入字符的ASCII碼 AND AL, 7FH ;最高位置“0”、其他位不變 ;同時(shí)標(biāo)

38、志PF反映“1”的個(gè)數(shù) JNP NEXT ;個(gè)數(shù)為奇數(shù),不需處理,轉(zhuǎn)移 OR AL, 80H ;個(gè)數(shù)為偶數(shù),高位置“1”、其他位不變 NEXT: MOV AH, 4CH ;返回操作系統(tǒng) INT 21H CODE ENDS END START4.4.2 分支程序設(shè)計(jì)CODE SEGMENT ;定義代碼段 例4-4 編程計(jì)算下列函數(shù)的值,X取值范圍:128127。符號(hào)函數(shù)4.4.2 分支程序設(shè)計(jì) 例4-4 編程計(jì)算下列函數(shù)的值,X取值范圍:128DATA SEGMENT X DB -3 ;假定X=-3 Y DB ?DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS:

39、 DATASTART: MOV AX, DATA MOV DS, AX MOV AL, X CMP AL, 0 ;X和0比較 JGE BIGER ;X=0跳轉(zhuǎn)到4.4.2 分支程序設(shè)計(jì)DATA SEGMENT4.4.2 分支程序設(shè)計(jì) MOV AL, 0FFH ;X=0的程序段BIGER: JE EQUL ;X=0跳轉(zhuǎn)到EQUL MOV AL, 1 ;X0,1送Y單元 MOV Y, AL JMP NEXT ;跳過(guò)處理X=0的程序段EQUL: MOV Y, AL ;X=0,0送Y單元NEXT: MOV AH, 4CH ;返回操作系統(tǒng) INT 21HCODE ENDS END START4.4.2

40、分支程序設(shè)計(jì) MOV AL, 0F4.4.3 循環(huán)程序設(shè)計(jì) 1. 循環(huán)程序的組成 (1)循環(huán)初始化部分:主要是為一些變量賦上初值。循環(huán)初值分兩類:一類是循環(huán)工作部分的初值,別一類是控制循環(huán)結(jié)束條件的初值。 (2)循環(huán)體部分:需要重復(fù)執(zhí)行的程序段,是循環(huán)的主體。 (3)循環(huán)控制部分:用來(lái)保證循環(huán)程序按規(guī)定的次數(shù)或特定條件正常循環(huán),按一定規(guī)律修改操作數(shù)地址及控制變量,以便每次執(zhí)行循環(huán)體時(shí)得到新的數(shù)據(jù)。4.4.3 循環(huán)程序設(shè)計(jì) 1. 循環(huán)程序 2. 循環(huán)程序的結(jié)構(gòu) “當(dāng)”型循環(huán) “直到”型循環(huán)循環(huán)初始狀態(tài)循環(huán)控制條件循環(huán)體循環(huán)初始狀態(tài)循環(huán)控制條件循環(huán)體NYNY4.4.3 循環(huán)程序設(shè)計(jì) 2. 循環(huán)程序

41、的結(jié)構(gòu)循環(huán)初始狀態(tài)循環(huán)控制條件循環(huán)體 3. 循環(huán)控制的方法 (1)計(jì)數(shù)控制循環(huán) 將計(jì)數(shù)器的初值設(shè)置為循環(huán)次數(shù),以后每執(zhí)行一通循環(huán)體,使循環(huán)計(jì)數(shù)器減1,并測(cè)試計(jì)數(shù)器是否為0,若為0,則終止循環(huán);否則,繼續(xù)執(zhí)行循環(huán)體。這種方法稱為計(jì)數(shù)法,一般用循環(huán)指令LOOPLOOPELOOPNE進(jìn)行編程。4.4.3 循環(huán)程序設(shè)計(jì) 3. 循環(huán)控制的方法4.4.3 循環(huán)程序設(shè)計(jì) (2)條件控制法 對(duì)于循環(huán)次數(shù)不能預(yù)先確定的程序,只能根據(jù)循環(huán)過(guò)程中某個(gè)特定條件是否滿足來(lái)控制循環(huán)是繼續(xù)還是退出。這類通過(guò)測(cè)試特定條件來(lái)實(shí)現(xiàn)循環(huán)控制的方法稱為條件控制法。4.4.3 循環(huán)程序設(shè)計(jì) 4.4.3 循環(huán)程序設(shè)計(jì)例4-5 設(shè)計(jì)一個(gè)程

42、序,完成從1連加到100(1+2+99+100)的操作,結(jié)果存SUM。DATA SEGMENT SUM DW ? ;存放結(jié)果DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX4.4.3 循環(huán)程序設(shè)計(jì)例4-5 設(shè)計(jì)一個(gè)程序,完成從1連加到100(1+2+9;循環(huán)初始化 SUB AX, AX ;工作寄存器清零 MOV CX, 100 ;計(jì)數(shù)器賦初值 CLC ;清除進(jìn)位標(biāo)志;循環(huán)體開始LP: INC AX ADC SUM, AX LOOP LP ;循環(huán)控制 MOV AH, 4CH INT 21H

43、CODE ENDS END START4.4.3 循環(huán)程序設(shè)計(jì);循環(huán)初始化4.4.3 循環(huán)程序設(shè)計(jì)例4-7 將由小寫字母組成的字符串welcome轉(zhuǎn)換為大寫字母,并在屏幕上顯示。DATAS SEGMENT MSG DB welcome,$ DATAS ENDSCODES SEGMENT ASSUME CS:CODES, DS:DATASSTART: MOV AX, DATAS MOV DS, AX MOV BX,0 BX0指向第一個(gè)字母4.4.3 循環(huán)程序設(shè)計(jì)例4-7 將由小寫字母組成的字符串welcome轉(zhuǎn)換為大LOOP1: SUB MSGBX, a-A ;小寫減20H轉(zhuǎn)換為大寫 INC BX ;指向下一個(gè)字母 CMP MSGBX,$ ;不是$則繼續(xù)轉(zhuǎn)換 JNZ LOOP1 MOV DX,OFFSET MSG ;調(diào)用9號(hào)功能 MOV AH,9 INT 21H MOV AH,4CH INT 21HCODES ENDS END START4.4.3 循環(huán)程序設(shè)計(jì)LOOP1: SUB MSGBX, a-A 例4-8 從自然數(shù)1開始累加,直到累加和大于1000為止,統(tǒng)計(jì)被累加的自然數(shù)的個(gè)數(shù),并把統(tǒng)計(jì)的個(gè)數(shù)送入單元n中,把累加和送入單元sum中。開始AX=0, CX=0,BX=0BX=BX+1A

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論