九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > PPT文檔下載  

東南大學電子信息工程之微機學第3章(5學時)匯編語言.ppt

  • 資源ID:11501756       資源大?。?span id="24d9guoke414" class="font-tahoma">1.51MB        全文頁數(shù):82頁
  • 資源格式: PPT        下載積分:14.9積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要14.9積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

東南大學電子信息工程之微機學第3章(5學時)匯編語言.ppt

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

注意事項

本文(東南大學電子信息工程之微機學第3章(5學時)匯編語言.ppt)為本站會員(max****ui)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!