第3章(5學(xué)時(shí))匯編語(yǔ)言.ppt_第1頁(yè)
第3章(5學(xué)時(shí))匯編語(yǔ)言.ppt_第2頁(yè)
第3章(5學(xué)時(shí))匯編語(yǔ)言.ppt_第3頁(yè)
第3章(5學(xué)時(shí))匯編語(yǔ)言.ppt_第4頁(yè)
第3章(5學(xué)時(shí))匯編語(yǔ)言.ppt_第5頁(yè)
已閱讀5頁(yè),還剩74頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第三章 匯編語(yǔ)言程序設(shè)計(jì),本章內(nèi)容,匯編語(yǔ)言源程序的格式 偽操作命令 DOS及BIOS功能調(diào)用,計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言的演變,1. 機(jī)器語(yǔ)言直接用機(jī)器指令來(lái)編制計(jì)算機(jī)程序的方法。 2. 匯編語(yǔ)言 可以用助記符來(lái)表示指令的操作和操作數(shù),也可以用標(biāo)號(hào)和符號(hào)來(lái)代替地址、常量和變量。 3. 高級(jí)語(yǔ)言更接近于人們的自然語(yǔ)言和習(xí)慣的教學(xué)語(yǔ)言來(lái)描述算法的執(zhí)行過(guò)程,從而使編寫(xiě)的過(guò)程更加直觀和簡(jiǎn)練。,為什么要用匯編語(yǔ)言,匯編語(yǔ)言非常接近機(jī)器語(yǔ)言程序,通過(guò)編制匯編語(yǔ)言程序,可以清楚地了解計(jì)算機(jī)的工作過(guò)程。 現(xiàn)在的微機(jī)系統(tǒng)中,底層的一些功能仍然靠匯編語(yǔ)言程序來(lái)實(shí)現(xiàn)。 匯編語(yǔ)言程序的效率通常高于高級(jí)語(yǔ)言程序。,舉例,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!,本例將在下文中多次提及,為方便計(jì),下文簡(jiǎn)稱(chēng)其為“Hello例”。,3.2.1 分析1分段結(jié)構(gòu),可以看出,匯編語(yǔ)言源程序是分段結(jié)構(gòu)

3、的形式。 一個(gè)匯編源程序由若干個(gè)段(Segment)組成。每個(gè)段以SEGMENT語(yǔ)句開(kāi)始,以ENDS結(jié)束。整個(gè)源程序以END語(yǔ)句結(jié)尾。 這里所說(shuō)的匯編語(yǔ)言源程序的段和第一章中的CPU管理的存儲(chǔ)器的段是不同的概念。 匯編語(yǔ)言的段是邏輯段;8086CPU管理的存儲(chǔ)器的段是物理段(共有4個(gè):數(shù)據(jù)段、附加段、堆棧段、代碼段,對(duì)應(yīng)4個(gè)段寄存器:DS、ES、SS和CS)。一個(gè)匯編語(yǔ)言源程序中可以有多個(gè)邏輯段。 上例中共有兩個(gè)邏輯段:data和code。,分析2,注:功能號(hào)09H的int 21中斷 功能描述: 輸出一個(gè)字符串到標(biāo)準(zhǔn)輸出設(shè)備上。 入口參數(shù): AH09H DS : DX待輸出字符的地址 說(shuō)明:待

4、顯示的字符串以$作為其結(jié)束標(biāo)志,代碼段開(kāi)頭執(zhí)行了一次功能號(hào)09H的21號(hào)DOS中斷,用于在屏幕上顯示字符串。關(guān)于DOS功能調(diào)用,后文將有詳細(xì)解釋。 此處先列出功能號(hào)09H的21號(hào)DOS中斷的相關(guān)資料:,最后兩行(MOV AX,4C00h、INT 21h)也是一個(gè)DOS功能調(diào)用。,注:功能號(hào)4CH的int 21中斷 功能描述: 終止程序的執(zhí)行,并可返回一個(gè)代碼 入口參數(shù): AH4CH AL返回的代碼,匯編語(yǔ)言開(kāi)發(fā)過(guò)程,源程序 : 文件名.asm,目標(biāo)程序:文件名.obj,可執(zhí)行文件:文件名.exe,Finish,編輯器,如notepad.exe,匯編器,如masm.exe,鏈接器,如link.e

5、xe,調(diào)試器,如debug.exe,開(kāi)發(fā)工具 (了解),X86+Windows平臺(tái)下常用的匯編編譯器有: Microsoft公司的 MASM Borland公司的 TASM 開(kāi)源社區(qū)的 NASM MASM是微軟推出的宏匯編語(yǔ)言,自發(fā)布以來(lái)已有多次版本更新,下頁(yè)表格中列出了幾個(gè)較為典型的版本。 注:容易與之混淆的是MASM32,它是Steve Hutchesson以個(gè)人名義發(fā)布、基于MASM而構(gòu)建的軟件包。其版本號(hào)和MASM的版本號(hào)是不同的,比如MASM32V8使用的匯編編譯器是MASM6。MASM32的最新版本為MASM32V12。,MASM版本歷史(了解),開(kāi)發(fā)工具 (了解),Masm5適合

6、進(jìn)行DOS程序開(kāi)發(fā); Masm6以后的版本開(kāi)始支持Win32程序開(kāi)發(fā)。 (微軟官方發(fā)布的Masm6所附的link.exe是Segmented Executable Linker,只能開(kāi)發(fā)DOS程序;要進(jìn)行Win32開(kāi)發(fā)必須配備Incremental Linker,該類(lèi)型的link.exe可以從Visual Studio中獲取。開(kāi)發(fā)Win32程序推薦使用MASM32開(kāi)發(fā)包) 開(kāi)發(fā)DOS程序的Masm下載地址: Masm5.00 羅云彬的編程樂(lè)園 30:22366/view.asp?file=51 Masm615 For Dos aogo匯編小站 ,開(kāi)發(fā)步驟演示

7、 (了解),使用MASM 5.0,開(kāi)發(fā)步驟演示 (了解),使用MASM 6.15 For DOS,3.2.2 語(yǔ)句的類(lèi)型,匯編語(yǔ)言源程序中的語(yǔ)句主要有以下兩種類(lèi)型: 指令性語(yǔ)句 指示性語(yǔ)句 指令性語(yǔ)句主要由CPU指令組成,對(duì)應(yīng)實(shí)際的機(jī)器指令;(比如“Hello例”中的 MOV DS , AX ) 指示性語(yǔ)句又稱(chēng)偽操作語(yǔ)句,主要由偽操作指令組成。(比如“Hello例”中的 code SEGMENT ),語(yǔ)句的組成,匯編語(yǔ)言的語(yǔ)句可以有14個(gè)組成部分,如下所示: 名字 操作碼/偽操作碼 操作數(shù) ;注釋 帶方括號(hào)的部分表示可選項(xiàng)。以“Hello例”中的幾條語(yǔ)句為例:,3.2.3 語(yǔ)句的組成名字,名字

8、 在指令性語(yǔ)句中,名字是一個(gè)標(biāo)號(hào),實(shí)際上就是指令的符號(hào)地址。比如“start : MOV AX , data”中的 start: 。并非每條指令性語(yǔ)句都必須有標(biāo)號(hào)。但如果有了這個(gè)標(biāo)號(hào),程序中其他地方就可引用這個(gè)標(biāo)號(hào),比如執(zhí)行跳轉(zhuǎn)或者CALL調(diào)用。指令性語(yǔ)句中的標(biāo)號(hào)后面通常有一個(gè)冒號(hào)。 標(biāo)號(hào)有三種屬性:段、偏移量和類(lèi)型。 段屬性是定義標(biāo)號(hào)的程序段的段地址。 偏移量表示標(biāo)號(hào)所在段的起始地址到定義該標(biāo)號(hào)的地址之間的字節(jié)數(shù)。 標(biāo)號(hào)的類(lèi)型有兩種:NEAR和FAR。前者可以在段內(nèi)被引用,地址指針為兩個(gè)字節(jié);后者可以在其他段中被引用,地址指針為4個(gè)字節(jié)。,語(yǔ)句的組成名字,在指示性語(yǔ)句中,名字可以是變量名、段

9、名、過(guò)程名。 比如“Hello例”中“data SEGMENT”中的data是段名, “msg DB Hello, World!$”中的msg是變量名。 指示性語(yǔ)句中的標(biāo)號(hào)后面通常沒(méi)有冒號(hào)。 變量也有三種屬性:段、偏移量和類(lèi)型。 段屬性是變量所代表的數(shù)據(jù)所在段的段地址。 偏移量表示變量所在段的起始地址與變量的地址之間的字節(jié)數(shù)。 變量的類(lèi)型有: BYTE、WORD、DWORD(四字節(jié))、QWORD(八字節(jié))和TBYTE(十字節(jié))等,表示數(shù)據(jù)區(qū)中存取操作對(duì)象的大小。,3.2.4 語(yǔ)句的組成操作碼/偽操作碼,操作碼/偽操作碼 在匯編語(yǔ)言中操作碼以助記符的形式存在。8086/8088 CPU的助記符總

10、共約有90多種,比如MOV、ADC等。 關(guān)于所有的助記符,參見(jiàn)第二章指令系統(tǒng)。 指示性語(yǔ)句中的DB、SEGMENT、ENDS、ASSUME、END等都是偽操作碼,而不是CPU指令的助記符。 它們?cè)诔绦蛑械淖饔檬嵌x變量的類(lèi)型、定義段以及命令匯編程序(masm.exe)結(jié)束匯編 等。它們是指示匯編程序(masm.exe)完成匯編,本身不產(chǎn)生對(duì)應(yīng)的機(jī)器碼。 關(guān)于偽操作碼的具體作用和使用方法,下文有專(zhuān)門(mén)章節(jié)討論。,3.2.5 語(yǔ)句的組成操作數(shù),操作數(shù) 對(duì)于CPU指令,可能有單操作數(shù)和雙操作數(shù),也可能無(wú)操作數(shù);偽指令可能有更多個(gè)操作數(shù)。 可以用作操作數(shù)的有:常數(shù)、寄存器、標(biāo)號(hào)、變量和表達(dá)式。 常數(shù) 十

11、進(jìn)制數(shù),如99D或99。后面加字母“D”,或者什么也不加。 十六進(jìn)制數(shù),如64H,0F800H,后面加一個(gè)字母“H”;如果最高位數(shù)值不是09,前面要再加一個(gè)數(shù)字0。(以避免和寄存器名稱(chēng)如“AH”沖突) ASCII常數(shù),例如A、8、cat,字符應(yīng)該放在單引號(hào)中。,語(yǔ)句的組成操作數(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)號(hào) 標(biāo)號(hào)代表一條指令的符號(hào)地址,因此可以作為轉(zhuǎn)移、過(guò)程調(diào)用CALL 以及

12、循環(huán)控制 LOOP 等指令的操作數(shù)。 比如“HELLO例”中“END start”,start就是一個(gè)標(biāo)號(hào)。,語(yǔ)句的組成操作數(shù),變量 變量是存儲(chǔ)器中某個(gè)數(shù)據(jù)區(qū)的名字,因此在指令中可以作為存儲(chǔ)器操作數(shù)。 如“Hello例”中的:LEA DX , msg 其中 msg 就是一個(gè)在數(shù)據(jù)區(qū)定義的變量(msg DB Hello, World!$)。 表達(dá)式 匯編語(yǔ)言中的表達(dá)式按其性質(zhì)可以分為兩種:數(shù)值表達(dá)式和地址表達(dá)式。 數(shù)值表達(dá)式產(chǎn)生一個(gè)數(shù)值結(jié)果,只有大小,沒(méi)有屬性。 地址表達(dá)式的結(jié)果不是一個(gè)單純的數(shù)值,它有三種屬性:段、偏移量和類(lèi)型。,語(yǔ)句的組成操作數(shù),構(gòu)成表達(dá)式必然有運(yùn)算符。表達(dá)式中常用運(yùn)算符有以

13、下幾種: 算術(shù)運(yùn)算符,如 +、-、*、/和MOD(模除) 這些算術(shù)運(yùn)算符可用于數(shù)值表達(dá)式,運(yùn)算結(jié)果是一個(gè)數(shù)值。在地址表達(dá)式中通常只使用其中的+和 兩種運(yùn)算符。 邏輯運(yùn)算符 ,如 AND、OR、XOR和NOT 邏輯運(yùn)算符只用于數(shù)值表達(dá)式中對(duì)數(shù)值進(jìn)行按位邏輯運(yùn)算。對(duì)地址進(jìn)行邏輯運(yùn)算是沒(méi)有意義的。 不要把邏輯運(yùn)算符如AND、OR、XOR和NOT等與同樣名稱(chēng)的CPU指令相混淆。前者可對(duì)整常數(shù)進(jìn)行按位邏輯運(yùn)算,是在匯編時(shí)進(jìn)行;后者的操作數(shù)可以是寄存器、存儲(chǔ)器和立即數(shù),是在程序運(yùn)行時(shí)由CPU執(zhí)行。比如: ANDAL,01011010B;這里的AND是指令助記符 MOVAL,01011010B AND 11

14、110000B ;這里的AND是邏輯運(yùn)算符,語(yǔ)句的組成操作數(shù),關(guān)系運(yùn)算符 如 EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)等。 參與關(guān)系運(yùn)算的必須是兩個(gè)數(shù)值,或同一段中的兩個(gè)存儲(chǔ)單元地址,但運(yùn)算結(jié)果只能是兩個(gè)特定的數(shù)值之一。當(dāng)關(guān)系不成立(假)時(shí),結(jié)果為0;當(dāng)關(guān)系成立(真)時(shí),結(jié)果為0FFFFH(-1)。 例如: MOV AX,4 EQ 3 ;關(guān)系不成立,故(AX) 0 MOV AX, 4 NE 3;關(guān)系成立,故(AX) 0FFFFH,語(yǔ)句的組成操作數(shù),分析運(yùn)算符和合成運(yùn)算符 如 OFFSET、SEG、TYPE 、SIZE和LENGTH等;合成運(yùn)

15、算符有PTR、THIS、SHORT等。 分析運(yùn)算符用以分析一個(gè)存儲(chǔ)器操作數(shù)的屬性,如段、偏移量或類(lèi)型等。合成運(yùn)算符則可以規(guī)定存儲(chǔ)器操作數(shù)的某個(gè)屬性,例如類(lèi)型。 OFFSET用于獲取一個(gè)標(biāo)號(hào)或變量的偏移地址,如: MOV SI , OFFSET DATA1 是將變量DATA1的偏移地址送至SI寄存器。 其效果等同于: LEA SI , DATA1,語(yǔ)句的組成操作數(shù),SEG用于獲取標(biāo)號(hào)或變量的段址,如: MOV AX , SEG ARRAY MOV DS , AX 是將變量ARRAY的段地址送入DS寄存器。 TYPE的運(yùn)算結(jié)果是一個(gè)數(shù)值,這個(gè)數(shù)值與存儲(chǔ)器操作數(shù)類(lèi)型屬性的關(guān)系如下:,語(yǔ)句的組成操作數(shù)

16、,TYPE運(yùn)算符的例子 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 如果一個(gè)變量已用重復(fù)操作符DUP說(shuō)明其變量的個(gè)數(shù),則利用LENGTH獲取這個(gè)變量的個(gè)數(shù)。如果未用DUP說(shuō)明,則得到的結(jié)果為1。 比如上例中 , LENGTH ARRAY 運(yùn)算結(jié)果為10。,語(yǔ)句的組成操作數(shù),SIZE 如果一個(gè)變量已用重復(fù)操作符DUP說(shuō)明,則利用SIZE運(yùn)算符可得到分配給該變量的字節(jié)總數(shù)。如果未

17、用DUP說(shuō)明,則得到的結(jié)果是TYPE運(yùn)算的結(jié)果。 比如上例中 , SIZE ARRAY 運(yùn)算結(jié)果為10440。由此可知,SIZE的運(yùn)算結(jié)果等于LENGTH的運(yùn)算結(jié)果乘以TYPE的運(yùn)算結(jié)果。 PTR 是一個(gè)合成運(yùn)算符,用于指定存儲(chǔ)器操作數(shù)的類(lèi)型。 比如 INC BYTE PTR BX SI , 指令中利用PTR運(yùn)算符明確規(guī)定存儲(chǔ)器操作數(shù)的類(lèi)型為BYTE(字節(jié)),因此,本指令將一個(gè)8位存儲(chǔ)器的內(nèi)容加1。,語(yǔ)句的組成操作數(shù),THIS 也可以指定存儲(chǔ)器操作數(shù)的類(lèi)型。使用THIS運(yùn)算符可以使標(biāo)號(hào)或變量的類(lèi)型具有靈活性。例如要求對(duì)同一個(gè)數(shù)據(jù)區(qū),既可以字節(jié)作為單位,又可以字作為單位進(jìn)行存取,則可以用以下語(yǔ)句

18、: AREAW EQU THIS WORD AREAB DB 100 DUP (?) 上面的AREAW和AREAB代表同一個(gè)數(shù)據(jù)區(qū),其中共有100個(gè)字節(jié),但AREAW的類(lèi)型為WORD,而AREAB的類(lèi)型為BYTE。 SHORT 指定一個(gè)標(biāo)號(hào)的類(lèi)型為SHORT(短標(biāo)號(hào)),即標(biāo)號(hào)到引用標(biāo)號(hào)的指令間的距離在-128127之間。短標(biāo)號(hào)可用于無(wú)條件轉(zhuǎn)移和條件轉(zhuǎn)移指令中。使用短標(biāo)號(hào)的指令比使用默認(rèn)的近標(biāo)號(hào)的指令少一個(gè)字節(jié)。,語(yǔ)句的組成操作數(shù),方括號(hào) 間接尋址指令的存儲(chǔ)器操作數(shù)要在寄存器名BX、BP、SI或DI外面加上方括號(hào),以表示存儲(chǔ)器地址。又如,變址尋址指令的存儲(chǔ)器操作數(shù)既要用算術(shù)運(yùn)算符將SI或DI與一

19、個(gè)位移量做運(yùn)算,又要在外面加上方括號(hào)來(lái)表示存儲(chǔ)器地址。 MOV CL , BX MOV AL , SI+5 段超越運(yùn)算符“ : ” 是“:”(冒號(hào))跟在段寄存器名(DS、ES、SS或CS)之后表示段超越,用以給一個(gè)存儲(chǔ)器操作數(shù)指定一個(gè)段屬性,而不管其原來(lái)隱含的段是什么。例如: MOV AX , ES : SI HIGH和LOW 獲取一個(gè)數(shù)值或地址表達(dá)式的高位和低位字節(jié)。 STUFF EQU 0ABCDH MOV AH , HIGH STUFF ; (AH) 0ABH MOV AL , LOW STUFF ; (AL) 0CD H,語(yǔ)句的組成操作數(shù),如果一個(gè)表達(dá)式中同時(shí)具有多個(gè)運(yùn)算符,那么按照以

20、下規(guī)則進(jìn)行運(yùn)算: 優(yōu)先級(jí)高的先運(yùn)算,優(yōu)先級(jí)低的后運(yùn)算; 同一優(yōu)先級(jí)按表達(dá)式中從左到右的順序進(jìn)行運(yùn)算; 圓括號(hào)可提升運(yùn)算優(yōu)先級(jí),圓括號(hào)內(nèi)的運(yùn)算符總是在其任何相鄰的運(yùn)算之前進(jìn)行。 各種運(yùn)算符的優(yōu)先級(jí)順序如下頁(yè)圖表所示。表中同一行的運(yùn)算符具有同等優(yōu)先級(jí)。,語(yǔ)句的組成操作數(shù),3.2.6 語(yǔ)句的組成注釋,注釋 和其他語(yǔ)言一樣,匯編語(yǔ)言中的注釋僅用于提高程序的可讀性。 匯編語(yǔ)言中的注釋前面要求加上分號(hào)(;)。 如果注釋內(nèi)容較多,超過(guò)一行,則換行以后前面還要加上分號(hào)。 注釋也可以從一行的最前面開(kāi)始。 匯編程序(masm.exe)對(duì)注釋不予理會(huì),即注釋對(duì)匯編后產(chǎn)生的目標(biāo)程序沒(méi)有任何影響。,3.3 偽操作指令,

21、指示性語(yǔ)句中的偽操作指令,因其表示形式類(lèi)似于CPU指令,故稱(chēng)其為“偽指令”。 偽指令與CPU指令的區(qū)別: CPU指令是給 CPU 的指令,對(duì)應(yīng)CPU的特定操作,如加法運(yùn)算;而偽指令是給 匯編程序 (masm.exe)的指令,指示匯編程序進(jìn)行操作,比如定義段、定義數(shù)據(jù)。 CPU指令在匯編后產(chǎn)生一一對(duì)應(yīng)的 目標(biāo)代碼 ,偽指令不產(chǎn)生與之對(duì)應(yīng)的目標(biāo)代碼。 下面列出“Hello例”的匯編源碼及其對(duì)應(yīng)的機(jī)器碼 對(duì)比體會(huì)偽指令的作用。,Hello, World! 的匯編源代碼,Hello, World! 的機(jī)器代碼,Hello, World! 機(jī)器代碼的分析,可以看到,編譯后的機(jī)器代碼中,偽指令都已經(jīng)不見(jiàn)了

22、。原來(lái)的代碼段中每條指令性語(yǔ)句都對(duì)應(yīng)一條機(jī)器碼。 匯編源代碼中的第一句MOV AX , data經(jīng)編譯后變成MOV AX , 1449。這是因?yàn)榫幾g器 (masm.exe) 將數(shù)據(jù)段放在 1449 : 0000 的位置。然后將DS : DX指向該位置,通過(guò)INT21的09H中斷將其顯示出來(lái)。,資料回顧: 功能號(hào)09H的int 21中斷 功能描述: 輸出一個(gè)字符串到標(biāo)準(zhǔn)輸出設(shè)備上。 入口參數(shù): AH09H DS:DX待輸出字符的地址 說(shuō)明:待顯示的字符串以$作為其結(jié)束標(biāo)志,Hello, World! 機(jī)器代碼的分析,下圖使用 d 1449:0000顯示了數(shù)據(jù)段中的內(nèi)容:,3.3 偽操作命令,宏匯

23、編程序MASM提供了數(shù)十種偽操作。 (這里也揭示了操作碼和偽操作碼的另一個(gè)區(qū)別:偽操作碼隨編譯器的不同而不同; 而操作碼隨CPU的不同而不同。) 根據(jù)偽操作的功能,大致可以分為下列幾類(lèi):,偽操作指令分類(lèi),處理器方式偽操作(了解),處理器方式偽操作用于指示匯編編譯器使用何種CPU的指令系統(tǒng)。 常用的有以下幾種: .8086 指示匯編程序只匯編8086/8088的指令系統(tǒng)。程序中若出現(xiàn)80286或80386的指令,則編譯會(huì)出錯(cuò)。 如果程序中不定義任何處理器方式偽操作,則匯編程序默認(rèn)即是.8086方式。 .386P 指示匯編程序匯編8086/8088以及所有80286和80386(包括保護(hù)方式和非保

24、護(hù)方式)的指令。,3.3.2 數(shù)據(jù)定義偽指令,數(shù)據(jù)定義偽操作用于定義變量類(lèi)型、給變量賦值。 常用的有以下幾種: 數(shù)據(jù)定義偽操作的一般格式是: 變量名 偽操作 操作數(shù) ,操作數(shù) 操作數(shù)可以是常數(shù)、表達(dá)式或字符串,但每項(xiàng)操作數(shù)的值不能超過(guò)偽操作所定義的數(shù)據(jù)類(lèi)型限定的范圍。,例1: DATA_B DB 10, 5, 10H DATA_W DW 100H, -4 DATA_D DD 0FFFBH 匯編后的內(nèi)存分配情況 如右圖所示。,Q,例2:操作數(shù)可以是字符串,例如 STR DBHELLO 匯編后的情況如圖:,注意下面兩個(gè)定義的不同之處: DBAB ;41H在低字節(jié),42H在高字節(jié) DW AB ;42

25、H在低字節(jié),41H在高字節(jié),用DW定義字符串只允許包含兩個(gè)字符,否則必須用DB指令; 字符串的個(gè)數(shù)不超過(guò)255個(gè); 字符串必須用單引號(hào)引起來(lái)。,幾點(diǎn)說(shuō)明:,操作數(shù)?用來(lái)保留存儲(chǔ)空間,但不存入數(shù)據(jù)。 例3:ABC DB 0,1,2,3,4,OK,$ RSV DW ?,?,?,?,?,?,?,? 復(fù)制操作符DUP: 重復(fù)的數(shù)據(jù)可以使用復(fù)制操作符DUP,如上面RSV亦可寫(xiě)成: RSV DW 8 DUP(?),3.3.3 符號(hào)定義偽操作,符號(hào)定義偽操作用于給一個(gè)符號(hào)重新命名,或定義新的類(lèi)型屬性等。這里的符號(hào)可以是匯編語(yǔ)言中所用的變量名、標(biāo)號(hào)名、過(guò)程名、記錄名、寄存器名以及指令助記符等。 常用的符號(hào)定義

26、偽操作有EQU、LABEL EQU 格式: 名字 EQU 表達(dá)式 作用:用名字代替一個(gè)數(shù)值,或一個(gè)較長(zhǎng)的表達(dá)式。 舉例:HPIXEL EQU 1024 VPIXEL EQU 768 SCREENEQU HPIXEL * VPIXEL,符號(hào)定義偽操作,格式: 名字 = 表達(dá)式 作用: 類(lèi)似 EQU,區(qū)別在于“ = ”可以對(duì)一個(gè)名字重復(fù)定義。 舉例:COUNT = 10 MOV CX, COUNT;(CX) 10 COUNT = COUNT -1 MOV BX, COUNT;(BX) 9 LABEL 格式: 名字 LABEL 表達(dá)式 作用: 定義標(biāo)號(hào)或變量的類(lèi)型。 舉例:AREAW LABEL W

27、ORD MOV AREAW , AX ;AX送AREAW的第1、2字節(jié)中,3.3.4 段定義偽操作,段定義偽操作用于在匯編語(yǔ)言源程序中定義邏輯段。 常用的段定義偽操作有SEGMENT/ENDS、ASSUME SEGMENT/ENDS 格式: 段名 SEGMENT 定位類(lèi)型 組合類(lèi)型 類(lèi)別 作用: 定義一個(gè)邏輯段 舉例:STACK SEGMENT DB 100 DUP( ? ) STACK ENDS “定位類(lèi)型”告訴編譯器如何確定邏輯段的邊界在存儲(chǔ)器中的位置,即對(duì)齊方式。有PARA、BYTE、WORD和PAGE四種。 “組合類(lèi)型”告訴編譯器在裝入程序時(shí)各個(gè)邏輯段如何組合。 “類(lèi)別”的作用是在連接

28、時(shí)決定各邏輯段的裝入順序。,段定義偽操作,ASSUME 格式: ASSUME 段寄存器 : 段名 , 段寄存器 : 段名 , 說(shuō)明: 將某一個(gè)段寄存器和某一個(gè)邏輯段進(jìn)行關(guān)聯(lián)。 “段名”可以是曾用 SEGMENT 操作符定義過(guò)的一個(gè)段名,或是在一個(gè)標(biāo)號(hào)或變量前面加上 SEG 構(gòu)成的表達(dá)式,還可以是關(guān)鍵字NOTHING。 需要注意的是,ASSUME僅僅是通知編譯器有關(guān)段寄存器和邏輯段的關(guān)系,并沒(méi)有為段寄存器賦予實(shí)際的初值。 舉例:ASSUME CS : CODE , DS : DATA1 , SS : STACK ASSUME DS : SEG AREA1 ASSUME ES : NOTHING

29、;取消前面ASSUME對(duì)ES的設(shè)置,3.3.5 過(guò)程定義偽操作,過(guò)程定義偽操作命令為PROC / ENDP。 PROC / ENDP 格式: 過(guò)程名 PROC NEAR / FAR RET 過(guò)程名 ENDP 作用: 定義一個(gè)過(guò)程,賦予過(guò)程一個(gè)名字,并指出過(guò)程的類(lèi)型,并指出該過(guò)程的類(lèi)型是NEAR或FAR。如果沒(méi)有特別指明,則認(rèn)為過(guò)程類(lèi)型是NEAR。偽操作碼ENDP標(biāo)志過(guò)程定義結(jié)束。 注意:PROC和ENDP必須成對(duì)出現(xiàn)。,過(guò)程的類(lèi)型有兩種: NEAR(默認(rèn)類(lèi)型)表示段內(nèi)調(diào)用; (SP)(SP-2); (SP+1): (SP)(IP); FAR表示段間調(diào)用。 調(diào)用一個(gè)過(guò)程的格式為: CALL ,3

30、.3.6 模塊定義與連接偽操作(了解),在編寫(xiě)規(guī)模較大的匯編語(yǔ)言程序時(shí),可將程序劃分成幾個(gè)獨(dú)立的源程序模塊,分別進(jìn)行匯編,最后統(tǒng)一連接。各個(gè)模塊之間可以相互進(jìn)行符號(hào)訪問(wèn)。 命令為NAME、END、PUBLIC 和 EXTRN。 NAME 格式: Name 模塊名 作用: 指定源文件匯編后的目標(biāo)文件名稱(chēng) END 格式: END 標(biāo)號(hào) 作用: 表示源程序到此結(jié)束,對(duì)于END后面語(yǔ)句不予理會(huì),模塊定義與連接偽操作(了解),PUBLIC 格式: PUBLIC 符號(hào) , 作用: 說(shuō)明本模塊中的某些符號(hào)是公共的,即這些符號(hào)可以供將被連接在一起的其他模塊使用 說(shuō)明: “符號(hào)”可以是本模塊中定義的變量、標(biāo)號(hào)或

31、數(shù)值的名字,包括用PROC定義的過(guò)程名等。 EXTRN 格式: EXTRN 名字:類(lèi)型 , 作用: 說(shuō)明本模塊中所用的某些符號(hào)是外部的,即這些符號(hào)在將被連接在一起的其他模塊中定義(定義這些符號(hào)的模塊中還必須用PUBLIC說(shuō)明)。,3.3.7 宏處理偽操作,如果在程序中需要多次使用一個(gè)程序段,可將其定義為宏。每次需要時(shí),直接進(jìn)行調(diào)用,稱(chēng)為宏調(diào)用。 【利用過(guò)程( PROC )可以實(shí)現(xiàn)類(lèi)似功能。 區(qū)別在于:宏在編譯時(shí)就插入每個(gè)宏調(diào)用處(這稱(chēng)為“宏擴(kuò)展”);而過(guò)程是在執(zhí)行時(shí)進(jìn)行跳轉(zhuǎn)。過(guò)程具有更優(yōu)的空間效率,而宏則具有更優(yōu)的時(shí)間效率?!?MACRO/ENDM 格式: 宏指令名 MACRO ; (宏定義體

32、) ENDM 作用: 將宏指令名定義為宏定義體中包含的程序段。,宏處理偽操作,宏定義偽操作允許帶參數(shù),從而具有更強(qiáng)的通用性。 例:定義一個(gè)宏,用于兩個(gè)壓縮的BCD數(shù)相加,結(jié)果放在第一個(gè)操作數(shù)中。 DECADDMACRO OPR1 , OPR2 MOV AL , OPR1 ADD AL , OPR2 DAA MOV OPR1 , AL ENDM 下面使用debug來(lái)觀察該例中“宏擴(kuò)展”是如何進(jìn)行的:,源文件,反匯編并執(zhí)行觀察結(jié)果,3.4 DOS和BIOS調(diào)用(了解),DOS 和 BIOS為用戶(hù)提供了兩組系統(tǒng)服務(wù)程序。 BIOS是 IBM PC的基本IO系統(tǒng),包括系統(tǒng)測(cè)試程序、初始化引導(dǎo)程序、一部

33、分中斷矢量裝入程序以及部分外設(shè)的服務(wù)程序。這些程序都固化在主板上的ROM中。 DOS是 IBM PC的操作系統(tǒng),負(fù)責(zé)管理系統(tǒng)的所有資源。其中包括大量可供用戶(hù)調(diào)用的服務(wù)程序。 DOS和BIOS調(diào)用不是使用CALL命令,而采用軟中斷指令 INT n。,DOS和BIOS調(diào)用,用戶(hù)程序控制PC機(jī)硬件的方式 使用高級(jí)語(yǔ)言提供的功能控制硬件 調(diào)用方便,但靈活性較低、速度較慢。 使用DOS提供的程序控制硬件 調(diào)用較為方便,程序可移植性好,編程簡(jiǎn)單。 使用BIOS提供的程序控制硬件 這種控制比較低層,因而可移植性差,但效率更高。 直接訪問(wèn)硬件 要求用戶(hù)對(duì)硬件非常熟悉。此種方式只用于兩種情況:為了獲得高效率,或

34、是為了獲得DOS和BIOS不支持的功能。,DOS調(diào)用,8086指令系統(tǒng)中,有一條軟中斷指令 INT n。 當(dāng)n= 51FH時(shí),調(diào)用BIOS服務(wù)程序; 當(dāng)n=203FH時(shí),調(diào)用 DOS服務(wù)程序。 下表列出了部分DOS軟中斷的功能:,INT 21H調(diào)用,其中 INT 21H是一個(gè)具有完整功能的服務(wù)程序,一般稱(chēng)之為DOS系統(tǒng)功能調(diào)用。是最常用的DOS中斷。 INT 21H中斷具有近90個(gè)子功能,大致分為4個(gè)方面: 設(shè)備管理、目錄管理、文件管理和其他。 系統(tǒng)功能調(diào)用(INT 21H)的使用步驟如下: 置系統(tǒng)功能號(hào)n (放入AH) 置入口參數(shù) 執(zhí)行INT 21H 分析出口參數(shù),INT 21H調(diào)用示例,例

35、:從鍵盤(pán)讀入一個(gè)字符, 判斷是 Y 還是 N , 以執(zhí)行對(duì)應(yīng)操作。,資料: 功能號(hào)01H的int 21H中斷 功能描述:從標(biāo)準(zhǔn)輸入設(shè)備(如:鍵盤(pán))讀入一個(gè)字符 功能號(hào): AH 01H,過(guò)濾掉控制字符,并回顯 出口參數(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中斷的所有中斷號(hào)內(nèi)容(從05H1FH),參見(jiàn)書(shū)附錄3.3,BIOS調(diào)用,BIOS調(diào)用的使用步驟如下:

36、 置系統(tǒng)功能號(hào)n (放入AH) 置入口參數(shù) 執(zhí)行 INT n 分析出口參數(shù) 舉鍵盤(pán)輸入服務(wù)(INT 16H)為例。其主要功能有三個(gè),分別用于讀鍵盤(pán)、讀擴(kuò)展鍵盤(pán)和讀取功能鍵,分別對(duì)應(yīng)功能號(hào)0、1、2(AH0、1、2)。 下面一段程序的功能是:按下F1和F2鍵,分別執(zhí)行兩段不同的程序,按其他鍵則轉(zhuǎn)至錯(cuò)誤處理。,INT 16H調(diào)用示例,資料: 功能號(hào)00H的int 16H中斷 功能描述: 從鍵盤(pán)讀入字符 入口參數(shù): AH00H 出口參數(shù): AH鍵盤(pán)的掃描碼 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: ,資料: 鍵碼又稱(chēng)鍵盤(pán)掃描碼, F1 鍵碼為 3BH F2 鍵碼為 3CH,INT 10H調(diào)用示例,從上頁(yè)的例子中,可以看出,同樣的功能,往往既可以用BIOS中斷調(diào)用來(lái)實(shí)現(xiàn),也可以用DOS中斷調(diào)用來(lái)實(shí)現(xiàn)。比如磁盤(pán)服務(wù)、鍵盤(pán)服務(wù)、顯示字符等。差別在于:BIOS中斷調(diào)用往往功能更強(qiáng)大、控制更靈活。 例:INT 10H功能號(hào)09H,“在當(dāng)前光標(biāo)位置顯示字符”。,MOV AH , 9;顯示字

38、符 MOV AL , a;字符 MOV BL , 0Ch; 0表示背景黑色,0Ch表示字符紅色 MOV BH , 0;第0頁(yè) MOV CX , 8;字符重復(fù)個(gè)數(shù) INT 10h,INT 10H調(diào)用示例運(yùn)行結(jié)果,提示: 由于程序運(yùn)行在“虛擬”的8086模式下, 在操作硬件時(shí)跟純DOS仍存在一定差異。 如果程序直接雙擊運(yùn)行時(shí)結(jié)果跟預(yù)期不符, (比如窗口一閃而過(guò)) 可使用debug加載然后輸入g運(yùn)行。,匯編語(yǔ)言設(shè)計(jì)舉例,字符串查找 內(nèi)存中已經(jīng)存有一張表,要求從鍵盤(pán)上輸入一個(gè)字符串,然后在表中查找該字符串,如有,則在屏幕上顯示“OK!”;如果沒(méi)有,則顯示“NO!”;若輸入字符串長(zhǎng)度超過(guò)內(nèi)存中表的長(zhǎng)度,

39、則顯示“Wrong! The string is too long!” 邏輯分析: 查找可以分兩步進(jìn)行,先在表中搜索字符串的第一個(gè)字符,如有,再比較字符串的其他字符是否一致。 功能可行性分析: 在屏幕上顯示字符串可以使用功能號(hào) 09H的21號(hào)中斷; 從鍵盤(pán)上接收字符串可以使用功能號(hào)0AH的21號(hào)中斷。,教材 P178,流程圖,顯示提示符,從鍵盤(pán)接收提示符,字符串首址送SI,表首址送DI 字符串長(zhǎng)度送BX,表長(zhǎng)度送CX,表長(zhǎng)=串長(zhǎng),搜索、匹配等工作,開(kāi)始,返回,顯示“串太長(zhǎng)”,具體見(jiàn)教材P179,資料1: 功能號(hào)09H的int 21H中斷,功能描述:顯示字符串 (串尾字符為$,但不顯示) 入口參

40、數(shù): AH09HDS:DX被顯示字符串的首地址 出口參數(shù):無(wú),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: 功能號(hào)0AH的int 21H中斷,功能描述:從標(biāo)準(zhǔn)輸入設(shè)備(如:鍵盤(pán))讀入一個(gè)字符串,遇

41、到“回車(chē)鍵”結(jié)束輸入 。 入口參數(shù): AH0AHDS:DX存放輸入字符的起始地址接受輸入字符串緩沖區(qū)的定義說(shuō)明:1、第一個(gè)字節(jié)為緩沖區(qū)的最大容量;2、第二個(gè)字節(jié)為實(shí)際輸入的字符數(shù)(不包括回車(chē)鍵) ;3、從第三個(gè)字節(jié)開(kāi)始存放實(shí)際輸入的字符串;4、字符串以回車(chē)鍵結(jié)束,回車(chē)符是接受的最后一個(gè)字符;5、若輸入的字符數(shù)超過(guò)緩沖區(qū)的最大容量,則多出的部分被丟棄, 直到輸入“回車(chē)”鍵才結(jié)束輸入。 例如:BUFFDB 80 , ? , 80 DUP(?);最多接受80個(gè)字符(含回車(chē)符) 出口參數(shù):無(wú),源碼分析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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論