




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1第第6 6章章 匯編語言程序設計匯編語言程序設計12內容概要內容概要匯編語言能匯編語言能直接控制微機硬件直接控制微機硬件的的編程語言編程語言。因此,要求程序設計者要因此,要求程序設計者要 “軟、硬結合軟、硬結合” 。本章介紹匯編語言程序設計的本章介紹匯編語言程序設計的基本知識基本知識, ,以及一些以及一些基本的基本的程序設計程序設計。6.1 匯編語言程序設計概述匯編語言程序設計概述程序是指令的有序集合。程序是指令的有序集合。微機運行就是執(zhí)行指令序列的過程。微機運行就是執(zhí)行指令序列的過程。編寫這一指令序列的過程稱為編寫這一指令序列的過程稱為程序設計。程序設計。36.1.1 6.1.1 編程語言
2、編程語言常用的編程語言是常用的編程語言是匯編語言匯編語言和和高級語言高級語言。1 1匯編語言匯編語言用英文字符來代替機器語言,這些英文字符被稱為用英文字符來代替機器語言,這些英文字符被稱為助記符匯助記符匯編語言:編語言:用助記符表示的指令。用助記符表示的指令。匯編語言源程序:匯編語言源程序:用匯編語言編寫的程序。用匯編語言編寫的程序。“匯編匯編”:匯編語言源程序需匯編語言源程序需轉換(翻譯)轉換(翻譯)成為二進制代碼成為二進制代碼表示的機器語言程序,才能識別和執(zhí)行。表示的機器語言程序,才能識別和執(zhí)行。完成完成“翻譯翻譯”的程序稱為的程序稱為匯編程序匯編程序。經匯編程序。經匯編程序“匯編匯編”得
3、得到的以到的以“0 0”、“1 1”代碼形式表示的機器語言程序稱為代碼形式表示的機器語言程序稱為目標目標程序程序。34優(yōu)點:優(yōu)點:用匯編語言編寫程序效率高,占用存儲空間小,運行用匯編語言編寫程序效率高,占用存儲空間小,運行速度快,能編寫出最優(yōu)化的程序。速度快,能編寫出最優(yōu)化的程序。匯編語言可以用于軟件的加密和解密、計算機病毒的分析和防治,以及程序的調試和錯誤分析等各個方面。通過學習匯編語言,能夠加深對計算機原理和操作系統(tǒng)等課程的理解。通過學習和使用匯編語言,能夠感知、體會和理解機器的邏輯功能,向上為理解各種軟件系統(tǒng)的原理,打下技術理論基礎;向下為掌握硬件系統(tǒng)的原理,打下實踐應用基礎。缺點:缺點
4、:可讀性差,離不開具體的硬件,是面向可讀性差,離不開具體的硬件,是面向“硬件硬件”的語的語言通用性差。言通用性差。2 2高級語言高級語言不受具體不受具體“硬件硬件”的限制,的限制,優(yōu)點:優(yōu)點:通用性強,直觀、易懂、通用性強,直觀、易懂、易學,可讀性好。易學,可讀性好。45盡管目前已有不少設計人員使用盡管目前已有不少設計人員使用C C語言等來進行程序開發(fā),語言等來進行程序開發(fā),但在對但在對程序的程序的空間空間和和時間時間要求較高的場合,匯編語言仍必不可要求較高的場合,匯編語言仍必不可少。少。在這種場合下,可使用在這種場合下,可使用C C語言和匯編語言混合編程。在很多語言和匯編語言混合編程。在很多
5、需要直接控制硬件且對實時性要求較高的場合,則更是非用匯需要直接控制硬件且對實時性要求較高的場合,則更是非用匯編語言不可。編語言不可。掌握匯編語言并能進行程序設計,是學習和掌握微型計算程掌握匯編語言并能進行程序設計,是學習和掌握微型計算程序設計的序設計的基本功之一基本功之一。6.1.2 6.1.2 匯編語言語句和格式匯編語言語句和格式兩種基本語句:兩種基本語句:指令語句指令語句和和偽指令語句偽指令語句。(宏指令)。(宏指令)56(1 1)指令語句)指令語句 前面已經學習,每一指令語句在匯編時都產生一個指令碼前面已經學習,每一指令語句在匯編時都產生一個指令碼(機器代碼),執(zhí)行該指令代碼對應著機器的
6、一種操作。(機器代碼),執(zhí)行該指令代碼對應著機器的一種操作。(2 2)偽指令語句)偽指令語句 是控制匯編(翻譯)過程的一些是控制匯編(翻譯)過程的一些控制命令控制命令。在匯編時。在匯編時沒有沒有機器代碼機器代碼與之對應。與之對應。 下面介紹指令語句格式。偽指令語句將在下一節(jié)介紹。下面介紹指令語句格式。偽指令語句將在下一節(jié)介紹。7匯編語言語句是符合典型的匯編語言的匯編語言語句是符合典型的匯編語言的四分段四分段格式格式:標號字段標號字段和和操作碼字段操作碼字段之間要有之間要有冒號冒號“:”分隔;分隔;操作碼字段操作碼字段和和操作數(shù)字段間操作數(shù)字段間的分界符是的分界符是空格空格;雙操作數(shù)雙操作數(shù)之間
7、用之間用逗號逗號相隔;相隔;操作數(shù)字段操作數(shù)字段和和注釋字段注釋字段之間的分界符用之間的分界符用分號分號“;”。任何語句都必須有操作碼字段任何語句都必須有操作碼字段,其余各段為任選項。,其余各段為任選項。7標號標號:(LABLE)操作碼操作碼(OPCODE)操作數(shù)操作數(shù)(OPRAND);注釋注釋(COMMENT)8【例例6-1】下面是一段程序的下面是一段程序的四分段四分段書寫格式。書寫格式。標號字段標號字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段START:MOVA,00H ;0A MOVR1,10 ;10R1MOVR2,00000011B ;03HR2LOOP: ADD
8、A,R2 ;(A)+(R2)ADJNZR1,LOOP ;R1減減1不為零,則跳不為零,則跳LOOP處處NOPHERE: SJMPHERE上述上述4個字段應該遵守的個字段應該遵守的基本語法規(guī)則基本語法規(guī)則如下。如下。891 1標號標號語句所在地址的標志符號,才能被訪問。如標號語句所在地址的標志符號,才能被訪問。如標號“STARTSTART”和和“LOOPLOOP”等。有關標號規(guī)定如下:等。有關標號規(guī)定如下:(1 1)標號后必須跟冒號標號后必須跟冒號“:”。(2 2)標號由標號由1 18 8個個ASCIIASCII碼字符組成,第一個字符必須是碼字符組成,第一個字符必須是字母。字母。(3 3)同一標
9、號在一個程序中只能定義一次,不能重復定同一標號在一個程序中只能定義一次,不能重復定義。義。(4 4)不能使用匯編語言已經定義的符號作為標號,如指不能使用匯編語言已經定義的符號作為標號,如指令助記符、偽指令以及寄存器的符號名稱等。令助記符、偽指令以及寄存器的符號名稱等。(5 5)標號的有無,取決于本程序中的其他語句是否訪標號的有無,取決于本程序中的其他語句是否訪910問該條語句。如無其他語句訪問,則該語句前不需標號。問該條語句。如無其他語句訪問,則該語句前不需標號。2 2操作操作操作碼字段規(guī)定了語句執(zhí)行的操作,操作碼是匯編語言指令中操作碼字段規(guī)定了語句執(zhí)行的操作,操作碼是匯編語言指令中唯一不能空
10、缺的部分。唯一不能空缺的部分。3 3操作數(shù)操作數(shù)指令的操作數(shù)或操作數(shù)地址。指令的操作數(shù)或操作數(shù)地址。在本字段中,在本字段中,操作數(shù)的個數(shù)因指令的不同而不同。操作數(shù)的個數(shù)因指令的不同而不同。通常有單操通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是多操作數(shù),則操作數(shù)之間要以如果是多操作數(shù),則操作數(shù)之間要以逗號逗號隔開。隔開。11操作數(shù)表示操作數(shù)表示時,幾種情況需注意:時,幾種情況需注意:(1 1)十六進制、二進制和十進制形式的操作數(shù)表示)十六進制、二進制和十進制形式的操作數(shù)表示多數(shù)情況,操作數(shù)或操作數(shù)地址是采用多數(shù)情況,操作數(shù)或操作數(shù)地址是采用十六進制十六進制
11、形式來表形式來表示的。則需加示的。則需加后綴后綴“H H”。在某些特殊場合用在某些特殊場合用二進制二進制表示,需加表示,需加后綴后綴“B B”若操作數(shù)采用若操作數(shù)采用十進制十進制形式,則需加形式,則需加后綴后綴“D D”,也可省略。,也可省略。若十六進制若十六進制操作數(shù)操作數(shù)以以字符字符A AF F開頭開頭,需在它,需在它前面加一個前面加一個 “0 0”,以便匯編時把它和,以便匯編時把它和字符字符A AF F區(qū)別區(qū)別開。開。1112(2 2)工作寄存器和特殊功能寄存器的表示)工作寄存器和特殊功能寄存器的表示 當操作數(shù)為工作寄存器或特殊功能寄存器時,允許用當操作數(shù)為工作寄存器或特殊功能寄存器時,
12、允許用工作寄存器和特殊功能寄存器的工作寄存器和特殊功能寄存器的代號表示代號表示。 例如,例如,寄存器的名字:寄存器的名字:AX、BX、CX、DX、SP、BP、SI、DI、IP、CS、DS、ES、SS。4 4注釋注釋用于解釋指令或程序的含義,對可讀性非常有用。用于解釋指令或程序的含義,對可讀性非常有用。使用時使用時須以分號開頭須以分號開頭,長度不限,一行寫不下,長度不限,一行寫不下可換行可換行書寫,但注意也要以分號開頭。書寫,但注意也要以分號開頭。1213 匯編時,遇到匯編時,遇到“;” 就停止就停止“翻譯翻譯”。因此,注釋字。因此,注釋字段不會產生機器代碼。段不會產生機器代碼。4.1.3 4.
13、1.3 偽指令偽指令 在匯編語言源程序中應有在匯編語言源程序中應有向匯編程序發(fā)出的指示信息向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過告訴它如何完成匯編工作,這是通過偽指令偽指令來實現(xiàn)。來實現(xiàn)。 偽指令不屬于指令系統(tǒng)中的匯編語言指令,它偽指令不屬于指令系統(tǒng)中的匯編語言指令,它是程序員是程序員發(fā)給匯編程序的發(fā)給匯編程序的命令命令,也稱為,也稱為匯編程序控制命令匯編程序控制命令。 只有在匯編前的源程序中才有偽指令。只有在匯編前的源程序中才有偽指令。 “偽偽”體現(xiàn)在體現(xiàn)在匯編后,偽指令匯編后,偽指令沒有相應的機器代碼產生。沒有相應的機器代碼產生。 偽指令具有控制匯編程序的輸入偽指令具有
14、控制匯編程序的輸入/ /輸出、定義數(shù)據和符輸出、定義數(shù)據和符號、條件匯編、分配存儲空間等功能。號、條件匯編、分配存儲空間等功能。13表達式表達式是是常數(shù)常數(shù)、寄存器、標號、變量寄存器、標號、變量與一些與一些運算符運算符組合組合的序列。的序列。6.2MASM中的表達式中的表達式匯編時按一定的優(yōu)先規(guī)則對表達式進行計算后可得到一個數(shù)值或一個地址。 算術運算符(Arithmetic Operators) 邏輯運算符(Logical Operators ) 關系運算符(Relational Operators ) 數(shù)值返回運算符(Value-Returning Operators ) 修改屬性運算符(M
15、odifing attribute Operators) 其它運算符(Other Operators )nMASM是微軟公司開發(fā)的匯編開發(fā)環(huán)境,擁有可視化的開發(fā)界面,使開發(fā)人員不必再使用DOS環(huán)境進行匯編的開發(fā),編譯速度快,支持80 x86匯編以及Win32Asm,是Windows下開發(fā)匯編的利器。它與windows平臺的磨合程度非常好,但是在其他平臺上就有所限制,使用MASM的開發(fā)人員必須在Windows下進行開發(fā)。nMASM版本至今在不斷的更新,推薦使用新版本進行開發(fā)。nMASM 5.0/6.0 是最常用的匯編連接軟件其簡單操作為 輸入asm文件將其連接為 obj文件 用link得到exe
16、文件。一、算術運算符一、算術運算符有有+ +、- -、* *、/ /,MODMOD,SHLSHL、SHRSHR。其中其中MODMOD表示除法運算后得到的余數(shù)。表示除法運算后得到的余數(shù)。例: 19/7的商是2;19 MOD 7則結果為5(余數(shù))算術運算符可以用于數(shù)字表達式。例: MOV AL,2*7算術運算符也可以用于地址表達式,但對地址運算的結果應有明確的物理意義。例如,兩個地址的乘或除無意義,而加或減則可以。 例: LEA SI,SUM+3 表示變量SUM的地址加上3得到的和作為新的存儲器地址。 注: LEA指令是裝入有效地址 ANDAND、OROR、XORXOR和和NOTNOT,它們只能用
17、于數(shù)字表達式中,按位運算它們只能用于數(shù)字表達式中,按位運算。 二、邏輯運算符二、邏輯運算符 例: MOV CL,36H AND 0FH 經匯編后結果等同于:MOV CL,06H 這些邏輯運算符也是8086/8088的指令助記符,但不會造成混亂,前者在匯編時進行,而后者在指令執(zhí)行時進行的。例: AND DX,PORT_VAR AND 0FEH后一個邏輯運算符AND在匯編時進行,若PORT_VAR為81H,則匯編后表達式算出為80H.執(zhí)行前一個指令助記符AND時,將(DX)與80H相與,結果在DX中。 共有共有6 6個:個:EQEQ、NENE、LTLT、LELE、GTGT、GEGE。三、關系運算符
18、三、關系運算符關系運算符的兩個操作數(shù)必須都是數(shù)字或者是同一段內的兩個存儲器地址。 例: MOV BX,PORT_VAL GE 5若PORT_VAL的值大于等于5,則匯編后結果等效為: MOV BX,0FFFFH若PORT_VAL的值小于5, 則匯編后結果等效為: MOVBX,0關系為真,結果為 0FFFFH,或0FFH “1” 關系為假,結果為 0 它可以把存儲器一些特征作為數(shù)值送回。它可以把存儲器一些特征作為數(shù)值送回。四、數(shù)值返回運算符(分析運算符)四、數(shù)值返回運算符(分析運算符)OFFSET、SEG、TYPE、LENGTH、SIZE 。1. OFFSET 注意與 MOV SI,STRI1的
19、差別。但它與 LEA SI,STRI1類似。返回標號或變量的偏移地址。SEG運算符用來取存儲單元的段地址值。例: MOVAX,SEG STRI1;將變量STRI1所在段MOVDS,AX;值取到DS中。例:MOV SI,OFFSET STRI1; 將變量STRI1處的地址偏移量取到SI中格式: OFFSET 變量或標號2. SEG格式: SEG 變量或標號 3. TYPE3. TYPE例:若 BUFFER1 存儲區(qū)是用如下偽指令定義的:BUFFER1 DB100 DUP(?)則 TYPE BUFFER1 等于1類型類型返回值返回值變變量量DB1DW2DD4DQ8標標號號NEAR-1FFHFAR-
20、2FEH TYPE操作符用來取存儲器的單元類型,各單元類型對應值如下表:格式: TYPE 變量或標號4. LENGTH例: 若ABC被定義為:ABC DW4,5,6 則 LENGTH ABC 等于1若ABC被定義為:ABC DW 100 DUP(?)則 LENGTH ABC 等于100LENGTH操作符用來計算一個用復制操作符DUP( )來定義的存儲區(qū)的數(shù)據(數(shù)據可以是字節(jié),字或雙字)的數(shù)目。如果不是用DUP定義的存儲區(qū)則返回值為1.格式: LENGTH 變量5. SIZE操作符SIZE用來計算一個存儲區(qū)有多少個字節(jié)。格式: SIZE 變量例: 若 BUFFER2 存儲區(qū)是用如下偽指令定義的:
21、 BUFFER2 DW200 DUP(0) 則: TYPE BUFFER2等于2 LENGTHBUFFER2等于200 SIZE BUFFER2等于400 五、修改屬性運算符五、修改屬性運算符段操作符、PTR、THIS、HIGH、LOW、SHORT。用來對存儲單元規(guī)定類型,通常和偽指令BYTE、WORD等連起來使用。格式: 段前綴:變量或地址表達式1. 段操作符例:MOV AX,ES:BX 指定段屬性,段超越2. PTR格式: 類型/距離 PTR 變量或標號例:MOVBYTE PTRDI,0 MOVWORD PTRDI,0 而 MOVDI,0 ;類型不定 五、修改屬性運算符五、修改屬性運算符用
22、來說明轉移類指令中轉向的目標地址與本指令之間的距離在-127+128之間。格式: 變量/標號 EQU THIS 類型/距離 3. THIS將EQU THIS 右邊的類型/距離屬性,賦給左邊的變量/標號。4. SHORT格式: SHORT 標號5. HIGH和LOW格式: HIGH/LOW 變量或標號字節(jié)分離運算符。 HIGH從字中分離出高位字節(jié); LOW從字中分離出低位字節(jié)。六、其它運算符: ()、 、MASK、WIDTH4.3 4.3 偽指令語句偽指令語句常用的偽指令有常用的偽指令有: :數(shù)據定義語句符號賦值語句段定義語句段分配語句過程定義語句程序開始結束語句一、數(shù)據定義語句一、數(shù)據定義語句
23、變量是內存中數(shù)據區(qū)的名字,故這類偽指令又可變量是內存中數(shù)據區(qū)的名字,故這類偽指令又可叫變量定義偽指令。這類偽指令格式為:叫變量定義偽指令。這類偽指令格式為:變量名 偽指令助記符 操作數(shù) ;注釋其中變量名用符號地址表示,后面不能跟冒號,它可有可無。助記符有:DB、DW、DD、DQ、DT、n DUP()DB用來定義字節(jié),每個操作數(shù)占一個字節(jié)DW用來定義字, 占一個字DD用來定義雙字 , 2個字DQ用來定義四個字, 占4個字DT用來定義十個字節(jié), 占10個字數(shù)據定義語句數(shù)據定義語句例1:DA1 DB 10,5,10HDA2 DW 10H,100,-4DA3 DD 2*30,0FFFBHDA1DA3D
24、A210 510H10H100-4600FFFBH匯編后如圖所示:(內存分配)例例2 2:操作數(shù)可以是字符串:操作數(shù)可以是字符串LILIDBDBHELLOHELLO LIHELLO注意下面的不同: DB AB DW AB 41H A 42HB 42H B 41HA48454C4C4F匯編后如圖:操作數(shù)操作數(shù) ? ? 用來保留存儲空間用來保留存儲空間, ,但不存入數(shù)據。但不存入數(shù)據。ABCLPI01?54例3:ABCDB0,1,?,?,? LPIDW?,54,?匯編后如下圖示:操作數(shù)字段還可以用操作數(shù)字段還可以用復制操作符復制操作符DUPDUP來縮寫。來縮寫。如前面ABC亦可寫成: ABC DB
25、 0,1,3 DUP(?)又如: DAO DB 2 DUP(0,1,2,?) 與 DAO DB 0,1,2,?,0,1,2,? 等價。在偽指令的操作數(shù)中若使用$,則表示的是地址計數(shù)器的當前值。例: BUFFER DW 3,4,$+3設 BUFFER的偏移地址為0088H,則匯編后如圖所示:BUFFER0088H008CH030004008FH8FH00$+3 008C H + 3 = 008F H008AH0089H008BH二、表達式賦值語句EQU、=、 PURGE1. 賦值語句 EQU 等價偽指令 格式為:符號名 EQU 表達式 或:符號名2 EQU 符號名例: CONSTANTEQU10
26、0NEW_PORTEQUPORT_VAL+1EQU偽指令在未解除前,不能重新定義。例: EMP=7;值為7EMP=EMP+1 ;值為82. 等號語句 = :與EQU類似,但允許重新定義3.3.解除偽指令解除偽指令PURGEPURGE已用EQU定義的符號,可用PURGE解除,再重新定義。例:PURGE NEW_PORT NEW_PORTEQUPOTR_VAL+8三、三、 段定義語句段定義語句因因8086/8088 CPU8086/8088 CPU的存儲器是分段的的存儲器是分段的, ,這就需要有這就需要有段段定義語句定義語句。與段有關的偽指令有: SEGMENT、ENDS、ASSUME、ORG 段
27、定義偽指令的格式如下:段名 SEGMENT 定位類型 組合類型類別 段名 ENDS功能:用此偽指令可以把模塊分為若干個邏輯段,每一對SEGMENT和ENDS可定義一個邏輯段。這兩個偽指令總是成對出現(xiàn),二者前面的段名一致。二者之間的部分,對DS、ES、SS來說,一般是符號、變量定義等偽指令。對于CS則是指令及偽指令。說明說明: 此外,還必須明確段和段寄存器的關系,這可由段分配語句ASSUME語句來實現(xiàn)。其格式為: SEGMENT與ENDS共同定義一個邏輯段。它們必須成對使用,每段應有一個段名,具有段基址和偏移量兩個屬性。功能: 向匯編程序指示當前各段所用的段寄存器 其中段寄存器名必須是CS、DS
28、、ES或SS中的一個,而段名則是由SEGMENT及ENDS定義的段名。ASSUME CS:SEGNAME ,需指出的一點需指出的一點,ASSUME,ASSUME偽指令偽指令只是告知匯編只是告知匯編程序有關段寄存器與段的關系程序有關段寄存器與段的關系, ,除了代碼段除了代碼段CSCS,其他幾段并沒有給段寄存器賦予實際的初值。其他幾段并沒有給段寄存器賦予實際的初值。如果程序用到了如果程序用到了DSDS、SSSS、ESES,則需要程序員在,則需要程序員在代碼段的開始時對代碼段的開始時對DSDS、SSSS、ESES賦值。如下語句:賦值。如下語句: MOVMOVAX,DATAAX,DATA MOV MO
29、VDS,AXDS,AX四、四、 過程定義語句過程定義語句過程也稱子程序。過程也稱子程序。過程定義偽指令的格式如下:過程名PROC 屬性 ;過程內容RET N過程名ENDP功能: 定義一個過程,主程序可以用CALL指令調用它。過程調用的距離屬性有NEAR、FAR。 若定義NEAR屬性(默認),則允許過程在段內調用。 若定義FAR屬性,則允許過程跨段調用。五、五、 程序開始和結束語句程序開始和結束語句NAME、OEG、END格式: NAME 程序名功能: 為源程序目標模塊賦名。位置:放在程序開始。 2. ORG1. NAME表達式:給定的偏移地址值,表達式的值(必須是正整數(shù))即為段內的起始地址或偏
30、移地址,從此地址起連續(xù)存放程序或數(shù)據。格式:ORG 表達式功能: 為目標程序設置位置指針,指定下面語句的 起始偏移地址。五、五、 程序開始和結束語句程序開始和結束語句格式: END 標號名功能: 標記匯編源程序結束。位置:放在源程序的最后一行。3. END標號名:該程序第一條可執(zhí)行語句的標號名。一、DOS系統(tǒng)功能調用系統(tǒng)功能調用1、什么是DOS系統(tǒng)功能調用 系統(tǒng)功能調用是DOS為用戶提供的常用子程序(80多個),可在匯編語言程序中直接調用。這些子程序的主要功能包括: (1)設備管理(如鍵盤、顯示器、打印機、磁盤等的管理) (2)文件管理和目錄操作(3)其他管理(如內存、時間、日期等管理) 這些
31、子程序給用戶編程帶來很大方便,用戶這些子程序給用戶編程帶來很大方便,用戶不必了解有關的設備、電路、接口等方面的問題不必了解有關的設備、電路、接口等方面的問題,只需直接調用即可。,只需直接調用即可。392、調用方法 DOS功能調用的子程序已按順序編號功能號(00H68H),其調用方法是: (1) 功能號AH (2) 入口參數(shù)指定寄存器 (3) INT 21H 用戶只須給出以上三方面信息,DOS就可根據所給信息自動轉入相關子程序執(zhí)行。40INT 軟件中斷, 21H是函數(shù)入口地址,實際上就是調用DOS的系統(tǒng)功能。 3、常用的系統(tǒng)功能調用 (1)鍵盤輸入 1) 1號調用從鍵盤輸入單個字符調用格式: M
32、OV AH,1 INT 21H 功能: 等待從鍵盤輸入一個字符并送入AL。 執(zhí)行時系統(tǒng)將掃描鍵盤,等待有健按下,一旦有健按下,就將其字符的ASCII碼讀入,先檢查是否Ctrl-Break,若是,退出命令執(zhí)行;否則將ASCII碼送AL,同時將該字符送顯示器顯示。412) 10號調用從鍵盤輸入字符串功能: 從鍵盤接收字符串送入內存的輸入緩沖區(qū),同時送顯示器顯示。調用前要求: 先定義一個輸入緩沖區(qū)MAXLEN DB 100 ;第1個字節(jié)指出緩沖區(qū)能容納的字符 個數(shù),即緩沖區(qū)長度,不能為0ACLEN DB ? ;第2個字節(jié)保留,以存放實際輸入的字符 個數(shù)STRING DB 100 DUP(?) ;第3
33、個字節(jié)開始存放從鍵盤輸 入的字符串。 調用格式: LEA DX, MAXLEN(緩沖區(qū)首偏移地址) MOV AH,10INT 21H注意:調用時,要求DS:DX指向輸入緩沖區(qū)42(2)顯示輸出 1) 2號調用在顯示器上顯示輸出單個字符調用格式: MOV DL,待顯示字符的ASCII碼 MOV AH,2 INT 21H功能:將DL中的字符送顯示器顯示?!纠匡@示輸出大寫字母A MOV DL,41H ;或寫為 MOV DL,A MOV AH,2 INT 21H 2) 9號調用在顯示器上顯示輸出字符串調用格式: LEA DX,字符串首偏移地址 MOV AH,9 INT 21H功能:將當前數(shù)據區(qū)中DS
34、:DX所指向的以$結尾的字符串送顯示器顯示。43【例】在顯示器上顯示字符串“GOOD LUCK! ”DATA SEGMENT STRING DB GOOD LUCK! $ DATA ENDSCODE SEGMENT MOV AX,DATA MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H CODE ENDS44二、二、BIOS中斷調用中斷調用 1、什么是BIOS BIOS的全稱是ROM-BIOSROM Basic I/O System(只讀存儲器基本輸入輸出系統(tǒng))。 它是一組固化到微機主板上一個ROM芯片上的子程序,主要功能包括:(1)(1)驅動系統(tǒng)中所配置的常
35、用外設(即驅動程序),如顯示驅動系統(tǒng)中所配置的常用外設(即驅動程序),如顯示器、鍵盤、打印機、磁盤驅動器、通信接口等。器、鍵盤、打印機、磁盤驅動器、通信接口等。(2)(2)開機自檢,引導裝入。開機自檢,引導裝入。(3)(3)提供時間、內存容量及設備配置情況等參數(shù)。提供時間、內存容量及設備配置情況等參數(shù)。 使用使用BIOSBIOS中斷調用與中斷調用與DOSDOS系統(tǒng)功能調用類似,用戶也無須系統(tǒng)功能調用類似,用戶也無須了解相關設備的結構與組成細節(jié),直接調用即可。了解相關設備的結構與組成細節(jié),直接調用即可。45實現(xiàn)簡單的人機對話實現(xiàn)簡單的人機對話n屏幕顯示:Whats your name? (使用9
36、號DOS功能調用)用戶輸入:LiMing (使用10號DOS功能調用)屏幕再顯示:Hello, LiMing! (使用9號DOS功能調用)46n程序清單: DATA SEGMENTBUF DB 30ACTL DB ?STR DB 30 DUP(?)MESS DB Whats yourname?,0DH,0AH, $DMESS DB 0DH,0AH, Hello,$ DATA ENDS47 CODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA DX,MESSMOV
37、AH,9INT 21H ;顯示 Whats your name?48 LEA DX,BUFMOV AH,10INT 21H ;從鍵盤接收用戶輸入的信息MOV AL,ACTL ;取得鍵入字符串的實際長度CBWMOV SI,AXLEA BX,STR MOV BX+SI,BYTE PTR ! ;在鍵入的字符串后加!MOV BX+SI+1,BYTE PTR $ ;在!后加$,以便顯示LEA DX,DMESS ;顯示Hello!MOV AH,9INT 21H 49 LEA DX,STR ;顯示鍵入的字符串MOV AH,9INT 21H RETMAIN ENDP CODE ENDSEND MAINl兩者相
38、比較,BIOS可更直接地控制外設,故能完成更復雜的輸入/輸出操作;l而DOS操作對硬件依賴性少,比相應的BIOS操作簡單,因此在二者能完成同樣功能時,應盡量使用DOS功能調用。50n2、調用方法 用戶在匯編語言程序中可使用軟中斷指令“INT n”調用BIOS程序,其中n是中斷類型碼。常用的BIOS程序的功能與其中斷類型碼對應關系如下表:51 例如,用指令“INT 16H”可調用鍵盤驅動程序。 當某個BIOS程序中具有多種不同功能時,用不同的編號功能號加以區(qū)分,并約定功能號存放在寄存器AH中。其調用方法與DOS功能調用類似: (1) 功能號AH (2) 入口參數(shù)指定寄存器 (3) 指令“INT
39、n”實現(xiàn)對BIOS子程序的調用 下面以鍵盤I/O中斷調用為例介紹BIOS中斷調用的方法。523、鍵盤I/O中斷調用示例 鍵盤I/O中斷調用(INT 16H)有三個功能,功能號為02。 (1) AH=0 功能:從鍵盤讀入字符送AL。 出口參數(shù):(AL)鍵入字符的ASCII碼;(AH)鍵入字符的掃描碼 【例】MOV AH,0 INT 16H 調用結果:將鍵盤輸入字符的ASCII碼送AL,掃描碼送AH。 53(2) AH=1 功能:從鍵盤讀入字符送AL,并設置ZF標志,若按過任一健,則置ZF=0,否則ZF=1。 出口參數(shù):ZF=0 ,鍵盤有輸入,(AL)鍵入字符的ASCII碼; ZF=1,鍵盤無輸入
40、(3) AH=2 功能:讀取特殊功能建的狀態(tài)。 出口參數(shù):AL中是各特殊功能鍵的狀態(tài) AL中某位為1,表示對應鍵按下; 為0則表示未按下。 54匯編語言源程序結構匯編語言源程序結構1 1源程序結構源程序結構源程序通常由一個或幾個程序模塊組成源程序通常由一個或幾個程序模塊組成, ,每個模每個模塊包括數(shù)據段、堆棧段和若干代碼段。代碼段可有若塊包括數(shù)據段、堆棧段和若干代碼段。代碼段可有若干個過程干個過程, ,1 1源程序結構源程序結構 NAME MAIN_PROGMODULE數(shù)據段名數(shù)據段名 SEGMENT 變量定義變量定義 數(shù)據空間預置數(shù)據空間預置數(shù)據段名數(shù)據段名 ENDS堆棧段名堆棧段名 SEG
41、MENT ;STACK定義堆棧段定義堆棧段堆棧段空間預置堆棧段空間預置堆棧段名堆棧段名 ENDS代碼段名代碼段名 SEGMENTASSUME 段寄存器地址說明段寄存器地址說明START: 段地址裝填段地址裝填 主程序體主程序體1 1源程序結構源程序結構過程名過程名1 PROC 類型說明類型說明 過程體過程體1過程名過程名1 ENDP過程名過程名2 PROC 類型說明類型說明 過程體過程體2過程名過程名2 ENDP 過程名過程名N PROC 類型說明類型說明 過程體過程體N過程名過程名N ENDP 代碼段名代碼段名 ENDS END START源程序結構源程序結構對于以上匯編語言源程序的結構中的
42、具體內容對于以上匯編語言源程序的結構中的具體內容,前面已經作過介紹前面已經作過介紹,這里應指出的是:這里應指出的是:任何一個匯編任何一個匯編語言源程序至少應該含有一個代碼段語言源程序至少應該含有一個代碼段, 必須用必須用END偽偽指令告訴匯編程序指令告訴匯編程序,匯編到此結束。匯編到此結束。堆棧段和數(shù)據段視需要而定。如果使用堆棧操作堆棧段和數(shù)據段視需要而定。如果使用堆棧操作,用戶最好自己設置堆棧用戶最好自己設置堆棧,若不設置用戶專用堆棧空間若不設置用戶專用堆??臻g,將自動使用系統(tǒng)的堆??臻g。將自動使用系統(tǒng)的堆??臻g。當有變量定義或預置數(shù)據空間時當有變量定義或預置數(shù)據空間時,應在數(shù)據段應在數(shù)據段
43、/附附加段中進行定義。加段中進行定義。對匯編源程序中的幾個問題的說明對匯編源程序中的幾個問題的說明 1) 程序的分段定義及段寄存器的裝填整個程序是由若干個邏輯段組成的,至少應有一個代碼段被定義。段定義的偽指令為SEGMENT和ENDS。ASSUME 偽指令指出各邏輯段所應該裝填的地址,但并沒有將段基址裝入相應的段寄存器中。ASSUME指出了各段寄存器與當前被使用的邏輯段的對應關系。CS是系統(tǒng)在加載程序后由系統(tǒng)自動裝填的,即由操作系統(tǒng)的任務(進程)管理程序自動完成裝填的。CS裝填不需要用戶管理。 1) 程序的分段定義及段寄存器的裝填堆棧段SS也可以不用用戶裝填,可由系統(tǒng)自動裝填,此時必須在定義堆
44、棧段偽指令中,把參數(shù)寫全。其形式如下: STACK SEGMENT PARA STACK STACK當程序裝入內存時,系統(tǒng)會自動地把堆棧段地址和棧指針置入SS和SP中, 但如果沒有給出必要的參數(shù),則還應由用戶裝填SS和SP寄存器值。DS、ES、SS的裝填可以使用實例中的兩條指令: MOV AX,DATA MOV DS,AX 2) MS-DOS環(huán)境下正確返回DOS的問題匯編語言程序可以在DOS環(huán)境下直接運行,例如經過匯編后生成帶后綴 .COM或 .EXE 可執(zhí)行文件的形式, 也可以由 .EXE文件再轉換成 .BIN二進制文件的形式被其它高級語言調用。但匯編語言通常都以 .EXE文件進行調試, 所
45、以,應解決程序執(zhí)行后正常返回 DOS 系統(tǒng)的問題, 否則往往以死機結束。通常,可以用以下三個方法之一返回DOS :(1) 用功能調用4CH 一般在主程序的代碼段結束前插入下面兩條指令: MOV AH, 4CH INT 21H 2) MS-DOS環(huán)境下正確返回DOS的問題執(zhí)行以上兩條指令后,將由系統(tǒng)結束程序并返回到DOS狀態(tài)下,給出DOS提示符,等待新的命令鍵入。這是最常用的一種返回DOS的方法。(2)用中斷INT 20H 系統(tǒng)把中斷號20H作為結束任務返回DOS的服務功能使用。故在用戶程序結束時,可插入一條 INT 20H指令。(3)在裝填DS之前用下面三個語句:PUSH DSMOV AX,0PUSH AX4.5 4.5 程序設計方法和上機調試程序設計方法和上機調試一、 匯編語言應用程序的開發(fā)過程開發(fā)8086/8088匯編語言源程序的過程如下: 用文本編輯程序建立和修改源程序。( PWB、EDLINT、WS、EDIT ) 調用宏匯編程序(MASM)對源程序進行匯編。 利用連接程序(LINK)把匯編后生成的目標文件連接裝配成為可執(zhí)行的文件。 利用調試程序(DEBUG)對可執(zhí)行文件進行調試(擴展名為.EXE或.COM的可執(zhí)行文件)。 在DOS下運行可執(zhí)行的文件一、一、 匯編語言應用程序的開發(fā)過程匯編語言應用程序的開發(fā)過程1、 源文件的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年天津公務員行測(B類)真題及答案
- 寧波交投公路營運管理有限公司招聘考試真題2024
- 2024年湖北武漢公安管理干部學院輔導員考試真題
- 2025年能源互聯(lián)網分布式能源交易機制與能源互聯(lián)網市場潛力分析報告001
- 定遠縣小學期中數(shù)學試卷
- 高一濟南期末數(shù)學試卷
- 東營教師招聘數(shù)學試卷
- 2025至2030全球及中國條形碼系統(tǒng)行業(yè)項目調研及市場前景預測評估報告
- 高新湖華師附中數(shù)學試卷
- 高三簡單數(shù)學試卷
- 頭等大事:脫發(fā)青年自救指南
- 中特第五講社會建設天津大學
- 密封條范文模板(A4打印版)
- 施工現(xiàn)場安全交底15篇
- 哈雷之約:基于指數(shù)成分股調整的選股策略
- 湖北省隨州市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細及行政區(qū)劃代碼
- 高處作業(yè)審批表
- 急救醫(yī)學模擬中心建設方案
- 三維激光掃描技術與應用實例-PPT課件
- 農用地評價方法
- (新知杯)2017-2011上海市初中數(shù)學競賽試卷
評論
0/150
提交評論