版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第三章 匯編語言程序設(shè)計,本章內(nèi)容,匯編語言源程序的格式 偽操作命令 DOS及BIOS功能調(diào)用,計算機(jī)程序設(shè)計語言的演變,1. 機(jī)器語言直接用機(jī)器指令來編制計算機(jī)程序的方法。 2. 匯編語言 可以用助記符來表示指令的操作和操作數(shù),也可以用標(biāo)號和符號來代替地址、常量和變量。 3. 高級語言更接近于人們的自然語言和習(xí)慣的教學(xué)語言來描述算法的執(zhí)行過程,從而使編寫的過程更加直觀和簡練。,為什么要用匯編語言,匯編語言非常接近機(jī)器語言程序,通過編制匯編語言程序,可以清楚地了解計算機(jī)的工作過程。 現(xiàn)在的微機(jī)系統(tǒng)中,底層的一些功能仍然靠匯編語言程序來實現(xiàn)。 匯編語言程序的效率通常高于高級語言程序。,舉例,da
2、ta SEGMENT msg DB Hello, World!$ data ENDS code SEGMENT ASSUME CS : code , DS : data MAINPROC NEAR start: MOV AX , data MOVDS , AX LEA DX , msg MOV AH , 9h INT 21h MOV AX , 4C00h INT 21h MAINENDP code ENDS END start,在屏幕上顯示Hello, World!,本例將在下文中多次提及,為方便計,下文簡稱其為“Hello例”。,3.2.1 分析1分段結(jié)構(gòu),可以看出,匯編語言源程序是分段結(jié)構(gòu)
3、的形式。 一個匯編源程序由若干個段(Segment)組成。每個段以SEGMENT語句開始,以ENDS結(jié)束。整個源程序以END語句結(jié)尾。 這里所說的匯編語言源程序的段和第一章中的CPU管理的存儲器的段是不同的概念。 匯編語言的段是邏輯段;8086CPU管理的存儲器的段是物理段(共有4個:數(shù)據(jù)段、附加段、堆棧段、代碼段,對應(yīng)4個段寄存器:DS、ES、SS和CS)。一個匯編語言源程序中可以有多個邏輯段。 上例中共有兩個邏輯段:data和code。,分析2,注:功能號09H的int 21中斷 功能描述: 輸出一個字符串到標(biāo)準(zhǔn)輸出設(shè)備上。 入口參數(shù): AH09H DS : DX待輸出字符的地址 說明:待
4、顯示的字符串以$作為其結(jié)束標(biāo)志,代碼段開頭執(zhí)行了一次功能號09H的21號DOS中斷,用于在屏幕上顯示字符串。關(guān)于DOS功能調(diào)用,后文將有詳細(xì)解釋。 此處先列出功能號09H的21號DOS中斷的相關(guān)資料:,最后兩行(MOV AX,4C00h、INT 21h)也是一個DOS功能調(diào)用。,注:功能號4CH的int 21中斷 功能描述: 終止程序的執(zhí)行,并可返回一個代碼 入口參數(shù): AH4CH AL返回的代碼,匯編語言開發(fā)過程,源程序 : 文件名.asm,目標(biāo)程序:文件名.obj,可執(zhí)行文件:文件名.exe,Finish,編輯器,如notepad.exe,匯編器,如masm.exe,鏈接器,如link.e
5、xe,調(diào)試器,如debug.exe,開發(fā)工具 (了解),X86+Windows平臺下常用的匯編編譯器有: Microsoft公司的 MASM Borland公司的 TASM 開源社區(qū)的 NASM MASM是微軟推出的宏匯編語言,自發(fā)布以來已有多次版本更新,下頁表格中列出了幾個較為典型的版本。 注:容易與之混淆的是MASM32,它是Steve Hutchesson以個人名義發(fā)布、基于MASM而構(gòu)建的軟件包。其版本號和MASM的版本號是不同的,比如MASM32V8使用的匯編編譯器是MASM6。MASM32的最新版本為MASM32V12。,MASM版本歷史(了解),開發(fā)工具 (了解),Masm5適合
6、進(jìn)行DOS程序開發(fā); Masm6以后的版本開始支持Win32程序開發(fā)。 (微軟官方發(fā)布的Masm6所附的link.exe是Segmented Executable Linker,只能開發(fā)DOS程序;要進(jìn)行Win32開發(fā)必須配備Incremental Linker,該類型的link.exe可以從Visual Studio中獲取。開發(fā)Win32程序推薦使用MASM32開發(fā)包) 開發(fā)DOS程序的Masm下載地址: Masm5.00 羅云彬的編程樂園 30:22366/view.asp?file=51 Masm615 For Dos aogo匯編小站 ,開發(fā)步驟演示
7、 (了解),使用MASM 5.0,開發(fā)步驟演示 (了解),使用MASM 6.15 For DOS,3.2.2 語句的類型,匯編語言源程序中的語句主要有以下兩種類型: 指令性語句 指示性語句 指令性語句主要由CPU指令組成,對應(yīng)實際的機(jī)器指令;(比如“Hello例”中的 MOV DS , AX ) 指示性語句又稱偽操作語句,主要由偽操作指令組成。(比如“Hello例”中的 code SEGMENT ),語句的組成,匯編語言的語句可以有14個組成部分,如下所示: 名字 操作碼/偽操作碼 操作數(shù) ;注釋 帶方括號的部分表示可選項。以“Hello例”中的幾條語句為例:,3.2.3 語句的組成名字,名字
8、 在指令性語句中,名字是一個標(biāo)號,實際上就是指令的符號地址。比如“start : MOV AX , data”中的 start: 。并非每條指令性語句都必須有標(biāo)號。但如果有了這個標(biāo)號,程序中其他地方就可引用這個標(biāo)號,比如執(zhí)行跳轉(zhuǎn)或者CALL調(diào)用。指令性語句中的標(biāo)號后面通常有一個冒號。 標(biāo)號有三種屬性:段、偏移量和類型。 段屬性是定義標(biāo)號的程序段的段地址。 偏移量表示標(biāo)號所在段的起始地址到定義該標(biāo)號的地址之間的字節(jié)數(shù)。 標(biāo)號的類型有兩種:NEAR和FAR。前者可以在段內(nèi)被引用,地址指針為兩個字節(jié);后者可以在其他段中被引用,地址指針為4個字節(jié)。,語句的組成名字,在指示性語句中,名字可以是變量名、段
9、名、過程名。 比如“Hello例”中“data SEGMENT”中的data是段名, “msg DB Hello, World!$”中的msg是變量名。 指示性語句中的標(biāo)號后面通常沒有冒號。 變量也有三種屬性:段、偏移量和類型。 段屬性是變量所代表的數(shù)據(jù)所在段的段地址。 偏移量表示變量所在段的起始地址與變量的地址之間的字節(jié)數(shù)。 變量的類型有: BYTE、WORD、DWORD(四字節(jié))、QWORD(八字節(jié))和TBYTE(十字節(jié))等,表示數(shù)據(jù)區(qū)中存取操作對象的大小。,3.2.4 語句的組成操作碼/偽操作碼,操作碼/偽操作碼 在匯編語言中操作碼以助記符的形式存在。8086/8088 CPU的助記符總
10、共約有90多種,比如MOV、ADC等。 關(guān)于所有的助記符,參見第二章指令系統(tǒng)。 指示性語句中的DB、SEGMENT、ENDS、ASSUME、END等都是偽操作碼,而不是CPU指令的助記符。 它們在程序中的作用是定義變量的類型、定義段以及命令匯編程序(masm.exe)結(jié)束匯編 等。它們是指示匯編程序(masm.exe)完成匯編,本身不產(chǎn)生對應(yīng)的機(jī)器碼。 關(guān)于偽操作碼的具體作用和使用方法,下文有專門章節(jié)討論。,3.2.5 語句的組成操作數(shù),操作數(shù) 對于CPU指令,可能有單操作數(shù)和雙操作數(shù),也可能無操作數(shù);偽指令可能有更多個操作數(shù)。 可以用作操作數(shù)的有:常數(shù)、寄存器、標(biāo)號、變量和表達(dá)式。 常數(shù) 十
11、進(jìn)制數(shù),如99D或99。后面加字母“D”,或者什么也不加。 十六進(jìn)制數(shù),如64H,0F800H,后面加一個字母“H”;如果最高位數(shù)值不是09,前面要再加一個數(shù)字0。(以避免和寄存器名稱如“AH”沖突) ASCII常數(shù),例如A、8、cat,字符應(yīng)該放在單引號中。,語句的組成操作數(shù),寄存器 8086/8088的寄存器可以用作指令的操作數(shù)。8086/8088 CPU的寄存器有: 8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL。 16位寄存器:AX、BX、CX、DX、SI、DI、BP、SP、DS、ES、SS、CS。 標(biāo)號 標(biāo)號代表一條指令的符號地址,因此可以作為轉(zhuǎn)移、過程調(diào)用CALL 以及
12、循環(huán)控制 LOOP 等指令的操作數(shù)。 比如“HELLO例”中“END start”,start就是一個標(biāo)號。,語句的組成操作數(shù),變量 變量是存儲器中某個數(shù)據(jù)區(qū)的名字,因此在指令中可以作為存儲器操作數(shù)。 如“Hello例”中的:LEA DX , msg 其中 msg 就是一個在數(shù)據(jù)區(qū)定義的變量(msg DB Hello, World!$)。 表達(dá)式 匯編語言中的表達(dá)式按其性質(zhì)可以分為兩種:數(shù)值表達(dá)式和地址表達(dá)式。 數(shù)值表達(dá)式產(chǎn)生一個數(shù)值結(jié)果,只有大小,沒有屬性。 地址表達(dá)式的結(jié)果不是一個單純的數(shù)值,它有三種屬性:段、偏移量和類型。,語句的組成操作數(shù),構(gòu)成表達(dá)式必然有運算符。表達(dá)式中常用運算符有以
13、下幾種: 算術(shù)運算符,如 +、-、*、/和MOD(模除) 這些算術(shù)運算符可用于數(shù)值表達(dá)式,運算結(jié)果是一個數(shù)值。在地址表達(dá)式中通常只使用其中的+和 兩種運算符。 邏輯運算符 ,如 AND、OR、XOR和NOT 邏輯運算符只用于數(shù)值表達(dá)式中對數(shù)值進(jìn)行按位邏輯運算。對地址進(jìn)行邏輯運算是沒有意義的。 不要把邏輯運算符如AND、OR、XOR和NOT等與同樣名稱的CPU指令相混淆。前者可對整常數(shù)進(jìn)行按位邏輯運算,是在匯編時進(jìn)行;后者的操作數(shù)可以是寄存器、存儲器和立即數(shù),是在程序運行時由CPU執(zhí)行。比如: ANDAL,01011010B;這里的AND是指令助記符 MOVAL,01011010B AND 11
14、110000B ;這里的AND是邏輯運算符,語句的組成操作數(shù),關(guān)系運算符 如 EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)等。 參與關(guān)系運算的必須是兩個數(shù)值,或同一段中的兩個存儲單元地址,但運算結(jié)果只能是兩個特定的數(shù)值之一。當(dāng)關(guān)系不成立(假)時,結(jié)果為0;當(dāng)關(guān)系成立(真)時,結(jié)果為0FFFFH(-1)。 例如: MOV AX,4 EQ 3 ;關(guān)系不成立,故(AX) 0 MOV AX, 4 NE 3;關(guān)系成立,故(AX) 0FFFFH,語句的組成操作數(shù),分析運算符和合成運算符 如 OFFSET、SEG、TYPE 、SIZE和LENGTH等;合成運
15、算符有PTR、THIS、SHORT等。 分析運算符用以分析一個存儲器操作數(shù)的屬性,如段、偏移量或類型等。合成運算符則可以規(guī)定存儲器操作數(shù)的某個屬性,例如類型。 OFFSET用于獲取一個標(biāo)號或變量的偏移地址,如: MOV SI , OFFSET DATA1 是將變量DATA1的偏移地址送至SI寄存器。 其效果等同于: LEA SI , DATA1,語句的組成操作數(shù),SEG用于獲取標(biāo)號或變量的段址,如: MOV AX , SEG ARRAY MOV DS , AX 是將變量ARRAY的段地址送入DS寄存器。 TYPE的運算結(jié)果是一個數(shù)值,這個數(shù)值與存儲器操作數(shù)類型屬性的關(guān)系如下:,語句的組成操作數(shù)
16、,TYPE運算符的例子 VAR DW ? ARRAY DD 10 DUP(?) STRDB This is a test MOV AX , TYPE VAR;(AX) 2 MOV BX , TYPE ARRAY;(BX) 4 MOV CX , TYPE STR;(CX) 1 LENGTH 如果一個變量已用重復(fù)操作符DUP說明其變量的個數(shù),則利用LENGTH獲取這個變量的個數(shù)。如果未用DUP說明,則得到的結(jié)果為1。 比如上例中 , LENGTH ARRAY 運算結(jié)果為10。,語句的組成操作數(shù),SIZE 如果一個變量已用重復(fù)操作符DUP說明,則利用SIZE運算符可得到分配給該變量的字節(jié)總數(shù)。如果未
17、用DUP說明,則得到的結(jié)果是TYPE運算的結(jié)果。 比如上例中 , SIZE ARRAY 運算結(jié)果為10440。由此可知,SIZE的運算結(jié)果等于LENGTH的運算結(jié)果乘以TYPE的運算結(jié)果。 PTR 是一個合成運算符,用于指定存儲器操作數(shù)的類型。 比如 INC BYTE PTR BX SI , 指令中利用PTR運算符明確規(guī)定存儲器操作數(shù)的類型為BYTE(字節(jié)),因此,本指令將一個8位存儲器的內(nèi)容加1。,語句的組成操作數(shù),THIS 也可以指定存儲器操作數(shù)的類型。使用THIS運算符可以使標(biāo)號或變量的類型具有靈活性。例如要求對同一個數(shù)據(jù)區(qū),既可以字節(jié)作為單位,又可以字作為單位進(jìn)行存取,則可以用以下語句
18、: AREAW EQU THIS WORD AREAB DB 100 DUP (?) 上面的AREAW和AREAB代表同一個數(shù)據(jù)區(qū),其中共有100個字節(jié),但AREAW的類型為WORD,而AREAB的類型為BYTE。 SHORT 指定一個標(biāo)號的類型為SHORT(短標(biāo)號),即標(biāo)號到引用標(biāo)號的指令間的距離在-128127之間。短標(biāo)號可用于無條件轉(zhuǎn)移和條件轉(zhuǎn)移指令中。使用短標(biāo)號的指令比使用默認(rèn)的近標(biāo)號的指令少一個字節(jié)。,語句的組成操作數(shù),方括號 間接尋址指令的存儲器操作數(shù)要在寄存器名BX、BP、SI或DI外面加上方括號,以表示存儲器地址。又如,變址尋址指令的存儲器操作數(shù)既要用算術(shù)運算符將SI或DI與一
19、個位移量做運算,又要在外面加上方括號來表示存儲器地址。 MOV CL , BX MOV AL , SI+5 段超越運算符“ : ” 是“:”(冒號)跟在段寄存器名(DS、ES、SS或CS)之后表示段超越,用以給一個存儲器操作數(shù)指定一個段屬性,而不管其原來隱含的段是什么。例如: MOV AX , ES : SI HIGH和LOW 獲取一個數(shù)值或地址表達(dá)式的高位和低位字節(jié)。 STUFF EQU 0ABCDH MOV AH , HIGH STUFF ; (AH) 0ABH MOV AL , LOW STUFF ; (AL) 0CD H,語句的組成操作數(shù),如果一個表達(dá)式中同時具有多個運算符,那么按照以
20、下規(guī)則進(jìn)行運算: 優(yōu)先級高的先運算,優(yōu)先級低的后運算; 同一優(yōu)先級按表達(dá)式中從左到右的順序進(jìn)行運算; 圓括號可提升運算優(yōu)先級,圓括號內(nèi)的運算符總是在其任何相鄰的運算之前進(jìn)行。 各種運算符的優(yōu)先級順序如下頁圖表所示。表中同一行的運算符具有同等優(yōu)先級。,語句的組成操作數(shù),3.2.6 語句的組成注釋,注釋 和其他語言一樣,匯編語言中的注釋僅用于提高程序的可讀性。 匯編語言中的注釋前面要求加上分號(;)。 如果注釋內(nèi)容較多,超過一行,則換行以后前面還要加上分號。 注釋也可以從一行的最前面開始。 匯編程序(masm.exe)對注釋不予理會,即注釋對匯編后產(chǎn)生的目標(biāo)程序沒有任何影響。,3.3 偽操作指令,
21、指示性語句中的偽操作指令,因其表示形式類似于CPU指令,故稱其為“偽指令”。 偽指令與CPU指令的區(qū)別: CPU指令是給 CPU 的指令,對應(yīng)CPU的特定操作,如加法運算;而偽指令是給 匯編程序 (masm.exe)的指令,指示匯編程序進(jìn)行操作,比如定義段、定義數(shù)據(jù)。 CPU指令在匯編后產(chǎn)生一一對應(yīng)的 目標(biāo)代碼 ,偽指令不產(chǎn)生與之對應(yīng)的目標(biāo)代碼。 下面列出“Hello例”的匯編源碼及其對應(yīng)的機(jī)器碼 對比體會偽指令的作用。,Hello, World! 的匯編源代碼,Hello, World! 的機(jī)器代碼,Hello, World! 機(jī)器代碼的分析,可以看到,編譯后的機(jī)器代碼中,偽指令都已經(jīng)不見了
22、。原來的代碼段中每條指令性語句都對應(yīng)一條機(jī)器碼。 匯編源代碼中的第一句MOV AX , data經(jīng)編譯后變成MOV AX , 1449。這是因為編譯器 (masm.exe) 將數(shù)據(jù)段放在 1449 : 0000 的位置。然后將DS : DX指向該位置,通過INT21的09H中斷將其顯示出來。,資料回顧: 功能號09H的int 21中斷 功能描述: 輸出一個字符串到標(biāo)準(zhǔn)輸出設(shè)備上。 入口參數(shù): AH09H DS:DX待輸出字符的地址 說明:待顯示的字符串以$作為其結(jié)束標(biāo)志,Hello, World! 機(jī)器代碼的分析,下圖使用 d 1449:0000顯示了數(shù)據(jù)段中的內(nèi)容:,3.3 偽操作命令,宏匯
23、編程序MASM提供了數(shù)十種偽操作。 (這里也揭示了操作碼和偽操作碼的另一個區(qū)別:偽操作碼隨編譯器的不同而不同; 而操作碼隨CPU的不同而不同。) 根據(jù)偽操作的功能,大致可以分為下列幾類:,偽操作指令分類,處理器方式偽操作(了解),處理器方式偽操作用于指示匯編編譯器使用何種CPU的指令系統(tǒng)。 常用的有以下幾種: .8086 指示匯編程序只匯編8086/8088的指令系統(tǒng)。程序中若出現(xiàn)80286或80386的指令,則編譯會出錯。 如果程序中不定義任何處理器方式偽操作,則匯編程序默認(rèn)即是.8086方式。 .386P 指示匯編程序匯編8086/8088以及所有80286和80386(包括保護(hù)方式和非保
24、護(hù)方式)的指令。,3.3.2 數(shù)據(jù)定義偽指令,數(shù)據(jù)定義偽操作用于定義變量類型、給變量賦值。 常用的有以下幾種: 數(shù)據(jù)定義偽操作的一般格式是: 變量名 偽操作 操作數(shù) ,操作數(shù) 操作數(shù)可以是常數(shù)、表達(dá)式或字符串,但每項操作數(shù)的值不能超過偽操作所定義的數(shù)據(jù)類型限定的范圍。,例1: DATA_B DB 10, 5, 10H DATA_W DW 100H, -4 DATA_D DD 0FFFBH 匯編后的內(nèi)存分配情況 如右圖所示。,Q,例2:操作數(shù)可以是字符串,例如 STR DBHELLO 匯編后的情況如圖:,注意下面兩個定義的不同之處: DBAB ;41H在低字節(jié),42H在高字節(jié) DW AB ;42
25、H在低字節(jié),41H在高字節(jié),用DW定義字符串只允許包含兩個字符,否則必須用DB指令; 字符串的個數(shù)不超過255個; 字符串必須用單引號引起來。,幾點說明:,操作數(shù)?用來保留存儲空間,但不存入數(shù)據(jù)。 例3:ABC DB 0,1,2,3,4,OK,$ RSV DW ?,?,?,?,?,?,?,? 復(fù)制操作符DUP: 重復(fù)的數(shù)據(jù)可以使用復(fù)制操作符DUP,如上面RSV亦可寫成: RSV DW 8 DUP(?),3.3.3 符號定義偽操作,符號定義偽操作用于給一個符號重新命名,或定義新的類型屬性等。這里的符號可以是匯編語言中所用的變量名、標(biāo)號名、過程名、記錄名、寄存器名以及指令助記符等。 常用的符號定義
26、偽操作有EQU、LABEL EQU 格式: 名字 EQU 表達(dá)式 作用:用名字代替一個數(shù)值,或一個較長的表達(dá)式。 舉例:HPIXEL EQU 1024 VPIXEL EQU 768 SCREENEQU HPIXEL * VPIXEL,符號定義偽操作,格式: 名字 = 表達(dá)式 作用: 類似 EQU,區(qū)別在于“ = ”可以對一個名字重復(fù)定義。 舉例:COUNT = 10 MOV CX, COUNT;(CX) 10 COUNT = COUNT -1 MOV BX, COUNT;(BX) 9 LABEL 格式: 名字 LABEL 表達(dá)式 作用: 定義標(biāo)號或變量的類型。 舉例:AREAW LABEL W
27、ORD MOV AREAW , AX ;AX送AREAW的第1、2字節(jié)中,3.3.4 段定義偽操作,段定義偽操作用于在匯編語言源程序中定義邏輯段。 常用的段定義偽操作有SEGMENT/ENDS、ASSUME SEGMENT/ENDS 格式: 段名 SEGMENT 定位類型 組合類型 類別 作用: 定義一個邏輯段 舉例:STACK SEGMENT DB 100 DUP( ? ) STACK ENDS “定位類型”告訴編譯器如何確定邏輯段的邊界在存儲器中的位置,即對齊方式。有PARA、BYTE、WORD和PAGE四種。 “組合類型”告訴編譯器在裝入程序時各個邏輯段如何組合。 “類別”的作用是在連接
28、時決定各邏輯段的裝入順序。,段定義偽操作,ASSUME 格式: ASSUME 段寄存器 : 段名 , 段寄存器 : 段名 , 說明: 將某一個段寄存器和某一個邏輯段進(jìn)行關(guān)聯(lián)。 “段名”可以是曾用 SEGMENT 操作符定義過的一個段名,或是在一個標(biāo)號或變量前面加上 SEG 構(gòu)成的表達(dá)式,還可以是關(guān)鍵字NOTHING。 需要注意的是,ASSUME僅僅是通知編譯器有關(guān)段寄存器和邏輯段的關(guān)系,并沒有為段寄存器賦予實際的初值。 舉例:ASSUME CS : CODE , DS : DATA1 , SS : STACK ASSUME DS : SEG AREA1 ASSUME ES : NOTHING
29、;取消前面ASSUME對ES的設(shè)置,3.3.5 過程定義偽操作,過程定義偽操作命令為PROC / ENDP。 PROC / ENDP 格式: 過程名 PROC NEAR / FAR RET 過程名 ENDP 作用: 定義一個過程,賦予過程一個名字,并指出過程的類型,并指出該過程的類型是NEAR或FAR。如果沒有特別指明,則認(rèn)為過程類型是NEAR。偽操作碼ENDP標(biāo)志過程定義結(jié)束。 注意:PROC和ENDP必須成對出現(xiàn)。,過程的類型有兩種: NEAR(默認(rèn)類型)表示段內(nèi)調(diào)用; (SP)(SP-2); (SP+1): (SP)(IP); FAR表示段間調(diào)用。 調(diào)用一個過程的格式為: CALL ,3
30、.3.6 模塊定義與連接偽操作(了解),在編寫規(guī)模較大的匯編語言程序時,可將程序劃分成幾個獨立的源程序模塊,分別進(jìn)行匯編,最后統(tǒng)一連接。各個模塊之間可以相互進(jìn)行符號訪問。 命令為NAME、END、PUBLIC 和 EXTRN。 NAME 格式: Name 模塊名 作用: 指定源文件匯編后的目標(biāo)文件名稱 END 格式: END 標(biāo)號 作用: 表示源程序到此結(jié)束,對于END后面語句不予理會,模塊定義與連接偽操作(了解),PUBLIC 格式: PUBLIC 符號 , 作用: 說明本模塊中的某些符號是公共的,即這些符號可以供將被連接在一起的其他模塊使用 說明: “符號”可以是本模塊中定義的變量、標(biāo)號或
31、數(shù)值的名字,包括用PROC定義的過程名等。 EXTRN 格式: EXTRN 名字:類型 , 作用: 說明本模塊中所用的某些符號是外部的,即這些符號在將被連接在一起的其他模塊中定義(定義這些符號的模塊中還必須用PUBLIC說明)。,3.3.7 宏處理偽操作,如果在程序中需要多次使用一個程序段,可將其定義為宏。每次需要時,直接進(jìn)行調(diào)用,稱為宏調(diào)用。 【利用過程( PROC )可以實現(xiàn)類似功能。 區(qū)別在于:宏在編譯時就插入每個宏調(diào)用處(這稱為“宏擴(kuò)展”);而過程是在執(zhí)行時進(jìn)行跳轉(zhuǎn)。過程具有更優(yōu)的空間效率,而宏則具有更優(yōu)的時間效率?!?MACRO/ENDM 格式: 宏指令名 MACRO ; (宏定義體
32、) ENDM 作用: 將宏指令名定義為宏定義體中包含的程序段。,宏處理偽操作,宏定義偽操作允許帶參數(shù),從而具有更強(qiáng)的通用性。 例:定義一個宏,用于兩個壓縮的BCD數(shù)相加,結(jié)果放在第一個操作數(shù)中。 DECADDMACRO OPR1 , OPR2 MOV AL , OPR1 ADD AL , OPR2 DAA MOV OPR1 , AL ENDM 下面使用debug來觀察該例中“宏擴(kuò)展”是如何進(jìn)行的:,源文件,反匯編并執(zhí)行觀察結(jié)果,3.4 DOS和BIOS調(diào)用(了解),DOS 和 BIOS為用戶提供了兩組系統(tǒng)服務(wù)程序。 BIOS是 IBM PC的基本IO系統(tǒng),包括系統(tǒng)測試程序、初始化引導(dǎo)程序、一部
33、分中斷矢量裝入程序以及部分外設(shè)的服務(wù)程序。這些程序都固化在主板上的ROM中。 DOS是 IBM PC的操作系統(tǒng),負(fù)責(zé)管理系統(tǒng)的所有資源。其中包括大量可供用戶調(diào)用的服務(wù)程序。 DOS和BIOS調(diào)用不是使用CALL命令,而采用軟中斷指令 INT n。,DOS和BIOS調(diào)用,用戶程序控制PC機(jī)硬件的方式 使用高級語言提供的功能控制硬件 調(diào)用方便,但靈活性較低、速度較慢。 使用DOS提供的程序控制硬件 調(diào)用較為方便,程序可移植性好,編程簡單。 使用BIOS提供的程序控制硬件 這種控制比較低層,因而可移植性差,但效率更高。 直接訪問硬件 要求用戶對硬件非常熟悉。此種方式只用于兩種情況:為了獲得高效率,或
34、是為了獲得DOS和BIOS不支持的功能。,DOS調(diào)用,8086指令系統(tǒng)中,有一條軟中斷指令 INT n。 當(dāng)n= 51FH時,調(diào)用BIOS服務(wù)程序; 當(dāng)n=203FH時,調(diào)用 DOS服務(wù)程序。 下表列出了部分DOS軟中斷的功能:,INT 21H調(diào)用,其中 INT 21H是一個具有完整功能的服務(wù)程序,一般稱之為DOS系統(tǒng)功能調(diào)用。是最常用的DOS中斷。 INT 21H中斷具有近90個子功能,大致分為4個方面: 設(shè)備管理、目錄管理、文件管理和其他。 系統(tǒng)功能調(diào)用(INT 21H)的使用步驟如下: 置系統(tǒng)功能號n (放入AH) 置入口參數(shù) 執(zhí)行INT 21H 分析出口參數(shù),INT 21H調(diào)用示例,例
35、:從鍵盤讀入一個字符, 判斷是 Y 還是 N , 以執(zhí)行對應(yīng)操作。,資料: 功能號01H的int 21H中斷 功能描述:從標(biāo)準(zhǔn)輸入設(shè)備(如:鍵盤)讀入一個字符 功能號: AH 01H,過濾掉控制字符,并回顯 出口參數(shù): AL 輸入字符的ASCII碼,KEY:MOV AH , 1 INT 21H;執(zhí)行調(diào)用 CMP AL , Y JE YES CMP AL , N JE NO JMP KEY;輸入其他字符,退回繼續(xù)等待輸入 YES : NO:,BIOS調(diào)用,下面列出了部分BIOS中斷:,關(guān)于BIOS中斷的所有中斷號內(nèi)容(從05H1FH),參見書附錄3.3,BIOS調(diào)用,BIOS調(diào)用的使用步驟如下:
36、 置系統(tǒng)功能號n (放入AH) 置入口參數(shù) 執(zhí)行 INT n 分析出口參數(shù) 舉鍵盤輸入服務(wù)(INT 16H)為例。其主要功能有三個,分別用于讀鍵盤、讀擴(kuò)展鍵盤和讀取功能鍵,分別對應(yīng)功能號0、1、2(AH0、1、2)。 下面一段程序的功能是:按下F1和F2鍵,分別執(zhí)行兩段不同的程序,按其他鍵則轉(zhuǎn)至錯誤處理。,INT 16H調(diào)用示例,資料: 功能號00H的int 16H中斷 功能描述: 從鍵盤讀入字符 入口參數(shù): AH00H 出口參數(shù): AH鍵盤的掃描碼 AL字符的ASCII碼,MOV AH , 0 INT 16H; 執(zhí)行調(diào)用 CMP AL , 0 JNE ERROR; 若為字符鍵,轉(zhuǎn) ERROR
37、CMP AH , 3BH; F1 鍵碼為 3BH JE TT1 CMP AH , 3CH; F2 鍵碼為 3CH JE TT2 JMP ERR TT1:;處理 F1 鍵功能 TT2:;處理 F2 鍵功能 ERR: ,資料: 鍵碼又稱鍵盤掃描碼, F1 鍵碼為 3BH F2 鍵碼為 3CH,INT 10H調(diào)用示例,從上頁的例子中,可以看出,同樣的功能,往往既可以用BIOS中斷調(diào)用來實現(xiàn),也可以用DOS中斷調(diào)用來實現(xiàn)。比如磁盤服務(wù)、鍵盤服務(wù)、顯示字符等。差別在于:BIOS中斷調(diào)用往往功能更強(qiáng)大、控制更靈活。 例:INT 10H功能號09H,“在當(dāng)前光標(biāo)位置顯示字符”。,MOV AH , 9;顯示字
38、符 MOV AL , a;字符 MOV BL , 0Ch; 0表示背景黑色,0Ch表示字符紅色 MOV BH , 0;第0頁 MOV CX , 8;字符重復(fù)個數(shù) INT 10h,INT 10H調(diào)用示例運行結(jié)果,提示: 由于程序運行在“虛擬”的8086模式下, 在操作硬件時跟純DOS仍存在一定差異。 如果程序直接雙擊運行時結(jié)果跟預(yù)期不符, (比如窗口一閃而過) 可使用debug加載然后輸入g運行。,匯編語言設(shè)計舉例,字符串查找 內(nèi)存中已經(jīng)存有一張表,要求從鍵盤上輸入一個字符串,然后在表中查找該字符串,如有,則在屏幕上顯示“OK!”;如果沒有,則顯示“NO!”;若輸入字符串長度超過內(nèi)存中表的長度,
39、則顯示“Wrong! The string is too long!” 邏輯分析: 查找可以分兩步進(jìn)行,先在表中搜索字符串的第一個字符,如有,再比較字符串的其他字符是否一致。 功能可行性分析: 在屏幕上顯示字符串可以使用功能號 09H的21號中斷; 從鍵盤上接收字符串可以使用功能號0AH的21號中斷。,教材 P178,流程圖,顯示提示符,從鍵盤接收提示符,字符串首址送SI,表首址送DI 字符串長度送BX,表長度送CX,表長=串長,搜索、匹配等工作,開始,返回,顯示“串太長”,具體見教材P179,資料1: 功能號09H的int 21H中斷,功能描述:顯示字符串 (串尾字符為$,但不顯示) 入口參
40、數(shù): AH09HDS:DX被顯示字符串的首地址 出口參數(shù):無,data SEGMENT msg DB Hello, World!$ data ENDS code SEGMENT ASSUME CS : code , DS : data MAINPROC NEAR start: MOV AX , data MOVDS , AX LEA DX , msg MOV AH , 9h INT 21h MOV AH , 4Ch INT 21h MAINENDP code ENDS END start,例如:,資料2: 功能號0AH的int 21H中斷,功能描述:從標(biāo)準(zhǔn)輸入設(shè)備(如:鍵盤)讀入一個字符串,遇
41、到“回車鍵”結(jié)束輸入 。 入口參數(shù): AH0AHDS:DX存放輸入字符的起始地址接受輸入字符串緩沖區(qū)的定義說明:1、第一個字節(jié)為緩沖區(qū)的最大容量;2、第二個字節(jié)為實際輸入的字符數(shù)(不包括回車鍵) ;3、從第三個字節(jié)開始存放實際輸入的字符串;4、字符串以回車鍵結(jié)束,回車符是接受的最后一個字符;5、若輸入的字符數(shù)超過緩沖區(qū)的最大容量,則多出的部分被丟棄, 直到輸入“回車”鍵才結(jié)束輸入。 例如:BUFFDB 80 , ? , 80 DUP(?);最多接受80個字符(含回車符) 出口參數(shù):無,源碼分析1,DATASEGMENT TABLEDBABCDEFGHIJKLMNOPQRSTUVWXYZ STR1DBPlease enter a string: , 0DH , 0AH ,$ STR2DBWrong! The string is too long! $ STR3DBNo! $ STR4DBOK! $ BUFFERDB40 DB? DB40 DUP( ? ) TAB_LENEQU26 DAT
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年五險一金備考題庫麗水機(jī)場企業(yè)招聘及答案詳解參考
- 2025年河南建筑職業(yè)技術(shù)學(xué)院公開招聘工作人員備考題庫含答案詳解
- 吉安市農(nóng)業(yè)農(nóng)村發(fā)展集團(tuán)有限公司及下屬子公司2025年第二批面向社會公開招聘備考題庫參考答案詳解
- 2025年四川天府新區(qū)廣都學(xué)校教師招聘備考題庫含答案詳解
- 2025年新余學(xué)院人才招聘69人備考題庫及參考答案詳解一套
- 工程材料試卷及答案
- 寧波市軌道交通物產(chǎn)置業(yè)有限公司下屬項目公司2025年度社會招聘備考題庫及完整答案詳解一套
- 成都市新都區(qū)2025年12月公開招聘街道社區(qū)消防站消防員的備考題庫附答案詳解
- 2025年年末結(jié)賬相關(guān)的風(fēng)險識別與應(yīng)對
- 成都市泡桐樹小學(xué)天府智造園分校2025年儲備教師招聘備考題庫及一套完整答案詳解
- 放療引起認(rèn)知功能障礙的機(jī)制以及干預(yù)和預(yù)防
- 粘豆包歇后語順口溜
- 《城鎮(zhèn)新建供水管道沖洗消毒技術(shù)規(guī)程 》
- 社區(qū)中心及衛(wèi)生院65歲及以上老年人健康體檢分析報告模板
- 病歷書寫基本規(guī)范課件
- 砼面板堆石壩混凝土面板無軌滑模施工技術(shù)專項方案設(shè)計模板
- 新海蘭褐飼養(yǎng)管理手冊
- 地下室抗浮錨桿工程施工方案
- 桿件的應(yīng)力與強(qiáng)度計算拉伸桿
- HGT-20519-2009-化工工藝設(shè)計施工圖內(nèi)容和深度統(tǒng)一規(guī)定
- 大合唱領(lǐng)導(dǎo)講話
評論
0/150
提交評論