東南大學(xué)電子信息工程之微機(jī)學(xué)第3章(5學(xué)時(shí))匯編語(yǔ)言.ppt
《東南大學(xué)電子信息工程之微機(jī)學(xué)第3章(5學(xué)時(shí))匯編語(yǔ)言.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《東南大學(xué)電子信息工程之微機(jī)學(xué)第3章(5學(xué)時(shí))匯編語(yǔ)言.ppt(82頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第三章匯編語(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ò)程,從而使編寫的過(guò)程更加直觀和簡(jiǎn)練。,為什么要用匯編語(yǔ)言,匯編語(yǔ)言非常接近機(jī)器語(yǔ)言程序,通過(guò)編制匯編語(yǔ)言程序,可以清楚地了解計(jì)算機(jī)的工作過(guò)程?,F(xiàn)在的微機(jī)系統(tǒng)中,底層的一些功能仍然靠匯編語(yǔ)言程序來(lái)實(shí)現(xiàn)。匯編語(yǔ)言程序的效率通常高于高級(jí)語(yǔ)言程序。,舉例,dataSEGMENTmsgDBHello,World!$dataENDScodeSEGMENTASSUMECS:code,DS:dataMAINPROCNEARstart:MOVAX,dataMOVDS,AXLEADX,msgMOVAH,9hINT21hMOVAX,4C00hINT21hMAINENDPcodeENDSENDstart,在屏幕上顯示Hello,World!,本例將在下文中多次提及,為方便計(jì),下文簡(jiǎn)稱其為“Hello例”。,,3.2.1分析1—分段結(jié)構(gòu),可以看出,匯編語(yǔ)言源程序是分段結(jié)構(gòu)的形式。一個(gè)匯編源程序由若干個(gè)段(Segment)組成。每個(gè)段以SEGMENT語(yǔ)句開始,以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的int21中斷功能描述:輸出一個(gè)字符串到標(biāo)準(zhǔn)輸出設(shè)備上。入口參數(shù):AH=09HDS:DX=待輸出字符的地址說(shuō)明:待顯示的字符串以’$’作為其結(jié)束標(biāo)志,代碼段開頭執(zhí)行了一次功能號(hào)09H的21號(hào)DOS中斷,用于在屏幕上顯示字符串。關(guān)于DOS功能調(diào)用,后文將有詳細(xì)解釋。此處先列出功能號(hào)09H的21號(hào)DOS中斷的相關(guān)資料:,最后兩行(MOVAX,4C00h、INT21h)也是一個(gè)DOS功能調(diào)用。,注:功能號(hào)4CH的int21中斷功能描述:終止程序的執(zhí)行,并可返回一個(gè)代碼入口參數(shù):AH=4CHAL=返回的代碼,匯編語(yǔ)言開發(fā)過(guò)程,源程序:文件名.asm,,,,目標(biāo)程序:文件名.obj,可執(zhí)行文件:文件名.exe,Finish,,編輯器,如notepad.exe,匯編器,如masm.exe,鏈接器,如link.exe,調(diào)試器,如debug.exe,開發(fā)工具(了解),X86+Windows平臺(tái)下常用的匯編編譯器有:Microsoft公司的MASMBorland公司的TASM開源社區(qū)的NASMMASM是微軟推出的宏匯編語(yǔ)言,自發(fā)布以來(lái)已有多次版本更新,下頁(yè)表格中列出了幾個(gè)較為典型的版本。注:容易與之混淆的是MASM32,它是SteveHutchesson以個(gè)人名義發(fā)布、基于MASM而構(gòu)建的軟件包。其版本號(hào)和MASM的版本號(hào)是不同的,比如MASM32V8使用的匯編編譯器是MASM6。MASM32的最新版本為MASM32V12。,MASM版本歷史(了解),開發(fā)工具(了解),Masm5適合進(jìn)行DOS程序開發(fā);Masm6以后的版本開始支持Win32程序開發(fā)。(微軟官方發(fā)布的Masm6所附的link.exe是SegmentedExecutableLinker,只能開發(fā)DOS程序;要進(jìn)行Win32開發(fā)必須配備IncrementalLinker,該類型的link.exe可以從VisualStudio中獲取。開發(fā)Win32程序推薦使用MASM32開發(fā)包)開發(fā)DOS程序的Masm下載地址:Masm5.00[羅云彬的編程樂(lè)園]http://211.90.241.130:22366/view.asp?file=51Masm615ForDos[aogo匯編小站],開發(fā)步驟演示(了解),使用MASM5.0,開發(fā)步驟演示(了解),使用MASM6.15ForDOS,3.2.2語(yǔ)句的類型,匯編語(yǔ)言源程序中的語(yǔ)句主要有以下兩種類型:指令性語(yǔ)句指示性語(yǔ)句指令性語(yǔ)句主要由CPU指令組成,對(duì)應(yīng)實(shí)際的機(jī)器指令;(比如“Hello例”中的MOVDS,AX)指示性語(yǔ)句又稱偽操作語(yǔ)句,主要由偽操作指令組成。(比如“Hello例”中的codeSEGMENT),語(yǔ)句的組成,匯編語(yǔ)言的語(yǔ)句可以有1~4個(gè)組成部分,如下所示:[名字]操作碼/偽操作碼[操作數(shù)][;注釋]帶方括號(hào)的部分表示可選項(xiàng)。以“Hello例”中的幾條語(yǔ)句為例:,3.2.3語(yǔ)句的組成—名字,名字在指令性語(yǔ)句中,名字是一個(gè)標(biāo)號(hào),實(shí)際上就是指令的符號(hào)地址。比如“start:MOVAX,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)有三種屬性:段、偏移量和類型。段屬性是定義標(biāo)號(hào)的程序段的段地址。偏移量表示標(biāo)號(hào)所在段的起始地址到定義該標(biāo)號(hào)的地址之間的字節(jié)數(shù)。標(biāo)號(hào)的類型有兩種:NEAR和FAR。前者可以在段內(nèi)被引用,地址指針為兩個(gè)字節(jié);后者可以在其他段中被引用,地址指針為4個(gè)字節(jié)。,語(yǔ)句的組成—名字,在指示性語(yǔ)句中,名字可以是變量名、段名、過(guò)程名。比如“Hello例”中“dataSEGMENT”中的data是段名,“msgDB‘Hello,World!$‘”中的msg是變量名。指示性語(yǔ)句中的標(biāo)號(hào)后面通常沒(méi)有冒號(hào)。變量也有三種屬性:段、偏移量和類型。段屬性是變量所代表的數(shù)據(jù)所在段的段地址。偏移量表示變量所在段的起始地址與變量的地址之間的字節(jié)數(shù)。變量的類型有:BYTE、WORD、DWORD(四字節(jié))、QWORD(八字節(jié))和TBYTE(十字節(jié))等,表示數(shù)據(jù)區(qū)中存取操作對(duì)象的大小。,3.2.4語(yǔ)句的組成—操作碼/偽操作碼,操作碼/偽操作碼在匯編語(yǔ)言中操作碼以助記符的形式存在。8086/8088CPU的助記符總共約有90多種,比如MOV、ADC等。關(guān)于所有的助記符,參見(jiàn)第二章指令系統(tǒng)。指示性語(yǔ)句中的DB、SEGMENT、ENDS、ASSUME、END等都是偽操作碼,而不是CPU指令的助記符。它們?cè)诔绦蛑械淖饔檬嵌x變量的類型、定義段以及命令匯編程序(masm.exe)結(jié)束匯編等。它們是指示匯編程序(masm.exe)完成匯編,本身不產(chǎn)生對(duì)應(yīng)的機(jī)器碼。關(guān)于偽操作碼的具體作用和使用方法,下文有專門章節(jié)討論。,3.2.5語(yǔ)句的組成—操作數(shù),操作數(shù)對(duì)于CPU指令,可能有單操作數(shù)和雙操作數(shù),也可能無(wú)操作數(shù);偽指令可能有更多個(gè)操作數(shù)??梢杂米鞑僮鲾?shù)的有:常數(shù)、寄存器、標(biāo)號(hào)、變量和表達(dá)式。常數(shù)十進(jìn)制數(shù),如99D或99。后面加字母“D”,或者什么也不加。十六進(jìn)制數(shù),如64H,0F800H,后面加一個(gè)字母“H”;如果最高位數(shù)值不是0-9,前面要再加一個(gè)數(shù)字0。(以避免和寄存器名稱如“AH”沖突)ASCII常數(shù),例如’A’、’8’、‘cat’,字符應(yīng)該放在單引號(hào)中。,語(yǔ)句的組成—操作數(shù),寄存器8086/8088的寄存器可以用作指令的操作數(shù)。8086/8088CPU的寄存器有: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以及循環(huán)控制LOOP等指令的操作數(shù)。比如“HELLO例”中“ENDstart”,start就是一個(gè)標(biāo)號(hào)。,語(yǔ)句的組成—操作數(shù),變量變量是存儲(chǔ)器中某個(gè)數(shù)據(jù)區(qū)的名字,因此在指令中可以作為存儲(chǔ)器操作數(shù)。如“Hello例”中的:LEADX,msg其中msg就是一個(gè)在數(shù)據(jù)區(qū)定義的變量(msgDB‘Hello,World!$’)。表達(dá)式匯編語(yǔ)言中的表達(dá)式按其性質(zhì)可以分為兩種:數(shù)值表達(dá)式和地址表達(dá)式。數(shù)值表達(dá)式產(chǎn)生一個(gè)數(shù)值結(jié)果,只有大小,沒(méi)有屬性。地址表達(dá)式的結(jié)果不是一個(gè)單純的數(shù)值,它有三種屬性:段、偏移量和類型。,語(yǔ)句的組成—操作數(shù),構(gòu)成表達(dá)式必然有運(yùn)算符。表達(dá)式中常用運(yùn)算符有以下幾種:①算術(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等與同樣名稱的CPU指令相混淆。前者可對(duì)整常數(shù)進(jìn)行按位邏輯運(yùn)算,是在匯編時(shí)進(jìn)行;后者的操作數(shù)可以是寄存器、存儲(chǔ)器和立即數(shù),是在程序運(yùn)行時(shí)由CPU執(zhí)行。比如:ANDAL,01011010B;這里的AND是指令助記符MOVAL,01011010BAND11110000B;這里的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)。例如:MOVAX,4EQ3;關(guān)系不成立,故(AX)←0MOVAX,4NE3;關(guān)系成立,故(AX)←0FFFFH,語(yǔ)句的組成—操作數(shù),④分析運(yùn)算符和合成運(yùn)算符如OFFSET、SEG、TYPE、SIZE和LENGTH等;合成運(yùn)算符有PTR、THIS、SHORT等。分析運(yùn)算符用以分析一個(gè)存儲(chǔ)器操作數(shù)的屬性,如段、偏移量或類型等。合成運(yùn)算符則可以規(guī)定存儲(chǔ)器操作數(shù)的某個(gè)屬性,例如類型。OFFSET用于獲取一個(gè)標(biāo)號(hào)或變量的偏移地址,如:MOVSI,OFFSETDATA1是將變量DATA1的偏移地址送至SI寄存器。其效果等同于:LEASI,DATA1,語(yǔ)句的組成—操作數(shù),SEG用于獲取標(biāo)號(hào)或變量的段址,如:MOVAX,SEGARRAYMOVDS,AX是將變量ARRAY的段地址送入DS寄存器。TYPE的運(yùn)算結(jié)果是一個(gè)數(shù)值,這個(gè)數(shù)值與存儲(chǔ)器操作數(shù)類型屬性的關(guān)系如下:,語(yǔ)句的組成—操作數(shù),TYPE運(yùn)算符的例子VARDW?ARRAYDD10DUP(?)STRDB‘Thisisatest’MOVAX,TYPEVAR;(AX)←2MOVBX,TYPEARRAY;(BX)←4MOVCX,TYPESTR;(CX)←1LENGTH如果一個(gè)變量已用重復(fù)操作符DUP說(shuō)明其變量的個(gè)數(shù),則利用LENGTH獲取這個(gè)變量的個(gè)數(shù)。如果未用DUP說(shuō)明,則得到的結(jié)果為1。比如上例中,LENGTHARRAY運(yùn)算結(jié)果為10。,語(yǔ)句的組成—操作數(shù),SIZE如果一個(gè)變量已用重復(fù)操作符DUP說(shuō)明,則利用SIZE運(yùn)算符可得到分配給該變量的字節(jié)總數(shù)。如果未用DUP說(shuō)明,則得到的結(jié)果是TYPE運(yùn)算的結(jié)果。比如上例中,SIZEARRAY運(yùn)算結(jié)果為104=40。由此可知,SIZE的運(yùn)算結(jié)果等于LENGTH的運(yùn)算結(jié)果乘以TYPE的運(yùn)算結(jié)果。PTR是一個(gè)合成運(yùn)算符,用于指定存儲(chǔ)器操作數(shù)的類型。比如INCBYTEPTR[BX][SI],指令中利用PTR運(yùn)算符明確規(guī)定存儲(chǔ)器操作數(shù)的類型為BYTE(字節(jié)),因此,本指令將一個(gè)8位存儲(chǔ)器的內(nèi)容加1。,語(yǔ)句的組成—操作數(shù),THIS也可以指定存儲(chǔ)器操作數(shù)的類型。使用THIS運(yùn)算符可以使標(biāo)號(hào)或變量的類型具有靈活性。例如要求對(duì)同一個(gè)數(shù)據(jù)區(qū),既可以字節(jié)作為單位,又可以字作為單位進(jìn)行存取,則可以用以下語(yǔ)句:AREAWEQUTHISWORDAREABDB100DUP(?)上面的AREAW和AREAB代表同一個(gè)數(shù)據(jù)區(qū),其中共有100個(gè)字節(jié),但AREAW的類型為WORD,而AREAB的類型為BYTE。SHORT指定一個(gè)標(biāo)號(hào)的類型為SHORT(短標(biāo)號(hào)),即標(biāo)號(hào)到引用標(biāo)號(hào)的指令間的距離在-128~127之間。短標(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與一個(gè)位移量做運(yùn)算,又要在外面加上方括號(hào)來(lái)表示存儲(chǔ)器地址。MOVCL,[BX]MOVAL,[SI+5]段超越運(yùn)算符“:”是“:”(冒號(hào))跟在段寄存器名(DS、ES、SS或CS)之后表示段超越,用以給一個(gè)存儲(chǔ)器操作數(shù)指定一個(gè)段屬性,而不管其原來(lái)隱含的段是什么。例如:MOVAX,ES:[SI]HIGH和LOW獲取一個(gè)數(shù)值或地址表達(dá)式的高位和低位字節(jié)。STUFFEQU0ABCDHMOVAH,HIGHSTUFF;(AH)←0ABHMOVAL,LOWSTUFF;(AL)←0CDH,語(yǔ)句的組成—操作數(shù),如果一個(gè)表達(dá)式中同時(shí)具有多個(gè)運(yùn)算符,那么按照以下規(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)。注釋也可以從一行的最前面開始。匯編程序(masm.exe)對(duì)注釋不予理會(huì),即注釋對(duì)匯編后產(chǎn)生的目標(biāo)程序沒(méi)有任何影響。,3.3偽操作指令,指示性語(yǔ)句中的偽操作指令,因其表示形式類似于CPU指令,故稱其為“偽指令”。偽指令與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)了。原來(lái)的代碼段中每條指令性語(yǔ)句都對(duì)應(yīng)一條機(jī)器碼。匯編源代碼中的第一句MOVAX,data經(jīng)編譯后變成MOVAX,1449。這是因?yàn)榫幾g器(masm.exe)將數(shù)據(jù)段放在1449:0000的位置。然后將DS:DX指向該位置,通過(guò)INT21的09H中斷將其顯示出來(lái)。,資料回顧:功能號(hào)09H的int21中斷功能描述:輸出一個(gè)字符串到標(biāo)準(zhǔn)輸出設(shè)備上。入口參數(shù):AH=09HDS:DX=待輸出字符的地址說(shuō)明:待顯示的字符串以’$’作為其結(jié)束標(biāo)志,Hello,World!機(jī)器代碼的分析,下圖使用d1449:0000顯示了數(shù)據(jù)段中的內(nèi)容:,Review(1),匯編語(yǔ)言源程序中語(yǔ)句的類型指令性語(yǔ)句–由CPU指令組成指示性語(yǔ)句–由偽指令組成匯編語(yǔ)言語(yǔ)句的組成1、名字指令性語(yǔ)句中的名字是一個(gè)標(biāo)號(hào)指示性語(yǔ)句中的名字可以是變量名、段名、過(guò)程名2、操作碼/偽操作碼,Review(2),3、操作數(shù)常數(shù)寄存器標(biāo)號(hào)變量表達(dá)式算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符分析運(yùn)算符和合成運(yùn)算符各種運(yùn)算符的優(yōu)先級(jí)4、注釋,3.3偽操作命令,宏匯編程序MASM提供了數(shù)十種偽操作。(這里也揭示了操作碼和偽操作碼的區(qū)別:偽操作碼隨編譯器的不同而不同;而操作碼隨CPU的不同而不同。)根據(jù)偽操作的功能,大致可以分為下列幾類:,偽操作指令分類,處理器方式偽操作(了解),處理器方式偽操作用于指示匯編編譯器使用何種CPU的指令系統(tǒng)。常用的有以下幾種:.8086指示匯編程序只匯編8086/8088的指令系統(tǒng)。程序中若出現(xiàn)80286或80386的指令,則編譯會(huì)出錯(cuò)。如果程序中不定義任何處理器方式偽操作,則匯編程序默認(rèn)即是.8086方式。.386P指示匯編程序匯編8086/8088以及所有80286和80386(包括保護(hù)方式和非保護(hù)方式)的指令。,3.3.2數(shù)據(jù)定義偽指令,數(shù)據(jù)定義偽操作用于定義變量類型、給變量賦值。常用的有以下幾種:數(shù)據(jù)定義偽操作的一般格式是:[變量名]偽操作操作數(shù)[,操作數(shù)…]操作數(shù)可以是常數(shù)、表達(dá)式或字符串,但每項(xiàng)操作數(shù)的值不能超過(guò)偽操作所定義的數(shù)據(jù)類型限定的范圍。,例1:DATA_BDB10,5,10HDATA_WDW100H,-4DATA_DDD0FFFBH匯編后的內(nèi)存分配情況如右圖所示。,,例2:操作數(shù)可以是字符串,例如STRDB‘HELLO’匯編后的情況如圖:,注意下面兩個(gè)定義的不同之處:DB‘AB’;41H在低字節(jié),42H在高字節(jié)DW‘AB’;42H在低字節(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:ABCDB0,1,2,3,4,’OK’,’$’RSVDW?,?,?,?,?,?,?,?復(fù)制操作符DUP:重復(fù)的數(shù)據(jù)可以使用復(fù)制操作符DUP,如上面RSV亦可寫成:RSVDW8DUP(?),3.3.3符號(hào)定義偽操作,符號(hào)定義偽操作用于給一個(gè)符號(hào)重新命名,或定義新的類型屬性等。這里的符號(hào)可以是匯編語(yǔ)言中所用的變量名、標(biāo)號(hào)名、過(guò)程名、記錄名、寄存器名以及指令助記符等。常用的符號(hào)定義偽操作有EQU、=、LABELEQU格式:名字EQU表達(dá)式作用:用名字代替一個(gè)數(shù)值,或一個(gè)較長(zhǎng)的表達(dá)式。舉例:HPIXELEQU1024VPIXELEQU768SCREENEQUHPIXEL*VPIXEL,符號(hào)定義偽操作,=格式:名字=表達(dá)式作用:類似EQU,區(qū)別在于“=”可以對(duì)一個(gè)名字重復(fù)定義。舉例:COUNT=10MOVCX,COUNT;(CX)←10COUNT=COUNT-1MOVBX,COUNT;;(BX)←9LABEL格式:名字LABEL表達(dá)式作用:定義標(biāo)號(hào)或變量的類型。舉例:AREAWLABELWORDMOVAREAW,AX;AX送AREAW的第1、2字節(jié)中,3.3.4段定義偽操作,段定義偽操作用于在匯編語(yǔ)言源程序中定義邏輯段。常用的段定義偽操作有SEGMENT/ENDS、ASSUMESEGMENT/ENDS格式:段名SEGMENT[定位類型][組合類型][‘類別’]作用:定義一個(gè)邏輯段舉例:STACKSEGMENTDB100DUP(?)STACKENDS“定位類型”告訴編譯器如何確定邏輯段的邊界在存儲(chǔ)器中的位置,即對(duì)齊方式。有PARA、BYTE、WORD和PAGE四種?!敖M合類型”告訴編譯器在裝入程序時(shí)各個(gè)邏輯段如何組合?!邦悇e”的作用是在連接時(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í)際的初值。舉例:ASSUMECS:CODE,DS:DATA1,SS:STACKASSUMEDS:SEGAREA1ASSUMEES:NOTHING;取消前面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ò)程的類型,并指出該過(guò)程的類型是NEAR或FAR。如果沒(méi)有特別指明,則認(rèn)為過(guò)程類型是NEAR。偽操作碼ENDP標(biāo)志過(guò)程定義結(jié)束。注意:PROC和ENDP必須成對(duì)出現(xiàn)。,過(guò)程的類型有兩種:NEAR——(默認(rèn)類型)表示段內(nèi)調(diào)用;(SP)?(SP-2);((SP+1):(SP))?(IP);FAR——表示段間調(diào)用。調(diào)用一個(gè)過(guò)程的格式為:CALL,3.3.6模塊定義與連接偽操作(了解),在編寫規(guī)模較大的匯編語(yǔ)言程序時(shí),可將程序劃分成幾個(gè)獨(dú)立的源程序模塊,分別進(jìn)行匯編,最后統(tǒng)一連接。各個(gè)模塊之間可以相互進(jìn)行符號(hào)訪問(wèn)。命令為NAME、END、PUBLIC和EXTRN。NAME格式:Name模塊名作用:指定源文件匯編后的目標(biāo)文件名稱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)或數(shù)值的名字,包括用PROC定義的過(guò)程名等。EXTRN格式:EXTRN名字:類型[,…]作用:說(shuō)明本模塊中所用的某些符號(hào)是外部的,即這些符號(hào)在將被連接在一起的其他模塊中定義(定義這些符號(hào)的模塊中還必須用PUBLIC說(shuō)明)。,3.3.7宏處理偽操作,如果在程序中需要多次使用一個(gè)程序段,可將其定義為宏。每次需要時(shí),直接進(jìn)行調(diào)用,稱為宏調(diào)用?!纠眠^(guò)程(PROC)可以實(shí)現(xiàn)類似功能。區(qū)別在于:宏在編譯時(shí)就插入每個(gè)宏調(diào)用處(這稱為“宏擴(kuò)展”);而過(guò)程是在執(zhí)行時(shí)進(jìn)行跳轉(zhuǎn)。過(guò)程具有更優(yōu)的空間效率,而宏則具有更優(yōu)的時(shí)間效率?!縈ACRO/ENDM格式:宏指令名MACRO……;(宏定義體)ENDM作用:將宏指令名定義為宏定義體中包含的程序段。,宏處理偽操作,宏定義偽操作允許帶參數(shù),從而具有更強(qiáng)的通用性。例:定義一個(gè)宏,用于兩個(gè)壓縮的BCD數(shù)相加,結(jié)果放在第一個(gè)操作數(shù)中。DECADDMACROOPR1,OPR2MOVAL,OPR1ADDAL,OPR2DAAMOVOPR1,ALENDM下面使用debug來(lái)觀察該例中“宏擴(kuò)展”是如何進(jìn)行的:,源文件,反匯編并執(zhí)行觀察結(jié)果,3.4DOS和BIOS調(diào)用(了解),DOS和BIOS為用戶提供了兩組系統(tǒng)服務(wù)程序。BIOS是IBMPC的基本IO系統(tǒng),包括系統(tǒng)測(cè)試程序、初始化引導(dǎo)程序、一部分中斷矢量裝入程序以及部分外設(shè)的服務(wù)程序。這些程序都固化在主板上的ROM中。DOS是IBMPC的操作系統(tǒng),負(fù)責(zé)管理系統(tǒng)的所有資源。其中包括大量可供用戶調(diào)用的服務(wù)程序。DOS和BIOS調(diào)用不是使用CALL命令,而采用軟中斷指令I(lǐng)NTn。,DOS和BIOS調(diào)用,用戶程序控制PC機(jī)硬件的方式使用高級(jí)語(yǔ)言提供的功能控制硬件調(diào)用方便,但靈活性較低、速度較慢。使用DOS提供的程序控制硬件調(diào)用較為方便,程序可移植性好,編程簡(jiǎn)單。使用BIOS提供的程序控制硬件這種控制比較低層,因而可移植性差,但效率更高。直接訪問(wèn)硬件要求用戶對(duì)硬件非常熟悉。此種方式只用于兩種情況:為了獲得高效率,或是為了獲得DOS和BIOS不支持的功能。,DOS調(diào)用,8086指令系統(tǒng)中,有一條軟中斷指令I(lǐng)NTn。當(dāng)n=5~1FH時(shí),調(diào)用BIOS服務(wù)程序;當(dāng)n=20~3FH時(shí),調(diào)用DOS服務(wù)程序。下表列出了部分DOS軟中斷的功能:,,INT21H調(diào)用,其中INT21H是一個(gè)具有完整功能的服務(wù)程序,一般稱之為DOS系統(tǒng)功能調(diào)用。是最常用的DOS中斷。INT21H中斷具有近90個(gè)子功能,大致分為4個(gè)方面:設(shè)備管理、目錄管理、文件管理和其他。系統(tǒng)功能調(diào)用(INT21H)的使用步驟如下:置系統(tǒng)功能號(hào)n(放入AH)置入口參數(shù)執(zhí)行INT21H分析出口參數(shù),INT21H調(diào)用示例,例:從鍵盤讀入一個(gè)字符,判斷是Y還是N,以執(zhí)行對(duì)應(yīng)操作。,資料:功能號(hào)01H的int21H中斷功能描述:從標(biāo)準(zhǔn)輸入設(shè)備(如:鍵盤)讀入一個(gè)字符功能號(hào):AH=01H,過(guò)濾掉控制字符,并回顯出口參數(shù):AL=輸入字符的ASCII碼,KEY:MOVAH,1INT21H;執(zhí)行調(diào)用CMPAL,‘Y’JEYESCMPAL,‘N’JENOJMPKEY;輸入其他字符,退回繼續(xù)等待輸入YES:……NO:……,BIOS調(diào)用,下面列出了部分BIOS中斷:,關(guān)于BIOS中斷的所有中斷號(hào)內(nèi)容(從05H~1FH),參見(jiàn)書附錄3.3,Review,BIOS調(diào)用,BIOS調(diào)用的使用步驟如下:置系統(tǒng)功能號(hào)n(放入AH)置入口參數(shù)執(zhí)行INTn分析出口參數(shù)舉鍵盤輸入服務(wù)(INT16H)為例。其主要功能有三個(gè),分別用于讀鍵盤、讀擴(kuò)展鍵盤和讀取功能鍵,分別對(duì)應(yīng)功能號(hào)0、1、2(AH=0、1、2)。下面一段程序的功能是:按下F1和F2鍵,分別執(zhí)行兩段不同的程序,按其他鍵則轉(zhuǎn)至錯(cuò)誤處理。,INT16H調(diào)用示例,資料:功能號(hào)00H的int16H中斷功能描述:從鍵盤讀入字符入口參數(shù):AH=00H出口參數(shù):AH=鍵盤的掃描碼AL=字符的ASCII碼,MOVAH,0INT16H;執(zhí)行調(diào)用CMPAL,0JNEERROR;若為字符鍵,轉(zhuǎn)ERRORCMPAH,3BH;F1鍵碼為3BHJETT1CMPAH,3CH;F2鍵碼為3CHJETT2JMPERRTT1:……;處理F1鍵功能TT2:……;處理F2鍵功能ERR:……,資料:鍵碼又稱鍵盤掃描碼,F(xiàn)1鍵碼為3BHF2鍵碼為3CH,INT10H調(diào)用示例,從上頁(yè)的例子中,可以看出,同樣的功能,往往既可以用BIOS中斷調(diào)用來(lái)實(shí)現(xiàn),也可以用DOS中斷調(diào)用來(lái)實(shí)現(xiàn)。比如磁盤服務(wù)、鍵盤服務(wù)、顯示字符等。差別在于:BIOS中斷調(diào)用往往功能更強(qiáng)大、控制更靈活。例:INT10H功能號(hào)09H,“在當(dāng)前光標(biāo)位置顯示字符”。,MOVAH,9;顯示字符MOVAL,‘a(chǎn)’;字符MOVBL,0Ch;0表示背景黑色,0Ch表示字符紅色MOVBH,0;第0頁(yè)MOVCX,8;字符重復(fù)個(gè)數(shù)INT10h,INT10H調(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)存有一張表,要求從鍵盤上輸入一個(gè)字符串,然后在表中查找該字符串,如有,則在屏幕上顯示“OK!”;如果沒(méi)有,則顯示“NO!”;若輸入字符串長(zhǎng)度超過(guò)內(nèi)存中表的長(zhǎng)度,則顯示“Wrong!Thestringistoolong!”邏輯分析:查找可以分兩步進(jìn)行,先在表中搜索字符串的第一個(gè)字符,如有,再比較字符串的其他字符是否一致。功能可行性分析:在屏幕上顯示字符串可以使用功能號(hào)09H的21號(hào)中斷;從鍵盤上接收字符串可以使用功能號(hào)0AH的21號(hào)中斷。,教材P213,流程圖,顯示提示符,從鍵盤接收提示符,字符串首址送SI,表首址送DI字符串長(zhǎng)度送BX,表長(zhǎng)度送CX,表長(zhǎng)>=串長(zhǎng),搜索、匹配等工作,開始,返回,顯示“串太長(zhǎng)”,,,,,,,具體見(jiàn)教材P214,資料1:功能號(hào)09H的int21H中斷,功能描述:顯示字符串(串尾字符為$,但不顯示)入口參數(shù):AH=09HDS:DX=被顯示字符串的首地址出口參數(shù):無(wú),dataSEGMENTmsgDBHello,World!$dataENDScodeSEGMENTASSUMECS:code,DS:dataMAINPROCNEARstart:MOVAX,dataMOVDS,AXLEADX,msgMOVAH,9hINT21hMOVAH,4ChINT21hMAINENDPcodeENDSENDstart,例如:,資料2:功能號(hào)0AH的int21H中斷,功能描述:從標(biāo)準(zhǔn)輸入設(shè)備(如:鍵盤)讀入一個(gè)字符串,遇到“回車鍵”結(jié)束輸入。入口參數(shù):AH=0AHDS:DX=存放輸入字符的起始地址接受輸入字符串緩沖區(qū)的定義說(shuō)明:1、第一個(gè)字節(jié)為緩沖區(qū)的最大容量;2、第二個(gè)字節(jié)為實(shí)際輸入的字符數(shù)(不包括回車鍵);3、從第三個(gè)字節(jié)開始存放實(shí)際輸入的字符串;4、字符串以回車鍵結(jié)束,回車符是接受的最后一個(gè)字符;5、若輸入的字符數(shù)超過(guò)緩沖區(qū)的最大容量,則多出的部分被丟棄,直到輸入“回車”鍵才結(jié)束輸入。例如:BUFFDB80,?,80DUP(?);最多接受80個(gè)字符(含回車符)出口參數(shù):無(wú),源碼分析1,DATASEGMENTTABLEDB‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’STR1DB‘Pleaseenterastring:’,0DH,0AH,’$’STR2DB‘Wrong!Thestringistoolong!$’STR3DB‘No!$’STR4DB‘OK!$’BUFFERDB40DB?DB40DUP(?)TAB_LENEQU26DATAENDSSTACKSEGMENTSTACKDB100DUP(?)STACKENDS,堆棧段定義,數(shù)據(jù)段定義,源碼分析2,CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSEARCHPROCFARSTART:MOVAX,DATAMOVDS,AXMOVES,AXLEADX,STR1;MOVAH,09;INT21H;,顯示提示符,源碼分析3,LEADX,BUFFER;參見(jiàn)“0AH號(hào)系統(tǒng)調(diào)用”資料MOVAH,0AHINT21H;從鍵盤接收字符串MOVSI,DX;(SI)←串首址INCSIMOVBL,[SI];參閱“0AH號(hào)系統(tǒng)調(diào)用”資料MOVBH,0;(BX)←實(shí)際輸入字符串長(zhǎng)度INCSI;將SI指向輸入字符串首字母LEADI,TABLE;(DI)←表首址MOVCX,TAB_LEN;(CX)←表長(zhǎng)度CMPCX,BX;表長(zhǎng)>=串長(zhǎng)?JNCGOON;是,轉(zhuǎn)GOONLEADX,STR2;JMPEXIT;否則顯示串太長(zhǎng),源碼分析4,GOON:CLDMOVAL,[SI];(AL)←字符串第一個(gè)字符SCAN:REPNZSCASB;在表中搜索第一個(gè)字符JZMATCH;找到,轉(zhuǎn)MATCHERROR:LEADX,STR3;否則,顯示‘NO!’JMPEXITMATCH:INCCXCMPCX,BX;剩余表長(zhǎng)>=串長(zhǎng)?JCERROR;否,顯示‘NO!’PUSHCXPUSHSIPUSHDIMOVCX,BXDECDIREPZCMPSB;比較串中其余字符,源碼分析5,POPDIPOPSIPOPCXJZFOUND;找到字符串,轉(zhuǎn)FOUNDJCXZERROR;否則,若全表搜索完,顯示‘No!’JMPSCAN;全表未搜索完,轉(zhuǎn)SCANFOUND:DECDI;(DI)←字符串偏移地址LEADX,STR4;顯示’OK!’EXIT:MOVAH,09HINT21H;顯示退出字符串MOVAH,4CHINT21HSEARCHENDPCODEENDSENDSTART,如何閱讀匯編代碼(供參考),對(duì)于較長(zhǎng)的匯編代碼,可通過(guò)“分塊法”閱讀。也就是根據(jù)記憶中的既有模板,將源碼拆成多個(gè)“功能塊”。這要求對(duì)一些基本模板要有一定印象。(比如:功能號(hào)09H的INT21調(diào)用模板;查找字符串、對(duì)比字符串的模板。一些常用功能的實(shí)現(xiàn)往往有其相對(duì)固定的套路,在源碼中能較容易看出。大家可以自己試著總結(jié)。)同時(shí)可以借助于一些標(biāo)記,比如“INTxx”往往標(biāo)記著一個(gè)功能塊的結(jié)束,那么可以循著往上尋找出一個(gè)完整的功能塊;“標(biāo)號(hào)”也可以幫助拆分功能塊,尤其是書寫優(yōu)秀的源碼,往往采用有意義、一目了然的標(biāo)號(hào)。總之,閱讀匯編源碼要注意積累。在閱讀別人源碼時(shí)要加以留心并注意總結(jié),逐步提升自己水平。,匯編語(yǔ)言程序設(shè)計(jì)小節(jié)尋址方式——存儲(chǔ)器操作數(shù)的尋址方式;指令系統(tǒng)——8088/8086指令系統(tǒng);匯編語(yǔ)言——掌握各種“格式”、規(guī)則等;匯編高手——勇于實(shí)踐,觸類旁通?。?題2-11、題2-12、題2-13題3-1、題3-4、題3-5、題3-7,作業(yè),- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 東南大學(xué) 電子信息工程 微機(jī) 學(xué)時(shí) 匯編語(yǔ)言
鏈接地址:http://m.kudomayuko.com/p-11501756.html