版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、會計學(xué)1 匯編語言程序設(shè)計第匯編語言程序設(shè)計第9-10章章 第第9章章 宏宏 9.1.1 宏的定義宏的定義 宏是用來代表一個具有特定功能的程序段,它只需在源程序中定義一次,但可 在源程序中引用多次。只要在編寫程序時需要它,就可以直接使用它。 9.1 宏的定義和引用宏的定義和引用 在使用宏之前,必須先定義宏。定義宏一般格式如下: 宏名 MACRO 形參1, 形參2, ;宏的定義體 ENDM 在書寫宏定義時,必須遵照下列規(guī)定: 第1頁/共38頁 第第9章章 宏宏 lMACRO和ENDM是二個成對出現(xiàn)的關(guān)鍵字,分別表示宏定義的開始和結(jié)束; lMACRO和ENDM之間的部分是宏的定義體,它是由指令、偽
2、指令或引用其 它宏所組成的程序片段,是宏所包含的具體內(nèi)容; l“宏名”是由程序員指定的一個合法的標(biāo)識符,它代表該宏; l宏名可以與指令助憶符、偽指令名相同。在這種情況下,宏指令優(yōu)先,而同 名的指令或偽指令都失效; l在ENDM的前面不要再寫一次宏名,這與段或子程序定義的結(jié)束方式不同; l在宏定義的首部可列舉若干形式參數(shù)(也稱啞元),參數(shù)之間要用逗號分隔。 第2頁/共38頁 第第9章章 宏宏 例9.1:定義一個把16位數(shù)據(jù)寄存器壓棧的宏。 PUSHRMACRO PUSHAX PUSHBX PUSHCX PUSHDX ENDM 例9.2:定義二個字存儲變量相加的宏。 MADDMMACRO OPRD
3、1, OPRD2 MOVAX, OPRD2 ADDOPRD1, AX ENDM 第3頁/共38頁 第第9章章 宏宏 9.1.2 宏的引用宏的引用 在源程序中,一旦定義了某宏,那么,在該程序的任何位置都可直接引用該宏, 而不必重復(fù)編寫相應(yīng)的程序段。引用宏的一般格式如下: 宏名 實參1, 實參2, 其中:實參的位置要與形參的位置要對應(yīng),但實參個數(shù)可以與形參個數(shù)不相等。 n當(dāng)實參的個數(shù)多于形參的個數(shù)時,多出的實參被忽略; n當(dāng)實參的個數(shù)少于形參的個數(shù)時,沒有實參對應(yīng)的形參用“空”來對應(yīng)。 在宏展開時,所得到的指令必須是合法的匯編指令,否則,匯編程序?qū)o出 出錯信息。 第4頁/共38頁 第第9章章
4、宏宏 9.1.3 宏的參數(shù)傳遞方式宏的參數(shù)傳遞方式 引用宏時,參數(shù)是通過“實參”替換“形參”的方式來實現(xiàn)傳遞的。參數(shù)形式 靈活多樣,參數(shù)可以是常數(shù)、寄存器、存儲單元和表達(dá)式,還可以是指令的操作 碼。 例9.3:定義二個字存儲變量相加和相減的宏。 方法1:定義二個宏,分別實現(xiàn)存儲變量的加操作和減操作 MADDMMACRO OPRD1, OPRD2 MOVAX, OPRD2 ADDOPRD1, AX ENDM MSUBMMACRO OPRD1, OPRD2 MOVAX, OPRD2 SUBOPRD1, AX ENDM 方法2:定義一個宏,把存儲變量的“加”和“減”操作合并在一起 MOPMMACRO
5、 OP, OPRD1, OPRD2 MOVAX, OPRD2 OPOPRD1, AX ENDM 其中:參數(shù)OP是一個對應(yīng)于操作碼的形式參數(shù)。 第5頁/共38頁 第第9章章 宏宏 9.1.5 宏與子程序的區(qū)別宏與子程序的區(qū)別 宏和子程序都是為了簡化源程序的編寫,提高程序的可維護(hù)性,但是它們二者之 間存在著以下本質(zhì)的區(qū)別: l 在源程序中,通過書寫宏名來引用宏,而子程序是通過CALL指令來調(diào)用; l 匯編程序?qū)晖ㄟ^宏擴(kuò)展來加入其定義體,宏引用多少次,就相應(yīng)擴(kuò)展多少次, 所以,引用宏不會縮短目標(biāo)程序;而子程序代碼在目標(biāo)程序中只出現(xiàn)一次,調(diào) 用子程序是執(zhí)行同一程序段,因此,目標(biāo)程序也得到相應(yīng)的簡化;
6、 l 宏引用時,參數(shù)是通過“實參”替換“形參”來實現(xiàn)傳遞的,參數(shù)形式靈活多 樣,而子程序調(diào)用時,參數(shù)是通過寄存器、堆?;蚣s定存儲單元進(jìn)行傳遞的; l 宏引用語句擴(kuò)展后,目標(biāo)程序中就不再有宏引用語句。運(yùn)行時,不會有額外的 時間開銷,而子程序調(diào)用指令存在于目標(biāo)程序之中,執(zhí)行調(diào)用指令需要時間。 總之,當(dāng)程序片段不長,速度是關(guān)鍵因素時,可采用宏來簡化源程序,但當(dāng)程序 片段較長,存儲空間是關(guān)鍵因素時,可采用子程序來簡化源程序和目標(biāo)程序。 第6頁/共38頁 第第9章章 宏宏 9.2.1 連接運(yùn)算符連接運(yùn)算符 9.2 宏參數(shù)的特殊運(yùn)算符宏參數(shù)的特殊運(yùn)算符 在宏定義中,如果形式參數(shù)與其它字符連接在一起,或形式
7、參數(shù)出現(xiàn)在字符串 之中,那么,就必須使用連接運(yùn)算符(上述字節(jié)定義重復(fù)100次 第19頁/共38頁 第第9章章 宏宏 例9.9:定義100個初值分別為1,2,100的字節(jié)單元,該存儲單元的起始符號地 址為Table。 解: Table LABEL TYPE COUNT = 1 REPT100 DB COUNT COUNT = COUNT + 1 ENDM 上述重復(fù)塊的匯編結(jié)果相當(dāng)于: Table LABEL TYPE DB 1 DB 2 DB 100 第20頁/共38頁 例9.10:計算1+2+1000,并把其值存入寄存器AX。 解: 方法1:用偽指令REPT來實現(xiàn) MOVAX, 0 COUNT
8、 = 1 REPT1000 ADD AX, COUNT COUNT = COUNT + 1 ENDM 上述重復(fù)塊的匯編結(jié)果與下面程序段相一致: MOVAX, 0 ADD AX, 1 ADD AX, 2 ADD AX, 1000 雖然上面這些語句的執(zhí)行能完成本例所指定的功能,但它是用1000條加法指 令來直接計算的,這1000條指令無疑會大大增加目標(biāo)代碼的長度。 第21頁/共38頁 第第9章章 宏宏 方法2:用循環(huán)指令LOOP來實現(xiàn) MOVAX, 0 MOVCX, 1000 again:ADDAX, CX LOOPagain 第22頁/共38頁 第第9章章 宏宏 偽指令REPT與循環(huán)指令起作用的
9、時期和方式是截然不同的。 表9.2 偽指令REPT與循環(huán)指令LOOP之間的主要差異 偽指令REPT循環(huán)指令LOOP 起作用的時期匯編程序把源文件翻譯成目標(biāo)文 件時期 程序的執(zhí)行時期 起作用的方式把被重復(fù)的指令(組)直接重復(fù)寫 入目標(biāo)文件 通過反復(fù)執(zhí)行同一指令(組)來 實現(xiàn)重復(fù) 重復(fù)次數(shù)對目 標(biāo)文件的影響 由于重復(fù)次數(shù)決定著被重復(fù)指令 (組)寫入目標(biāo)文件的次數(shù),所以 ,改變重復(fù)次數(shù)一定會改變目標(biāo) 文件的字節(jié)數(shù) 由于重復(fù)的指令數(shù)與重復(fù)次數(shù) 無關(guān),所以,改變重復(fù)次數(shù)不 會改變目標(biāo)文件的字節(jié)數(shù) 第23頁/共38頁 第第9章章 宏宏 9.4.2 偽指令偽指令I(lǐng)RP 偽指令I(lǐng)RP的作用是用每個參數(shù)創(chuàng)建一組
10、語句,其重復(fù)次數(shù)由偽指令后面參數(shù) 表中參數(shù)的個數(shù)來確定。其一般使用格式如下: IRP形式參數(shù), 重復(fù)的語句組 ENDM 例9.11:把16位通用寄存器之值相加,并把結(jié)果存入寄存器AX。 解:由于16位通用寄存器名是一些不同的符號,不能用計數(shù)的方法來依次訪問它 們,所以,我們需要用偽指令I(lǐng)RP來實現(xiàn)。 IRPREG, ADD AX, REG ENDM 第24頁/共38頁 第第9章章 宏宏 9.4.3 偽指令偽指令I(lǐng)RPC 偽指令I(lǐng)RPC的作用與IRP相似,其實參表是一個字符串,并對字符串中的每 個字符創(chuàng)建一組語句,所以,其重復(fù)次數(shù)是由該字符串中的字符數(shù)來確定。 IRPC形式參數(shù), 字符串 重復(fù)的
11、語句組 ENDM 例9.13:把16位數(shù)據(jù)寄存器之值相加,并把結(jié)果存入寄存器DI。 解:由于16位數(shù)據(jù)寄存器是AX、BX、CX和DX,它們的名稱中只有第一個字符 不同,所以,可以用偽指令I(lǐng)RPC來實現(xiàn)。 XORDI, DI IRPCREG, ABCD ADD DI, REG符號當(dāng)符號DOS不為0時,則使用DOS的功能 調(diào)用 MOVAH, 1H INT21H ELSE;否則,將使用BIOS的功能調(diào)用 MOVAH, 10H INT16H ENDIF ENDM 在引用宏INPUT時,匯編程序會根據(jù)DOS是否為0來生成不同的程序段。 第28頁/共38頁 第第9章章 宏宏 例9.15:編寫一個可用功能調(diào)
12、用輸入字符的宏定義。 解: READCH MACRO char MOVAH, 1H INT21H;接受一個字符,并存入AL中 IFNB;若參數(shù)char有實參與之對應(yīng) IFDIF , ;若參數(shù)charAL,則把字符保 存到實參中 MOV char, AL ENDIF ENDIF ENDM 第29頁/共38頁 第第9章章 宏宏 9.6 宏的擴(kuò)充宏的擴(kuò)充 MASM 6.11編程系統(tǒng)對宏定義及其相關(guān)語句進(jìn)行了一定程度的擴(kuò)充。雖然這 些擴(kuò)充給編程帶來了一些方便,但它們不一定能被其它的匯編語言編程系統(tǒng)所接 受,所以,程序員在使用這些方便的擴(kuò)充功能時,要注意到可能帶來的限制。 有關(guān)內(nèi)容見書,在此從略。 第3
13、0頁/共38頁 第第10章章 應(yīng)用程序的設(shè)計應(yīng)用程序的設(shè)計 例10.1 編寫一個求字符串長度的子程序Strlen,要求字符串的首地址為入口參數(shù), 且以ASCII碼0為結(jié)束符,CX為出口參數(shù),其存放該字符串的長度。 例10.2 編寫一個把字符串中的所有小寫字符轉(zhuǎn)換成大寫字符的子程序Strupr,要 求字符串的首地址和結(jié)束符為其入口參數(shù)。 例10.3 編寫一個從字符串中拷貝子串的子程序Strncpy,它有四個參數(shù)str1、str2、 idx和num,其具體功能為把字符串str2中從第idx個(從0開始記數(shù))字符 開始、num個字符傳送給str1,字符串str1和str2都是以ASCII碼0為結(jié) 束
14、符。 例10.4 編寫一個把字符串中空格和TAB壓縮掉的子程序Compress,字符串 String是以ASCII碼0為結(jié)束符。 10.1 字符串的處理程序字符串的處理程序 第31頁/共38頁 第第10章章 應(yīng)用程序的設(shè)計應(yīng)用程序的設(shè)計 例10.5 統(tǒng)計從地址0040H:0000H開始的100個字中,把正數(shù)和負(fù)數(shù)按照它們先后 出現(xiàn)的次序分別存儲在緩沖區(qū)Data1和Data2,并把每類的個數(shù)存入相 應(yīng)緩沖區(qū)的第一個字單元中。 例10.6 用鍵盤輸入任意一字符串,分類統(tǒng)計該字符串中每個數(shù)字和字母的出現(xiàn) 次數(shù)。 10.2 數(shù)據(jù)的分類統(tǒng)計程序數(shù)據(jù)的分類統(tǒng)計程序 第32頁/共38頁 第第10章章 應(yīng)用程
15、序的設(shè)計應(yīng)用程序的設(shè)計 例10.7 編寫一個程序,它能把字類型變量的數(shù)值以十進(jìn)制形式輸出出來。若該 數(shù)值為負(fù)數(shù),則需要輸出負(fù)號“-”,否則,不輸出符號。 例10.8 編寫一個程序,它能把字類型變量的數(shù)值以二進(jìn)制形式輸出出來。若該 數(shù)值為負(fù)數(shù),則需要輸出負(fù)號“-”,否則,不輸出符號。 例10.9 編寫一個子程序,該子程序能把32位二進(jìn)制變量的數(shù)值以十進(jìn)制形式輸 出出來。若該數(shù)值為負(fù)數(shù),則需要輸出負(fù)號“-”,否則,不輸出符號。 例10.10 編寫一個程序,它能把用鍵盤輸入的字符串轉(zhuǎn)化成相應(yīng)的數(shù)值。具體功 能如下: 10.3 數(shù)據(jù)轉(zhuǎn)換程序數(shù)據(jù)轉(zhuǎn)換程序 1、輸入的數(shù)據(jù)字符串可以帶正、負(fù)符號,如:123
16、4、+1234或-1234; 2、字符串的最后一個字符表示數(shù)據(jù)的進(jìn)制,默認(rèn)的進(jìn)制為十進(jìn)制, 如:1234H表示十六進(jìn)制數(shù)1234,1234為十進(jìn)制數(shù); 3、對于任何進(jìn)制的數(shù)據(jù),當(dāng)遇到一個非進(jìn)制范圍內(nèi)的字符時,則顯 示出錯信息,并以數(shù)值0為其轉(zhuǎn)換結(jié)果來結(jié)束該類型轉(zhuǎn)換過程。 第33頁/共38頁 第第10章章 應(yīng)用程序的設(shè)計應(yīng)用程序的設(shè)計 例10.11 假設(shè)有一個簡單的學(xué)生結(jié)構(gòu)類型student,其包括:學(xué)號、姓名和年齡等 信息,要求編寫一個程序,該程序接受從鍵盤輸入的學(xué)生記錄信息, 并把它們保存在文件students.dat之中。 例10.12 編寫一個程序顯示由例10.11建立的記錄文件stud
17、ents.dat中的學(xué)生信息。 10.4 文件操作程序文件操作程序 例10.13 編寫一個程序用動態(tài)鏈表存儲20,19,1,并用遍歷鏈表的方法 來顯示每個結(jié)點(diǎn)的數(shù)值。 10.5 動態(tài)數(shù)據(jù)的編程動態(tài)數(shù)據(jù)的編程 第34頁/共38頁 第第10章章 應(yīng)用程序的設(shè)計應(yīng)用程序的設(shè)計 COM文件和EXE文件都是可執(zhí)行文件,典型的COM文件是Command.COM。 COM文件的主要特點(diǎn)如下: 10.6 COM文件的編程文件的編程 1、COM文件只有一個段,其字節(jié)數(shù)不會超過64K; 2、當(dāng)操作系統(tǒng)裝入COM文件時,四個段寄存器(CS、DS、ES和SS)都用PSP的 段值來初始化; 3、必須用偽指令ORG 100H來說明空出前256個字節(jié)。 第3
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《自適應(yīng)控》復(fù)習(xí)提綱(知識點(diǎn))
- 店面分租合同范本
- 拆裝廠房電纜合同范例
- 小泵車租用合同范例
- 工程汽車租賃合同范例
- 關(guān)于承攬服務(wù)合同范例
- 承接工程臨建合同范例
- 寫字樓 空調(diào) 合同范例
- 二手房貸款網(wǎng)簽合同范例
- 公司股質(zhì)押合同范例
- GB/T 10325-2012定形耐火制品驗收抽樣檢驗規(guī)則
- 中考數(shù)學(xué)真題變式題庫
- FZ/T 91019-1998染整機(jī)械導(dǎo)布輥制造工藝規(guī)范
- FZ/T 52025-2012再生有色滌綸短纖維
- SHSG0522003 石油化工裝置工藝設(shè)計包(成套技術(shù))內(nèi)容規(guī)定
- FMEA-培訓(xùn)教材-汽車fmea培訓(xùn)課件
- 制造部年終總結(jié)報告課件
- 粵科版高中通用技術(shù)選修1:電子控制技術(shù)全套課件
- 知識產(chǎn)權(quán)法(英文) Intellectual Property Right Law課件
- 熱力管道焊接技術(shù)交底記錄大全
- 接地裝置安裝試驗記錄
評論
0/150
提交評論