微機原理與接口技術PPT_第4章 匯編語言程序設計.ppt_第1頁
微機原理與接口技術PPT_第4章 匯編語言程序設計.ppt_第2頁
微機原理與接口技術PPT_第4章 匯編語言程序設計.ppt_第3頁
微機原理與接口技術PPT_第4章 匯編語言程序設計.ppt_第4頁
微機原理與接口技術PPT_第4章 匯編語言程序設計.ppt_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第4章 匯編語言程序設計,4.1匯編語言程序格式 4.2MASM中的表達式 4.3偽指令語句 4.4DOS系統(tǒng)功能調用和BIOS中斷調用,4.1 匯編語言程序格式 4.1.1 程序結構,程序由數條語句構成,每條語句占一行。語句分兩類: 指令性語句(指令語句):能譯成機器代碼,完成一定的操作功能的語句。 指示性語句(偽指令語句):為匯編程序在翻譯匯編語言源程序時提供有關控制信息,沒有相應的機器代碼。,指令性(指令)語句與指示性(偽指令)語句區(qū)別: 程序經匯編、連接和裝入內存后,在執(zhí)行程序之前 指示性語句的功能已經完成,故又稱偽操作。 而指令性語句的功能尚未完成,需控制CPU去執(zhí)行才能完成。,完成

2、兩個字節(jié)數據相加。 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 給出一個完整的匯編語言源程序,分段結構 程序按段編寫, 與8086內存分段編址相對應。 每段由偽操作SEGMENT開始、由ENDS結束。 程序可由多個段構成,至少有一個

3、代碼段。 程序最后為END結束語句,后跟一啟動地址。 啟動地址指示程序開始執(zhí)行的第一條語句。 程序中設有返回DOS的功能。 使程序執(zhí)行完后返回DOS系統(tǒng)的命令接受狀態(tài)。 程序中用到內存操作數時, 應按操作數的尋址方式,給相應的段寄存器賦值,4.1.2 語句格式,* 指令助記符(操作碼)不可以省略,指令性語句,標號: 指令助記符 操作數,操作數 ;注釋,格式:,偽指令語句,格式:,名字 偽指令指示符 操作數,操作數 ;注釋,根據語句功能的不同, 名字項可用來表示段名、變量名、 標號、過程名等。,名字項用一個符號表示。 對符號的規(guī)定: 由字符AZ ,az ,09及符號、$、下劃線_ 等組成,最長3

4、1個字符,超出部分忽略。 不能用數字打頭,以免與十六進制數相混。 不使用匯編程序中的保留字。 (如指令的助記符等) 對定義的符號不區(qū)分大小寫。但為便于記憶,名字的定義應該做到見名知意。,1、 名字項(提供符號地址),名字的兩種主要形式:標號和變量 標號: 在代碼段中定義,后面跟著冒號“:”,標號作為目標操作數經常在轉移指令或調用指令中出現,用以表示轉向地址。 標號的三種屬性: 段屬性(SEGMENT):標號所在段的段基值。 偏移地址屬性(OFFSET):標號所在地址與其所在段首址之間的偏移地址字節(jié)數。 類型屬性(TYPE):反應轉移過程中標號可轉移的距離,類型NEAR為近標號,只能實現段內轉移

5、;類型FAR為遠標號,可實現段間轉移。,變量: 變量在數據段、附加段或堆棧段中定義,后面不跟冒號。變量通常指存放在存儲單元中的值,在程序運行中是可以修改的。 變量的三種屬性: 段屬性(SEGMENT):變量所在段的段基值。 偏移地址屬性(OFFSET):變量所在地址與其所在段首址之間的偏移地址字節(jié)數。 類型屬性(TYPE):指變量中每個元素所包含的字節(jié)數,類型有:字節(jié)變量(BYTE)、字變量(WORD)及雙字變量(DWORD)等。,* 在同一個程序中,同樣的標號或變量的定義只允許出現一次,否則匯編程序會指示出錯。,操作碼可以是指令、偽指令中的助記符,用以指明操作的性質或功能。,對于指令,匯編程

6、序將其翻譯成機器語言指令。 MOV AX, 100 B8 00 01,對于偽指令,匯編程序據其要求的功能進行處理。 data SEGMENT data與一段基值對應 string DB Tsinghua string與一內存地址對應,2、 操作碼項(不可省略),操作數給出參與操作的數或數所在的地方。 操作數多于一個時,用逗號分開。 操作數可以是常數、寄存器、存儲器操作數、變量、 標號、過程名或表達式(下一節(jié)介紹)等。,3、操作數項,由分號引出,用來說明語句或程序的功能。 匯編程序對分號后的內容不做處理。 作用: 注釋程序,增強程序可讀性。 可放在語句最前,暫時注釋某語句,調試程序用。 例: 、

7、 ; MOV AH, 2 ;顯示提示信息 ; MOV DL, A ; INT 21H 、,4、注釋項,表達式 表達式由運算對象(常量、標號、變量)及運算符組成。 匯編程序對表達式進行運算后,得到一個確定的數值,再把這個數值匯編到指令中。 運算結果可以是一個常數字,也可以是一個存儲器的地址。故表達式分數字表達式、地址表達式。 表達式是指令或偽操作的操作數; 表達式中的操作符由匯編程序完成 例 MOV AX, 12 - 4 ;MOV AX, 8 ;數字表達式 LEA BX, string + 4 ;地址表達式,4.2MASM中的表達式,表達式中的操作符(參考P128 表4-1) 有以下幾類: 1)

8、. 算術運算符 ( +、-、*、/、MOD ) 2). 邏輯運算符 ( AND、OR、NOT、XOR ) 3). 關系運算符 ( EQ、NE、GT、GE、LT、LE ) 真:FFFFH; 假: 0 4). 數值返回操作符 ( SEG、OFFSET、TYPE、LENGTH、SIZE ) 5). 修改屬性操作 ( PTR ) 6). 地址記數器( $ ),例: 1). 算術運算符 ( +、-、*、/、MOD(取余數) ) MOV AX, 6 * 8 MOV AX, 48 2). 邏輯運算符 (AND、OR、NOT、XOR) MOV AX, 80h OR 70h MOV AX,0F0h 3). 關系

9、運算符 ( EQ、NE、GT、GE、LT、LE ) 真:FFFFH; 假: 0 MOV AX, 1 GE 2 MOV AX, 0,* 表達式只是一個成份,不能單獨構成語句。,SEG 取符號地址(變量或標號)的段地址 例 MOV AX , SEG yy OFFSET 取符號地址(變量或標號)的偏移地址 例 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). 數值返回操作符,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 取符號地址(變量或標號)的類型屬性 例 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時,返回此變量包含的單元數為100個字。 MOV AH, 1;對其他

13、情況則返回1。,SIZE 取變量的總字節(jié)數 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 變量或標號 功能:將PTR左邊的類型屬性賦給右邊的變量或標號。 常用類型: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 需等值的表達式 作用: 用符號名等值指定的表達式 其中, 表達式可以是任何有效的操作數 匯編時用語句中的表達式代替程序中符號所在的地方。 應用: 1. 定義符號常量,方便修改程序。 2. 某表達式多次出現時,用等值偽操作可以方便編程。 例:COUNTEQU 5,舉例 CONSTANTEQU256 ;將數256賦以符號名CONSTANT DATA EQUHEIGHT+12 ;HEIGHT為一標號,地址表達式賦以符號名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偽操作中的表達式名是不允許重復定義的,而“=”偽操作則允許重復定義。,3、解除定義偽指令PURGE 格式:PURGE 功能:解除指定符號的定義。解除符號定義后,可用EQU重新進行定義。 例: Y1EQU 7 ; 定義 PURGEY1 ;解除 Y1EQU 36 ;重新定義,格式 變量名 類型助記符 操作數 ,操作數 , . ;注釋 用來

16、定義程序中所用的內存操作數,并用變量與存儲單元建立聯(lián)系。 其中變量名:指示內存操作數的地址(符號地址) 類型助記符:指示內存操作數的類型(字節(jié)、字、雙字等) 常用的類型助記符有: DB 指示其后的操作數為字節(jié)類型 DW 指示其后的操作數為字類型 DD 指示其后的操作數為雙字類型 匯編程序將定義的操作數,按其類型分配內存單元數。 *其它類型:DQ(4個字) DT(10個字節(jié)) 操作數:指示內存操作數的內容順序存入變量名指向的內存單元中。,4.3.2 定義數據的偽指令,定義數據偽指令應用: 可以把其后跟著的數據存入指定的存儲單元,形成初始化數據。 或者只分配存儲空間而并不存入確定的數值,形成未初始

17、化數據空間。 DW和DD偽指令還可存儲地址。,例1: 定義賦初值的變量 data SEGMENT xx DB 1, -1, 0fcH yy DW 1, -1, 0fcH zz DD 1,- 1, 0fcH data ENDS,* 操作數可以是常量,或者是表達式。,例2: 定義字符串變量( 只能用DB定義 ) data SEGMENT str1 DB TsingHua str2 DB INPUT: , 0dH , 0aH ,$ data ENDS,例3:DBAB 和 DW AB的存儲有區(qū)別,參看書 P136 圖4.2 (b)、(c),操作數可以是用常量、表達式和 ? 表示。 常量和表達式表示內存

18、操作數的初始值,其值應在其定義的類型范圍內,否則匯編出錯。 例 aa DB 270;錯誤 bb DW 80000;錯誤 用 ? 表示只保留存儲空間,不置初始值的內存操作數。 例 cc DB ? 可用 DUP 復制操作符定義相同的操作數,其格式為: 重復次數 DUP( 操作數) 例 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 定義程序開始和結束的偽指令1 、 NAME 和 TITLE 偽操作,格式 END 啟動地址標號 作用是指示源程序到此結束。 匯編程序對 END 之后的語句不進行處理。 程序中所有有效語句應放在 END 語句之前, 多個模塊連接時,則只有主模塊要使用標號,程序 從主模塊第一個標號處開始執(zhí)行。 源程序中必須有 END 結束語句。 匯編程序對無END語句的源程序會給出錯誤信息。,2、 END偽操作,啟動地址可是一個標號或過程名, 指示程序的入口。 程序裝入內存后,系統(tǒng)跳轉到入口處, 開始執(zhí)行程序。,4.3.4 指令集選擇偽指令(略)匯編程序默認值為.8086指令系統(tǒng),4.3.5 地址計數

21、器與對準偽操作1、地址計數器$,匯編過程中使用地址計數器來保存當前正在匯編的指令的偏移地址,地址計數器的值可用$來表示。 $用在指令中時,表示當前地址,即本條指令的第一個字節(jié)的地址。 例: JNE $,2、ORG偽操作,作用: 用來設置當前地址計數器的值。當用戶要求指定某條指令或數據為某個指定地址時,可用ORG語句來改變,ORG語句可以放在程序的任何位置。 格式:ORG表達式 例:VECTSEGMENT ORG10 VECT1DW47A5H ORG20 VECT2DW0C596H VECTENDS,4.3.6 匯編語言源程序段結構定義1、完整段定義的程序結構,段定義偽操作 段名 SEGMENT

22、 、 段名 ENDS 段定義由偽操作SEGMENT開始、ENDS結束。 其中: SEGMENT 和ENDS 必須成對出現,且語句前必須有段名,段名必須相同。 SEGMENT和ENDS語句之間可以有指令和其他偽操作指令。 程序中可以定義多個段。程序經匯編、連接及裝入內存后,段名為一具體的段值。,ASSUME偽操作 格式: ASSUME 段寄存器:段名 , 段寄存器:段名, 其中 段寄存器為CS、DS、ES、SS中的一個 段名為用偽操作SEGMENT定義過的段名 例 ASSUME CS: cc , DS:aa 作用:用來明確段和段寄存器之間的關系。 說明:ASSUME語句只起指示作用,沒有賦值作用

23、,并不能把段地址裝入段寄存器中,因此在程序中需用指令(如MOV)給相應的段寄存器賦值。但是,代碼段CS除外,CS的裝入是在程序初始化時完成的。 ASSUME NOTHING則可取消前面由ASSUME所指定的段寄存器。,例 用程序實現 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 ;取數 ADD AX, value+2 ;兩數

24、相加 MOV result, AX ;保存結果 MOV AH, 4CH ;返回DOS INT 21H code ENDS END start,注意: 程序裝入內存后,執(zhí)行程序前, 當前的DS值并非程序定義的data段值, 1295 不等于 12A5,思考: 如果上例中沒有 MOV DS , AX 程序執(zhí)行的結果會怎樣?,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 ;查看在內存的程序 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 ;取數 ADD AX, value+2 ;兩數相加 MOV result, AX ;保存結果 MOV AH, 4CH ;返回DOS INT 21H code ENDS,2、偽指令SEGMENT的完整格式,格式:段名 SEGMENT 定位類型 組合類型 類別 、 段名 ENDS 說明:SEGMENT后面可以帶參數,參數必須按格式中規(guī)定的次序排列,分類名必須用單引號括起來。一般情況下這些參數可以省略,如果需要多模塊連接

27、,則要用到這些參數。,定位類型: PARA(缺省值):指定該段起始地址定位在節(jié)(16字節(jié))的整數邊界(末4位地址為0)。 BYTE:指定該段起始地址定位在任何字節(jié)地址。 WORD:指定該段起始地址定位在字邊界(末位地址為0 )。 DWORD:指定該段起始地址定位在雙字邊界(末2位地址為0)。 PAGE:指定該段起始地址定位在頁(256字節(jié))邊界(末8位地址為0)。,組合類型: 用于說明程序連接時段的合并方法。 PRIVATE(缺省值): 連接時該段不與其它模塊中的同名段合并。 PUBLIC: 連接時把不同模塊中的同名段順序連接合并為一個段。 COMMON: 連接時把不同模塊中的同名段重疊而形成

28、一個段。 AT 表達式: 定位該段的起始地址在表達式所指定的節(jié)邊界上。 MEMORY: (略) STACK: 指定該段為堆棧段,此參數在堆棧段中不可省略。多個模塊只需設置一個堆棧段,各個模塊中的堆棧段采用覆蓋方式組合,容量為各個模塊中所設置的最大堆棧容量。 類別名(CLASS ): 在引號中給出連接時組成段組的類型名。匯編連接時類別名相同的邏輯段組成一個段組(物理位置靠在一起)。,4.3.7 子程序結構形式與操作1、子程序(過程)定義,子程序(過程)定義偽操作 格式 過程名 PROC 類型 、 過程名 ENDP 子程序(過程)定義由偽操作PROC開始、ENDP結束。 其中: PROC 和END

29、P 必須成對出現, 且語句前必須有過程名,過程名必須相同。,2、說明 PROC和ENDP語句之間為子程的指令序列。 程序中可以定義多個過程。 程序經匯編、連接及裝入內存后, 過程名為一具體的內存地址,指示子程入口。,過程名常用作CALL調用指令的操作數, 子程的最后安排RET返回指令,使執(zhí)行完子程后能返回調用處。 過程有兩種類型:NEAR和FAR ,無類型項時,默認為NEAR類型。 當過程與調用指令不在同一段時,應將過程定義為 FAR 類型。過程類型決定子程中RET的返回類型。 匯編程序用PROC偽操作的類型來確定CALL和RET指令的屬性。,例3:調用程序和子程序在同一代碼段中。 MAIN

30、PROCFAR : CALLSUBR1 : RET MAIN ENDP SUBR1 PROC NEAR : RET SUBR1 ENDP,DOS把主程序看作一個FAR類型子程加以調用,故應把主程序定義為FAR類型。,例4:調用程序和子程序不在同一代碼段中。 SEGX SEGMENT : SUBT PROCFAR : RET SUBT ENDP : CALL SUBT SEGX ENDS SEGY SEGMENT : CALL SUBT : SEGY ENDS,4.3.8LABEL 偽指令,LABEL偽指令給已定義的變量或標號取另一個名字(別名),并可重新定義它的類型屬性,使同一變量或標號在不同

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(?); 堆棧中經常使用LABEL。 TOP LABEL WORD; TOP為棧底名,類型為字。 STACK ENDS;如用指令MOV SP , OFFSET TOP,4.4DOS系統(tǒng)功能調用和BIOS中斷調用4

32、.4.1 DOS功能調用,DOS是PC/XT的操作系統(tǒng),負責管理系統(tǒng)的所有資源,DOS中包括了許多可供用戶調用的子程序。,用戶調用DOS功能的途徑: * 在DOS環(huán)境下,鍵入DOS命令; * 通過用戶程序調用DOS和BIOS中的服務程序。,1、DOS功能調用概述 利用軟中斷指令 INT n 調用相應的中斷服務程序。 n= 0 4 ;8088/8086CPU占用 n=51FH; BIOS功能調用 n=203FH; DOS功能調用 其中INT 21是一個具有100多個子功能的中斷服務程序,分別用于設備管理,目錄管理,文件管理及其它功能。 2、 DOS功能調用方法 1) DOS軟中斷( INT 20

33、H INT 27H )指令 參見教材 P153 表4-4,表4-4 DOS軟中斷,2)DOS系統(tǒng)功能調用(INT 21H),有上百個子功能中斷服務程序,功能大致分設備管理、文件管理等4個方面,每個子功能有一個功能號。 調用方法,在AH設置功能號m,常用DOS系統(tǒng)功能調用 (21H類型中斷調用) 1顯示單字符 ( 02H功能 ) 2顯示字符串 ( 09H功能 ) 3單字符輸入 ( 01H、07H、08H功能 ) 4字符串輸入 ( 0AH功能 ) 5檢測鍵盤狀態(tài) ( 0BH功能 ) 6. 返回操作系統(tǒng)( 4CH功能 ) 7保存中斷向量 ( 35H功能 ) (后面章節(jié)介紹) 8設置中斷向量 ( 25

34、H功能 ),入口參數 DL = 要顯示字符的ASCII 碼 功能號 AH=02H 類型號 INT 21H 出口參數 無 實現功能 顯示指定字符,光標隨動。,例 顯示字符A MOV DL, A MOV AH, 02H INT 21H,1. 顯示單字符 ( 02H功能 ),例 使光標回到下一行的行首。 MOV DL , 0DH ;顯示回車符 MOV AH , 02H INT 21H MOV DL , 0AH ;顯示換行符 MOV AH , 02H INT 21H,入口參數 定義要顯示的字符串, 字符串尾應為$,作為結束顯示的標志。 DS : DX = 字符串的首地址 功能號 AH = 09 H 類

35、型號 21H 出口參數 無 實現功能 顯示字符串,遇 $ 停止顯示,光標隨動。,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 ;調顯示功能 INT 21H MOV AH, 4CH ;返回DOS INT 21H code

36、ENDS END start, 鍵盤通過鍵盤接口電路與計算機連接。 鍵盤上的鍵有三種類型: 字符鍵 AZ, 09等 功能鍵 F1F12, BackSpace,Page Up等 組合控制鍵 Shift, Ctrl, Alt等, 鍵盤上的每個鍵都有一個掃描碼。 據掃描碼可確定操作的是哪個鍵、是按下鍵還是釋放鍵; 掃描碼用一個字節(jié)表示。 低7位是掃描碼的數字編碼, 與鍵盤上的鍵一一對應; 最高位D7位表示鍵的操作狀態(tài): 當按下鍵時, D7=0 ; 當釋放鍵時, D7=1,學習輸入功能前介紹有關鍵盤 的一些知識, 鍵盤中斷子程功能(09H類型中斷子程) 從鍵盤接口讀取操作鍵的掃描碼; 將掃描碼轉換成字

37、符碼; 大部分鍵的字符碼為ASCII碼, 無ASCII碼鍵(如組合鍵Shift、Ctrl等)的字符碼為0。 將鍵的掃描碼、字符碼存放在鍵盤緩沖區(qū), 供其它有關鍵盤的中斷子程應用。, 鍵盤接口對按下鍵和釋放鍵均向計算機發(fā)出中斷申請, 如果中斷響應條件滿足, CPU轉去執(zhí)行鍵盤中斷子程。 鍵盤中斷子程類型號為09H。, 入口參數 無 功能號 AH = 01H 類型號 21H 出口參數 AL = 鍵入字符的ASCII碼 實現功能 等待從鍵盤輸入一個字符, 并在屏幕上回顯,光標移動, 檢測Ctrl-Break鍵,3. 單字符輸入 ( 01H、07H、08H功能),例 利用鍵盤輸入的字符產生分支: MO

38、V AH, 1 ;等待從鍵盤輸入 INT 21H CMP AL, Y ;是Y? JZ yes CMP AL, y ;是y? JZ yes no: . . . . . . JMP exit yes: . . . . . . exit: . . .,例 在中斷向量表中查找從鍵盤輸入的字符, 并將其個數用二進制形式顯示出來。( scanskey.asm), 入口參數 無 功能號 AH = 07H 類型號 21H 出口參數 AL = 鍵入字符的ASCII碼 實現功能 等待從鍵盤輸入一個字符, 不在屏幕上回顯, 不檢測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: 、 、,入口參數 DS : DX = 緩沖區(qū)的首地址 ( DS :DX ) = 用戶定義的最大輸入的字符數 功能號 AH = 0AH 類型號 21H 出口參數 ( DS : DX+1 ) = 實際鍵入的字符(不含回車符) 從( DS : DX+2 )開始順序存放鍵入的字符串, 回車符0DH為串尾最后一字符。 實現功能 等待從鍵盤輸入字符串,并存入設定的緩沖區(qū)內

40、, 同時回顯字符串,光標隨著移動, 回車符使光標回到行首。 注意事項:應按要求先定義緩沖區(qū),再調用。,4. 字符串輸入 ( 0AH 功能 ),例 應用0AH功能輸入字符串。,data SEGMENT ;定義緩沖區(qū) max DB 11 ;定義限制最多輸入個數 lenth DB ? ;用于存放實際輸入個數 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 ;調0A輸入功能 MOV CH , 0 MOV CL , lenth ;取字符串長度放CX中 LEA BX , stri ;取字符串首址于BX中 MOV AL , BX ;應用輸入字符 、 code ENDS,data SEGMENT ;定義緩沖區(qū) max DB 11 ;定義限制最多輸入個數 lenth DB ? ;用于存放實際輸入個數 stri DB 11 DUP(?) ;用于存放輸入的字符串 data ENDS 從鍵盤輸入ABCD, 回車,內存的存放結果:,0AH功能執(zhí)行過程: 若(DS:DX)字節(jié)單元的值為0,則不等待從鍵盤輸入,結束調用。 若(DS:DX) 字節(jié)單元

42、的內容大于0,則等待從鍵盤輸入, 并把輸入鍵的ASCII碼順序存放在DS : DX+2開始的單元, 按回車鍵表示結束輸入。 當按下鍵的個數超過( DS : DX )中值,發(fā)出警告聲 嘟嘟 , 不再接收輸入的數據, 直到輸入回車鍵。 將實際輸入的字符個數(不包括回車鍵)填入(DS:DX+1), 結束調用。,0AH功能注意事項: 輸入的字符均帶回顯,且光標隨字符移動。 當輸入回車符結束時,也回顯回車符。 表現為功能調用結束后,光標回到了行首。 回車符0DH作為一個輸入的字符存放在字符串尾, 但計數輸入個數時,不包括回車鍵。 實際最多能輸入的字符數 = 限制的最多數-1 (回車符占一個) 執(zhí)行完0A

43、H功能后,DS和DX的值不變, DS:DX仍指向緩沖區(qū)的首地址。 整個緩沖區(qū)的大小應為:限制的最多數 +2 max DB 11, ? , 11 dup (?),例 利用DEBUG查看0A功能輸入結果。(與上例功能相同),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 ;調輸入功能 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ū)內容 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ū)內容 129D:0000 0B 05 48 65 6C 6C 6F 0D-00 00 00 00 00 00 00 00 .Hello. -,思考: 1.

46、 若將程序改為如下形式, 設想程序執(zhí)行的結果。,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 ;調輸入功能 INT 21H MOV AH, 4CH ;返回DOS INT 21H code ENDS END start,結果是:不等待輸入,結束0AH功能調用。,2. 若將程序改為如下形式, 設想程序執(zhí)行的結果。,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 ;調輸入功能 INT 21H MOV AH, 4CH ;返回DOS INT 21H code ENDS END start,結果是:不等待輸入,結束0AH功能調用。,DOS 功能調用應用舉例,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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論