版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第4章 匯編語言程序設(shè)計,4.1匯編語言程序格式 4.2MASM中的表達式 4.3偽指令語句 4.4DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用,4.1 匯編語言程序格式 4.1.1 程序結(jié)構(gòu),程序由數(shù)條語句構(gòu)成,每條語句占一行。語句分兩類: 指令性語句(指令語句):能譯成機器代碼,完成一定的操作功能的語句。 指示性語句(偽指令語句):為匯編程序在翻譯匯編語言源程序時提供有關(guān)控制信息,沒有相應(yīng)的機器代碼。,指令性(指令)語句與指示性(偽指令)語句區(qū)別: 程序經(jīng)匯編、連接和裝入內(nèi)存后,在執(zhí)行程序之前 指示性語句的功能已經(jīng)完成,故又稱偽操作。 而指令性語句的功能尚未完成,需控制CPU去執(zhí)行才能完成。,完成
2、兩個字節(jié)數(shù)據(jù)相加。 DATASEGMENT ; 偽指令語句 BUF1DB34H BUF2DB 2AH SUMDB? DATAENDS CODESEGMENT ASSUME CS:CODE,DS:DATA START:MOVAX,DATA ; 指令語句 MOVDS,AX MOV AL,BUF1 ADDAL,BUF2 MOVSUM,AL MOV AH,4CH INT21H;返回DOS CODEENDS ENDSTART,例 4-1 給出一個完整的匯編語言源程序,分段結(jié)構(gòu) 程序按段編寫, 與8086內(nèi)存分段編址相對應(yīng)。 每段由偽操作SEGMENT開始、由ENDS結(jié)束。 程序可由多個段構(gòu)成,至少有一個
3、代碼段。 程序最后為END結(jié)束語句,后跟一啟動地址。 啟動地址指示程序開始執(zhí)行的第一條語句。 程序中設(shè)有返回DOS的功能。 使程序執(zhí)行完后返回DOS系統(tǒng)的命令接受狀態(tài)。 程序中用到內(nèi)存操作數(shù)時, 應(yīng)按操作數(shù)的尋址方式,給相應(yīng)的段寄存器賦值,4.1.2 語句格式,* 指令助記符(操作碼)不可以省略,指令性語句,標(biāo)號: 指令助記符 操作數(shù),操作數(shù) ;注釋,格式:,偽指令語句,格式:,名字 偽指令指示符 操作數(shù),操作數(shù) ;注釋,根據(jù)語句功能的不同, 名字項可用來表示段名、變量名、 標(biāo)號、過程名等。,名字項用一個符號表示。 對符號的規(guī)定: 由字符AZ ,az ,09及符號、$、下劃線_ 等組成,最長3
4、1個字符,超出部分忽略。 不能用數(shù)字打頭,以免與十六進制數(shù)相混。 不使用匯編程序中的保留字。 (如指令的助記符等) 對定義的符號不區(qū)分大小寫。但為便于記憶,名字的定義應(yīng)該做到見名知意。,1、 名字項(提供符號地址),名字的兩種主要形式:標(biāo)號和變量 標(biāo)號: 在代碼段中定義,后面跟著冒號“:”,標(biāo)號作為目標(biāo)操作數(shù)經(jīng)常在轉(zhuǎn)移指令或調(diào)用指令中出現(xiàn),用以表示轉(zhuǎn)向地址。 標(biāo)號的三種屬性: 段屬性(SEGMENT):標(biāo)號所在段的段基值。 偏移地址屬性(OFFSET):標(biāo)號所在地址與其所在段首址之間的偏移地址字節(jié)數(shù)。 類型屬性(TYPE):反應(yīng)轉(zhuǎn)移過程中標(biāo)號可轉(zhuǎn)移的距離,類型NEAR為近標(biāo)號,只能實現(xiàn)段內(nèi)轉(zhuǎn)移
5、;類型FAR為遠標(biāo)號,可實現(xiàn)段間轉(zhuǎn)移。,變量: 變量在數(shù)據(jù)段、附加段或堆棧段中定義,后面不跟冒號。變量通常指存放在存儲單元中的值,在程序運行中是可以修改的。 變量的三種屬性: 段屬性(SEGMENT):變量所在段的段基值。 偏移地址屬性(OFFSET):變量所在地址與其所在段首址之間的偏移地址字節(jié)數(shù)。 類型屬性(TYPE):指變量中每個元素所包含的字節(jié)數(shù),類型有:字節(jié)變量(BYTE)、字變量(WORD)及雙字變量(DWORD)等。,* 在同一個程序中,同樣的標(biāo)號或變量的定義只允許出現(xiàn)一次,否則匯編程序會指示出錯。,操作碼可以是指令、偽指令中的助記符,用以指明操作的性質(zhì)或功能。,對于指令,匯編程
6、序?qū)⑵浞g成機器語言指令。 MOV AX, 100 B8 00 01,對于偽指令,匯編程序據(jù)其要求的功能進行處理。 data SEGMENT data與一段基值對應(yīng) string DB Tsinghua string與一內(nèi)存地址對應(yīng),2、 操作碼項(不可省略),操作數(shù)給出參與操作的數(shù)或數(shù)所在的地方。 操作數(shù)多于一個時,用逗號分開。 操作數(shù)可以是常數(shù)、寄存器、存儲器操作數(shù)、變量、 標(biāo)號、過程名或表達式(下一節(jié)介紹)等。,3、操作數(shù)項,由分號引出,用來說明語句或程序的功能。 匯編程序?qū)Ψ痔柡蟮膬?nèi)容不做處理。 作用: 注釋程序,增強程序可讀性。 可放在語句最前,暫時注釋某語句,調(diào)試程序用。 例: 、
7、 ; MOV AH, 2 ;顯示提示信息 ; MOV DL, A ; INT 21H 、,4、注釋項,表達式 表達式由運算對象(常量、標(biāo)號、變量)及運算符組成。 匯編程序?qū)Ρ磉_式進行運算后,得到一個確定的數(shù)值,再把這個數(shù)值匯編到指令中。 運算結(jié)果可以是一個常數(shù)字,也可以是一個存儲器的地址。故表達式分?jǐn)?shù)字表達式、地址表達式。 表達式是指令或偽操作的操作數(shù); 表達式中的操作符由匯編程序完成 例 MOV AX, 12 - 4 ;MOV AX, 8 ;數(shù)字表達式 LEA BX, string + 4 ;地址表達式,4.2MASM中的表達式,表達式中的操作符(參考P128 表4-1) 有以下幾類: 1)
8、. 算術(shù)運算符 ( +、-、*、/、MOD ) 2). 邏輯運算符 ( AND、OR、NOT、XOR ) 3). 關(guān)系運算符 ( EQ、NE、GT、GE、LT、LE ) 真:FFFFH; 假: 0 4). 數(shù)值返回操作符 ( SEG、OFFSET、TYPE、LENGTH、SIZE ) 5). 修改屬性操作 ( PTR ) 6). 地址記數(shù)器( $ ),例: 1). 算術(shù)運算符 ( +、-、*、/、MOD(取余數(shù)) ) MOV AX, 6 * 8 MOV AX, 48 2). 邏輯運算符 (AND、OR、NOT、XOR) MOV AX, 80h OR 70h MOV AX,0F0h 3). 關(guān)系
9、運算符 ( EQ、NE、GT、GE、LT、LE ) 真:FFFFH; 假: 0 MOV AX, 1 GE 2 MOV AX, 0,* 表達式只是一個成份,不能單獨構(gòu)成語句。,SEG 取符號地址(變量或標(biāo)號)的段地址 例 MOV AX , SEG yy OFFSET 取符號地址(變量或標(biāo)號)的偏移地址 例 MOV BX , OFFSET yy,bb SEGMENT yy DB 6 dup (?) bb ENDS cc SEGMENT ASSUME CS:cc, DS:aa, ES:bb start : CLD MOV AX , SEG yy MOV ES , AX MOV DI , OFFSET
10、 yy MOV CX , 6 . cc ENDS END start,4). 數(shù)值返回操作符,aa SEGMENT xx DB Hello! aa ENDS bb SEGMENT yy DB 6 dup (?) bb ENDS cc SEGMENT ASSUME CS:cc, DS:aa, ES:bb start : CLD MOV AX , aa MOV DS , AX LEA SI , xx MOV AX , SEG yy MOV ES , AX MOV DI , OFFSET yy MOV CX , 6 REP MOVSB MOV AH , 4CH INT 21H cc ENDS END
11、 start,D:DEBUG hello1.exe -U ;查看程序代碼 129F:0000 FC CLD 129F:0001 B89D12 MOV AX , 129D 129F:0004 8ED8 MOV DS , AX 129F:0006 8D360000 LEA SI , 0000 129F:000A B89E12 MOV AX , 129E 129F:000D 8EC0 MOV ES , AX 129F:000F BF0000 MOV DI , 0000 129F:0012 B90600 MOV CX, 0006 129F:0015 F3 REP 129F:0016 A4 MOVSB
12、129F:0017 B44C MOV AH, 4C 129F:0019 CD21 INT 21 、,TYPE 取符號地址(變量或標(biāo)號)的類型屬性 例 A1DB 20H,30H A2DW 0438H MOV AL, TYPE A1 MOV AH, TYPE A2 匯編時形成指令 MOV AL, 1 MOV AH, 2,LENGTH 取變量的長度屬性 例 A1DW 100 DUP (?) A2DW 1,2,3 MOV CX, LENGTH A1 MOV AH, LENGTH A2 匯編時形成指令 MOV CX, 100;使用DUP時,返回此變量包含的單元數(shù)為100個字。 MOV AH, 1;對其他
13、情況則返回1。,SIZE 取變量的總字節(jié)數(shù) SIZE=LENGTH*TYPE 例 A1DW 100 DUP (?) A2DW 1,2,3 MOV CX, SIZE A1 MOV AH, SIZE A2 匯編時形成指令 MOV CX, 200 MOV AH, 2,5). PTR 修改屬性操作符,格式:類型/距離 PTR 變量或標(biāo)號 功能:將PTR左邊的類型屬性賦給右邊的變量或標(biāo)號。 常用類型:BYTE、WORD、DWORD、NEAR、FAR 例:MOVBYTE PTR BX,10; BX 10H MOVWORD PTR BX,10; BX,BX+1 0010H,4.3 偽指令語句 4.3.1 定
14、義符號的偽指令1、賦值偽指令EQU,格式: 符號名 EQU 需等值的表達式 作用: 用符號名等值指定的表達式 其中, 表達式可以是任何有效的操作數(shù) 匯編時用語句中的表達式代替程序中符號所在的地方。 應(yīng)用: 1. 定義符號常量,方便修改程序。 2. 某表達式多次出現(xiàn)時,用等值偽操作可以方便編程。 例:COUNTEQU 5,舉例 CONSTANTEQU256 ;將數(shù)256賦以符號名CONSTANT DATA EQUHEIGHT+12 ;HEIGHT為一標(biāo)號,地址表達式賦以符號名DATA ALPHA EQU7 BETA EQUALPHA2 ;這是一組賦值偽操作,把72=5賦以符號名BETA ADDR
15、 EQUVAR + BETA ;將VAR+5賦以符號名ADDR B EQUBP+8 ;變址引用賦以符號名B P8 EQUDS:BP+8 ;加段前綴的變址引用賦以符號名P8,2、等號偽指令“=”,“=”與EQU 相類似,也可作為賦值操作使用。它們之間的區(qū)別: EQU偽操作中的表達式名是不允許重復(fù)定義的,而“=”偽操作則允許重復(fù)定義。,3、解除定義偽指令PURGE 格式:PURGE 功能:解除指定符號的定義。解除符號定義后,可用EQU重新進行定義。 例: Y1EQU 7 ; 定義 PURGEY1 ;解除 Y1EQU 36 ;重新定義,格式 變量名 類型助記符 操作數(shù) ,操作數(shù) , . ;注釋 用來
16、定義程序中所用的內(nèi)存操作數(shù),并用變量與存儲單元建立聯(lián)系。 其中變量名:指示內(nèi)存操作數(shù)的地址(符號地址) 類型助記符:指示內(nèi)存操作數(shù)的類型(字節(jié)、字、雙字等) 常用的類型助記符有: DB 指示其后的操作數(shù)為字節(jié)類型 DW 指示其后的操作數(shù)為字類型 DD 指示其后的操作數(shù)為雙字類型 匯編程序?qū)⒍x的操作數(shù),按其類型分配內(nèi)存單元數(shù)。 *其它類型:DQ(4個字) DT(10個字節(jié)) 操作數(shù):指示內(nèi)存操作數(shù)的內(nèi)容順序存入變量名指向的內(nèi)存單元中。,4.3.2 定義數(shù)據(jù)的偽指令,定義數(shù)據(jù)偽指令應(yīng)用: 可以把其后跟著的數(shù)據(jù)存入指定的存儲單元,形成初始化數(shù)據(jù)。 或者只分配存儲空間而并不存入確定的數(shù)值,形成未初始
17、化數(shù)據(jù)空間。 DW和DD偽指令還可存儲地址。,例1: 定義賦初值的變量 data SEGMENT xx DB 1, -1, 0fcH yy DW 1, -1, 0fcH zz DD 1,- 1, 0fcH data ENDS,* 操作數(shù)可以是常量,或者是表達式。,例2: 定義字符串變量( 只能用DB定義 ) data SEGMENT str1 DB TsingHua str2 DB INPUT: , 0dH , 0aH ,$ data ENDS,例3:DBAB 和 DW AB的存儲有區(qū)別,參看書 P136 圖4.2 (b)、(c),操作數(shù)可以是用常量、表達式和 ? 表示。 常量和表達式表示內(nèi)存
18、操作數(shù)的初始值,其值應(yīng)在其定義的類型范圍內(nèi),否則匯編出錯。 例 aa DB 270;錯誤 bb DW 80000;錯誤 用 ? 表示只保留存儲空間,不置初始值的內(nèi)存操作數(shù)。 例 cc DB ? 可用 DUP 復(fù)制操作符定義相同的操作數(shù),其格式為: 重復(fù)次數(shù) DUP( 操作數(shù)) 例 ee DB 3 DUP ( 4 ) 等價于 ee DB 4, 4, 4,data SEGMENT xx DB 1, -1, 0FCH yy DW 1,- 1, 0FCH zz DD 1, -1, 0FCH str DB TsingHua buf DB 4, ?,4 DUP (?) DB dataend data EN
19、DS code SEGMENT ASSUME CS:code ASSUME DS:data start: MOV AX , data MOV DS , AX LEA BX , xx LEA SI , yy LEA DI , zz LEA BX, str LEA SI ,buf MOV AH , 4CH INT 21H code ENDS END start,例4: 在DEBUG下查看變量存放情況。,格式 NAME 模塊名 格式 TITLE 模塊名 在源程序開始可用 NAME 或 TITLE 為模塊命名, 模塊名的作用是指示給連接程序進行連接用。 源程序中可無模塊定義,此時源文件名作為模塊名。,
20、4.3.3 定義程序開始和結(jié)束的偽指令1 、 NAME 和 TITLE 偽操作,格式 END 啟動地址標(biāo)號 作用是指示源程序到此結(jié)束。 匯編程序?qū)?END 之后的語句不進行處理。 程序中所有有效語句應(yīng)放在 END 語句之前, 多個模塊連接時,則只有主模塊要使用標(biāo)號,程序 從主模塊第一個標(biāo)號處開始執(zhí)行。 源程序中必須有 END 結(jié)束語句。 匯編程序?qū)oEND語句的源程序會給出錯誤信息。,2、 END偽操作,啟動地址可是一個標(biāo)號或過程名, 指示程序的入口。 程序裝入內(nèi)存后,系統(tǒng)跳轉(zhuǎn)到入口處, 開始執(zhí)行程序。,4.3.4 指令集選擇偽指令(略)匯編程序默認(rèn)值為.8086指令系統(tǒng),4.3.5 地址計數(shù)
21、器與對準(zhǔn)偽操作1、地址計數(shù)器$,匯編過程中使用地址計數(shù)器來保存當(dāng)前正在匯編的指令的偏移地址,地址計數(shù)器的值可用$來表示。 $用在指令中時,表示當(dāng)前地址,即本條指令的第一個字節(jié)的地址。 例: JNE $,2、ORG偽操作,作用: 用來設(shè)置當(dāng)前地址計數(shù)器的值。當(dāng)用戶要求指定某條指令或數(shù)據(jù)為某個指定地址時,可用ORG語句來改變,ORG語句可以放在程序的任何位置。 格式:ORG表達式 例:VECTSEGMENT ORG10 VECT1DW47A5H ORG20 VECT2DW0C596H VECTENDS,4.3.6 匯編語言源程序段結(jié)構(gòu)定義1、完整段定義的程序結(jié)構(gòu),段定義偽操作 段名 SEGMENT
22、 、 段名 ENDS 段定義由偽操作SEGMENT開始、ENDS結(jié)束。 其中: SEGMENT 和ENDS 必須成對出現(xiàn),且語句前必須有段名,段名必須相同。 SEGMENT和ENDS語句之間可以有指令和其他偽操作指令。 程序中可以定義多個段。程序經(jīng)匯編、連接及裝入內(nèi)存后,段名為一具體的段值。,ASSUME偽操作 格式: ASSUME 段寄存器:段名 , 段寄存器:段名, 其中 段寄存器為CS、DS、ES、SS中的一個 段名為用偽操作SEGMENT定義過的段名 例 ASSUME CS: cc , DS:aa 作用:用來明確段和段寄存器之間的關(guān)系。 說明:ASSUME語句只起指示作用,沒有賦值作用
23、,并不能把段地址裝入段寄存器中,因此在程序中需用指令(如MOV)給相應(yīng)的段寄存器賦值。但是,代碼段CS除外,CS的裝入是在程序初始化時完成的。 ASSUME NOTHING則可取消前面由ASSUME所指定的段寄存器。,例 用程序?qū)崿F(xiàn) 1234H + 5678H,data SEGMENT value DW 1234H, 5678H result DW ? data ENDS code SEGMENT ASSUME CS:code, DS:data start: MOV AX, data ;給DS賦值 MOV DS, AX MOV AX, value ;取數(shù) ADD AX, value+2 ;兩數(shù)
24、相加 MOV result, AX ;保存結(jié)果 MOV AH, 4CH ;返回DOS INT 21H code ENDS END start,注意: 程序裝入內(nèi)存后,執(zhí)行程序前, 當(dāng)前的DS值并非程序定義的data段值, 1295 不等于 12A5,思考: 如果上例中沒有 MOV DS , AX 程序執(zhí)行的結(jié)果會怎樣?,D:MASMDEBUG assume.exe -R ;查看程序執(zhí)行前各寄存器 AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=1295 ES=1295 SS=12A5 CS=12A6 IP=0
25、000 NV UP EI PL NZ NA PO NC 12A6:0000 B8A512 MOV AX,12A5 -U ;查看在內(nèi)存的程序 12A6:0000 B8A512 MOV AX, 12A5 12A6:0003 A10000 MOV AX, 0000 12A6:0006 03060200 ADD AX, 0002 12A6:000A A30400 MOV 0004 , AX 12A6:000D B44C MOV AH, 4C 12A6:000F CD21 INT 21 、,data SEGMENT value DW 1234H, 5678H result DW ? data ENDS
26、code SEGMENT ASSUME CS:code, DS:data start: MOV AX, data ;給DS賦值 ; MOV DS, AX MOV AX, value ;取數(shù) ADD AX, value+2 ;兩數(shù)相加 MOV result, AX ;保存結(jié)果 MOV AH, 4CH ;返回DOS INT 21H code ENDS,2、偽指令SEGMENT的完整格式,格式:段名 SEGMENT 定位類型 組合類型 類別 、 段名 ENDS 說明:SEGMENT后面可以帶參數(shù),參數(shù)必須按格式中規(guī)定的次序排列,分類名必須用單引號括起來。一般情況下這些參數(shù)可以省略,如果需要多模塊連接
27、,則要用到這些參數(shù)。,定位類型: PARA(缺省值):指定該段起始地址定位在節(jié)(16字節(jié))的整數(shù)邊界(末4位地址為0)。 BYTE:指定該段起始地址定位在任何字節(jié)地址。 WORD:指定該段起始地址定位在字邊界(末位地址為0 )。 DWORD:指定該段起始地址定位在雙字邊界(末2位地址為0)。 PAGE:指定該段起始地址定位在頁(256字節(jié))邊界(末8位地址為0)。,組合類型: 用于說明程序連接時段的合并方法。 PRIVATE(缺省值): 連接時該段不與其它模塊中的同名段合并。 PUBLIC: 連接時把不同模塊中的同名段順序連接合并為一個段。 COMMON: 連接時把不同模塊中的同名段重疊而形成
28、一個段。 AT 表達式: 定位該段的起始地址在表達式所指定的節(jié)邊界上。 MEMORY: (略) STACK: 指定該段為堆棧段,此參數(shù)在堆棧段中不可省略。多個模塊只需設(shè)置一個堆棧段,各個模塊中的堆棧段采用覆蓋方式組合,容量為各個模塊中所設(shè)置的最大堆棧容量。 類別名(CLASS ): 在引號中給出連接時組成段組的類型名。匯編連接時類別名相同的邏輯段組成一個段組(物理位置靠在一起)。,4.3.7 子程序結(jié)構(gòu)形式與操作1、子程序(過程)定義,子程序(過程)定義偽操作 格式 過程名 PROC 類型 、 過程名 ENDP 子程序(過程)定義由偽操作PROC開始、ENDP結(jié)束。 其中: PROC 和END
29、P 必須成對出現(xiàn), 且語句前必須有過程名,過程名必須相同。,2、說明 PROC和ENDP語句之間為子程的指令序列。 程序中可以定義多個過程。 程序經(jīng)匯編、連接及裝入內(nèi)存后, 過程名為一具體的內(nèi)存地址,指示子程入口。,過程名常用作CALL調(diào)用指令的操作數(shù), 子程的最后安排RET返回指令,使執(zhí)行完子程后能返回調(diào)用處。 過程有兩種類型:NEAR和FAR ,無類型項時,默認(rèn)為NEAR類型。 當(dāng)過程與調(diào)用指令不在同一段時,應(yīng)將過程定義為 FAR 類型。過程類型決定子程中RET的返回類型。 匯編程序用PROC偽操作的類型來確定CALL和RET指令的屬性。,例3:調(diào)用程序和子程序在同一代碼段中。 MAIN
30、PROCFAR : CALLSUBR1 : RET MAIN ENDP SUBR1 PROC NEAR : RET SUBR1 ENDP,DOS把主程序看作一個FAR類型子程加以調(diào)用,故應(yīng)把主程序定義為FAR類型。,例4:調(diào)用程序和子程序不在同一代碼段中。 SEGX SEGMENT : SUBT PROCFAR : RET SUBT ENDP : CALL SUBT SEGX ENDS SEGY SEGMENT : CALL SUBT : SEGY ENDS,4.3.8LABEL 偽指令,LABEL偽指令給已定義的變量或標(biāo)號取另一個名字(別名),并可重新定義它的類型屬性,使同一變量或標(biāo)號在不同
31、地方被引用時,可采用不同的名字,具有不同的類型屬性,但它們具有相同的地址屬性。 格式:名稱LABEL類型屬性,例:DATB LABEL BYTE; DATB為DATW的別名 DATW DW 3031H,3233H; MOV AL,DATB0; (AL)=31H MOV BX,DATW1; (BX)=3330H 例:STACK SEGMENT STACK STACK DW 100 DUP(?); 堆棧中經(jīng)常使用LABEL。 TOP LABEL WORD; TOP為棧底名,類型為字。 STACK ENDS;如用指令MOV SP , OFFSET TOP,4.4DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用4
32、.4.1 DOS功能調(diào)用,DOS是PC/XT的操作系統(tǒng),負責(zé)管理系統(tǒng)的所有資源,DOS中包括了許多可供用戶調(diào)用的子程序。,用戶調(diào)用DOS功能的途徑: * 在DOS環(huán)境下,鍵入DOS命令; * 通過用戶程序調(diào)用DOS和BIOS中的服務(wù)程序。,1、DOS功能調(diào)用概述 利用軟中斷指令 INT n 調(diào)用相應(yīng)的中斷服務(wù)程序。 n= 0 4 ;8088/8086CPU占用 n=51FH; BIOS功能調(diào)用 n=203FH; DOS功能調(diào)用 其中INT 21是一個具有100多個子功能的中斷服務(wù)程序,分別用于設(shè)備管理,目錄管理,文件管理及其它功能。 2、 DOS功能調(diào)用方法 1) DOS軟中斷( INT 20
33、H INT 27H )指令 參見教材 P153 表4-4,表4-4 DOS軟中斷,2)DOS系統(tǒng)功能調(diào)用(INT 21H),有上百個子功能中斷服務(wù)程序,功能大致分設(shè)備管理、文件管理等4個方面,每個子功能有一個功能號。 調(diào)用方法,在AH設(shè)置功能號m,常用DOS系統(tǒng)功能調(diào)用 (21H類型中斷調(diào)用) 1顯示單字符 ( 02H功能 ) 2顯示字符串 ( 09H功能 ) 3單字符輸入 ( 01H、07H、08H功能 ) 4字符串輸入 ( 0AH功能 ) 5檢測鍵盤狀態(tài) ( 0BH功能 ) 6. 返回操作系統(tǒng)( 4CH功能 ) 7保存中斷向量 ( 35H功能 ) (后面章節(jié)介紹) 8設(shè)置中斷向量 ( 25
34、H功能 ),入口參數(shù) DL = 要顯示字符的ASCII 碼 功能號 AH=02H 類型號 INT 21H 出口參數(shù) 無 實現(xiàn)功能 顯示指定字符,光標(biāo)隨動。,例 顯示字符A MOV DL, A MOV AH, 02H INT 21H,1. 顯示單字符 ( 02H功能 ),例 使光標(biāo)回到下一行的行首。 MOV DL , 0DH ;顯示回車符 MOV AH , 02H INT 21H MOV DL , 0AH ;顯示換行符 MOV AH , 02H INT 21H,入口參數(shù) 定義要顯示的字符串, 字符串尾應(yīng)為$,作為結(jié)束顯示的標(biāo)志。 DS : DX = 字符串的首地址 功能號 AH = 09 H 類
35、型號 21H 出口參數(shù) 無 實現(xiàn)功能 顯示字符串,遇 $ 停止顯示,光標(biāo)隨動。,2. 顯示字符串 ( 09H功能 ),例 編程顯示字符串Wuhan University,data SEGMENT ;定義顯示的子符串 stri DB Wuhan University, $ data ENDS code SEGMENT ASSUME CS:code, DS:data start: MOV AX, data ;置緩沖區(qū)地址于DS:DX MOV DS, AX LEA DX, stri MOV AH, 09H ;調(diào)顯示功能 INT 21H MOV AH, 4CH ;返回DOS INT 21H code
36、ENDS END start, 鍵盤通過鍵盤接口電路與計算機連接。 鍵盤上的鍵有三種類型: 字符鍵 AZ, 09等 功能鍵 F1F12, BackSpace,Page Up等 組合控制鍵 Shift, Ctrl, Alt等, 鍵盤上的每個鍵都有一個掃描碼。 據(jù)掃描碼可確定操作的是哪個鍵、是按下鍵還是釋放鍵; 掃描碼用一個字節(jié)表示。 低7位是掃描碼的數(shù)字編碼, 與鍵盤上的鍵一一對應(yīng); 最高位D7位表示鍵的操作狀態(tài): 當(dāng)按下鍵時, D7=0 ; 當(dāng)釋放鍵時, D7=1,學(xué)習(xí)輸入功能前介紹有關(guān)鍵盤 的一些知識, 鍵盤中斷子程功能(09H類型中斷子程) 從鍵盤接口讀取操作鍵的掃描碼; 將掃描碼轉(zhuǎn)換成字
37、符碼; 大部分鍵的字符碼為ASCII碼, 無ASCII碼鍵(如組合鍵Shift、Ctrl等)的字符碼為0。 將鍵的掃描碼、字符碼存放在鍵盤緩沖區(qū), 供其它有關(guān)鍵盤的中斷子程應(yīng)用。, 鍵盤接口對按下鍵和釋放鍵均向計算機發(fā)出中斷申請, 如果中斷響應(yīng)條件滿足, CPU轉(zhuǎn)去執(zhí)行鍵盤中斷子程。 鍵盤中斷子程類型號為09H。, 入口參數(shù) 無 功能號 AH = 01H 類型號 21H 出口參數(shù) AL = 鍵入字符的ASCII碼 實現(xiàn)功能 等待從鍵盤輸入一個字符, 并在屏幕上回顯,光標(biāo)移動, 檢測Ctrl-Break鍵,3. 單字符輸入 ( 01H、07H、08H功能),例 利用鍵盤輸入的字符產(chǎn)生分支: MO
38、V AH, 1 ;等待從鍵盤輸入 INT 21H CMP AL, Y ;是Y? JZ yes CMP AL, y ;是y? JZ yes no: . . . . . . JMP exit yes: . . . . . . exit: . . .,例 在中斷向量表中查找從鍵盤輸入的字符, 并將其個數(shù)用二進制形式顯示出來。( scanskey.asm), 入口參數(shù) 無 功能號 AH = 07H 類型號 21H 出口參數(shù) AL = 鍵入字符的ASCII碼 實現(xiàn)功能 等待從鍵盤輸入一個字符, 不在屏幕上回顯, 不檢測Ctrl-Break鍵 *功能號 AH = 08H (無回顯,但檢測Ctrl-Brea
39、k鍵),例 用不帶回顯功能輸入密碼時: input: MOV AH, 07H ;等待從鍵盤輸入 INT 21H MOV DI, AL ;存入緩沖區(qū) CMP AL, 0DH ;是回車符? JNZ input ;不是,繼續(xù)輸入 check: 、 、,入口參數(shù) DS : DX = 緩沖區(qū)的首地址 ( DS :DX ) = 用戶定義的最大輸入的字符數(shù) 功能號 AH = 0AH 類型號 21H 出口參數(shù) ( DS : DX+1 ) = 實際鍵入的字符(不含回車符) 從( DS : DX+2 )開始順序存放鍵入的字符串, 回車符0DH為串尾最后一字符。 實現(xiàn)功能 等待從鍵盤輸入字符串,并存入設(shè)定的緩沖區(qū)內(nèi)
40、, 同時回顯字符串,光標(biāo)隨著移動, 回車符使光標(biāo)回到行首。 注意事項:應(yīng)按要求先定義緩沖區(qū),再調(diào)用。,4. 字符串輸入 ( 0AH 功能 ),例 應(yīng)用0AH功能輸入字符串。,data SEGMENT ;定義緩沖區(qū) max DB 11 ;定義限制最多輸入個數(shù) lenth DB ? ;用于存放實際輸入個數(shù) stri DB 11 DUP(?) ;用于存放輸入的字符串 data ENDS code SEGMENT ASSUME CS:code, DS:data start: MOV AX , data ;置緩沖區(qū)地址于DS:DX MOV DS , AX LEA DX , max MOV AH , 0A
41、H INT 21H ;調(diào)0A輸入功能 MOV CH , 0 MOV CL , lenth ;取字符串長度放CX中 LEA BX , stri ;取字符串首址于BX中 MOV AL , BX ;應(yīng)用輸入字符 、 code ENDS,data SEGMENT ;定義緩沖區(qū) max DB 11 ;定義限制最多輸入個數(shù) lenth DB ? ;用于存放實際輸入個數(shù) stri DB 11 DUP(?) ;用于存放輸入的字符串 data ENDS 從鍵盤輸入ABCD, 回車,內(nèi)存的存放結(jié)果:,0AH功能執(zhí)行過程: 若(DS:DX)字節(jié)單元的值為0,則不等待從鍵盤輸入,結(jié)束調(diào)用。 若(DS:DX) 字節(jié)單元
42、的內(nèi)容大于0,則等待從鍵盤輸入, 并把輸入鍵的ASCII碼順序存放在DS : DX+2開始的單元, 按回車鍵表示結(jié)束輸入。 當(dāng)按下鍵的個數(shù)超過( DS : DX )中值,發(fā)出警告聲 嘟嘟 , 不再接收輸入的數(shù)據(jù), 直到輸入回車鍵。 將實際輸入的字符個數(shù)(不包括回車鍵)填入(DS:DX+1), 結(jié)束調(diào)用。,0AH功能注意事項: 輸入的字符均帶回顯,且光標(biāo)隨字符移動。 當(dāng)輸入回車符結(jié)束時,也回顯回車符。 表現(xiàn)為功能調(diào)用結(jié)束后,光標(biāo)回到了行首。 回車符0DH作為一個輸入的字符存放在字符串尾, 但計數(shù)輸入個數(shù)時,不包括回車鍵。 實際最多能輸入的字符數(shù) = 限制的最多數(shù)-1 (回車符占一個) 執(zhí)行完0A
43、H功能后,DS和DX的值不變, DS:DX仍指向緩沖區(qū)的首地址。 整個緩沖區(qū)的大小應(yīng)為:限制的最多數(shù) +2 max DB 11, ? , 11 dup (?),例 利用DEBUG查看0A功能輸入結(jié)果。(與上例功能相同),data SEGMENT max DB 11, ?, 11 DUP(?) data ENDS code SEGMENT ASSUME CS:code, DS:data start: MOV AX, data ;置緩沖區(qū)地址于DS:DX MOV DS, AX LEA DX, max MOV AH, 0AH ;調(diào)輸入功能 INT 21H MOV CH, 0 MOV CL, max+
44、1 ;取輸入長度到CX中 MOV AH, 4CH ;返回DOS INT 21H code ENDS END start,D:MASMDEBUG TEST0a.exe ;裝入執(zhí)行文件 -U ;反匯編程序 129E:0000 B89D12 MOV AX , 129D 129E:0003 8ED8 MOV DS , AX 129E:0005 8D160000 LEA DX , 0000 129E:0009 B40A MOV AH , 0A 129E:000B CD21 INT 21 129E:000D B500 MOV CH , 00 129E:000F 8A0E0100 MOV CL , 0001
45、 129E:0013 B44C MOV AH , 4C 129E:0015 CD21 INT 21 、 -D 129D:0 L10 ;查看程序執(zhí)行前緩沖區(qū)內(nèi)容 129D:0000 0B 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 . -G 000D ;執(zhí)行程序 Hello ;從鍵盤輸入字符串 Program terminated normally -D 129D:0 L10 ;查看程序執(zhí)行后緩沖區(qū)內(nèi)容 129D:0000 0B 05 48 65 6C 6C 6F 0D-00 00 00 00 00 00 00 00 .Hello. -,思考: 1.
46、 若將程序改為如下形式, 設(shè)想程序執(zhí)行的結(jié)果。,data SEGMENT max DB 100H DUP ( ? ) data ENDS code SEGMENT ASSUME CS:code, DS:data start: MOV AX, data ;置緩沖區(qū)地址于DS:DX MOV DS, AX LEA DX, max MOV AH, 0AH ;調(diào)輸入功能 INT 21H MOV AH, 4CH ;返回DOS INT 21H code ENDS END start,結(jié)果是:不等待輸入,結(jié)束0AH功能調(diào)用。,2. 若將程序改為如下形式, 設(shè)想程序執(zhí)行的結(jié)果。,data SEGMENT max
47、 DW 100H,? ,100H DUP ( ? ) ;定義為字類型 data ENDS code SEGMENT ASSUME CS:code, DS:data start: MOV AX, data ;置緩沖區(qū)地址于DS:DX MOV DS, AX LEA DX, max MOV AH, 0AH ;調(diào)輸入功能 INT 21H MOV AH, 4CH ;返回DOS INT 21H code ENDS END start,結(jié)果是:不等待輸入,結(jié)束0AH功能調(diào)用。,DOS 功能調(diào)用應(yīng)用舉例,D:MASMDEBUG e0a09.exe -U ;查看程序 129F:0000 B89D12 MOV AX,129D 129F:0003 8ED8 MOV DS,AX
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit 4 school days further study說課稿 -2024-2025學(xué)年譯林版七年級英語上冊
- Unit 1 How can I get there Part A Lets learn(說課稿)-2024-2025學(xué)年人教PEP版英語六年級上冊
- 2025年小學(xué)語文教研組工作計劃范例
- 美發(fā)裁剪知識培訓(xùn)課件
- 板材卷材:普中板行業(yè)相關(guān)投資計劃提議
- 臨空經(jīng)濟行業(yè)相關(guān)投資計劃提議范本
- 2025年秋季初中教研工作計劃
- 潤滑油脂行業(yè)相關(guān)投資計劃提議范本
- 噪聲污染治理相關(guān)行業(yè)投資方案范本
- 智能壓力校驗儀相關(guān)項目投資計劃書
- 物業(yè)項目經(jīng)理崗位競聘
- 第8課《蒲柳人家(節(jié)選)》教學(xué)設(shè)計-2023-2024學(xué)年統(tǒng)編版語文九年級下冊
- 幼兒沙池活動指導(dǎo)方法
- 2024年冬季校園清雪合同
- 翻譯美學(xué)理論
- 15J403-1-樓梯欄桿欄板(一)
- 中國傳統(tǒng)樂器蕭介紹
- 2024屆華中師范大學(xué)新高三第一次聯(lián)考試題
- 小學(xué)食堂食品添加劑管理制度
- 第3章《物態(tài)變化》大單元教學(xué)設(shè)計- 2023-2024學(xué)年人教版八年級物理上冊
- 領(lǐng)導(dǎo)對述職報告的點評詞
評論
0/150
提交評論