![匯編語(yǔ)言源程序的框架結(jié)構(gòu)(2).ppt_第1頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2021-2/1/fcdbef3b-28c3-427e-959a-87efaf2cb422/fcdbef3b-28c3-427e-959a-87efaf2cb4221.gif)
![匯編語(yǔ)言源程序的框架結(jié)構(gòu)(2).ppt_第2頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2021-2/1/fcdbef3b-28c3-427e-959a-87efaf2cb422/fcdbef3b-28c3-427e-959a-87efaf2cb4222.gif)
![匯編語(yǔ)言源程序的框架結(jié)構(gòu)(2).ppt_第3頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2021-2/1/fcdbef3b-28c3-427e-959a-87efaf2cb422/fcdbef3b-28c3-427e-959a-87efaf2cb4223.gif)
![匯編語(yǔ)言源程序的框架結(jié)構(gòu)(2).ppt_第4頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2021-2/1/fcdbef3b-28c3-427e-959a-87efaf2cb422/fcdbef3b-28c3-427e-959a-87efaf2cb4224.gif)
![匯編語(yǔ)言源程序的框架結(jié)構(gòu)(2).ppt_第5頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2021-2/1/fcdbef3b-28c3-427e-959a-87efaf2cb422/fcdbef3b-28c3-427e-959a-87efaf2cb4225.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、a,1,5.1 匯編語(yǔ)言源程序的框架結(jié)構(gòu) 編制匯編語(yǔ)言源程序時(shí),首先要使用段定義偽指令和段尋址偽指令來(lái)構(gòu)造一個(gè)由若干指令和數(shù)據(jù)組成的程序。構(gòu)造一個(gè)源程序的框架結(jié)構(gòu)有如下兩種格式: 第一種格式: MOVAH,4CH ;返回DOS INT21H CODEENDS ENDBEGIN,第5章 8086/8088匯編語(yǔ)言程序設(shè)計(jì),a,2,第二種格式: RET;取程序段前綴首地址 MAINENDP CODEENDS ENDBEGIN 區(qū)別:兩種格式的本質(zhì)區(qū)別在于返回DOS的方法不同: 對(duì)于第一種格式,采用了調(diào)用DOS系統(tǒng)的4CH功能,返回DOS。具體方法是:在要返回DOS處,安排如下兩條指令: MOVAH
2、,4CH INT21H 對(duì)于第二格式,DOS返回方法是調(diào)用20H類型的中斷服務(wù)程序,a,3,5.2 順序結(jié)構(gòu)程序設(shè)計(jì) 順序程序結(jié)構(gòu)是指完全按照順序逐條執(zhí)行的指令序列,這種結(jié)構(gòu)的流程圖除了有一個(gè)開始框和結(jié)束框外,就是若干處理框,沒有判斷框,如圖5.1所示。 圖5.1 順序程序的結(jié)構(gòu)形式,a,4,例5.1:試分別用匯編語(yǔ)言源程序的兩種框架結(jié)構(gòu)編制程序,求出表達(dá)式:(X4Y)/2的值,并保存到RESULT存儲(chǔ)單元中,其中X,Y均為字節(jié)變量,解:完成該功能的流程圖如圖5.2所示: 圖5.2 例5.1的功能實(shí)現(xiàn)流程圖,a,5,參考程序1: DATASEGMENT;數(shù)據(jù)段 XDB2 YDB4 ZDB?;定
3、義變量 DATAENDS STACKSEGMENT PARASTACK DW20HDUP(0) STACKENDS CODESEGMENT;代碼段 ASSUME CS:CODE,DS:DATA,SS:STACK,a,6,BEGIN:MOVAX,DATA MOVDS,AX;DS賦初值 MOVAL,X;ALX MOVCL,2 SALAL,CL;ALX4 SUBAL,Y;ALX4Y SARAL,1;AL(X4Y)/2 MOVZ,AL;存結(jié)果 MOVAH,4CH;返回DOS INT21H CODEENDS ENDBEGIN,a,7,參考程序2: DATASEGMENT XDB2 YDB4 ZDB? D
4、ATAENDS STACKSEGMENTPARASTACK DW20HDUP(0) STACKENDS CODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK PROC1PROCFAR;使RET為遠(yuǎn)返回 ENDBEGIN,a,8,BEGIN:PUSHDS;入棧保存地址 MOVAX,0;程序段前綴的首地址 PUSHAX MOVAX,DATA MOVDS,AX MOVAL,X;ALX MOVCL,2 SALAL,CL;ALX4 SUBAL,Y;ALX4Y SARAL,1;AL(X4Y)/2 MOVZ,AL;存結(jié)果 RET;取程序段前綴首地址,a,9,PROC1ENDP
5、 CODEENDS,5.3 分支結(jié)構(gòu)程序設(shè)計(jì) 分支程序結(jié)構(gòu)可以有兩種形式,如圖5.4所示,它們分別相當(dāng)于高級(jí)語(yǔ)言程序中的IF-THEN-ELSE語(yǔ)句和CASE語(yǔ)句,它們適用于要根據(jù)不同條件做不同處理的情況,a,10,5.3.1 用比較/測(cè)試的方法實(shí)現(xiàn)IF-THEN-ELSE結(jié)構(gòu) 實(shí)現(xiàn)方法:在產(chǎn)生分支之前,通常用比較、測(cè)試的辦法在標(biāo)志寄存器中設(shè)置相應(yīng)的標(biāo)志位,然后再選用適當(dāng)?shù)臈l件轉(zhuǎn)移指令,以實(shí)現(xiàn)不同情況的分支轉(zhuǎn)移。 (1)進(jìn)行比較,使用比較指令: CMPDEST,SRC 該指令進(jìn)行減法操作,而不保存結(jié)果,只設(shè)置標(biāo)志位。 (2)進(jìn)行測(cè)試,使用測(cè)試指令 TESTDEST,SRC 該指令進(jìn)行邏輯與操作
6、,而不保存結(jié)果,只設(shè)置標(biāo)志位,a,11,5.3.2 用地址表法實(shí)現(xiàn)CASE結(jié)構(gòu)(即多路分支) 用地址表法實(shí)現(xiàn)CASE結(jié)構(gòu)的基本思路是:將各分支程序的入口地址依次羅列形成一個(gè)地址表,讓BX指向地址表的首地址,從鍵盤接收或其他方式獲取要轉(zhuǎn)到的分支號(hào),再讓BX與分支號(hào)進(jìn)行運(yùn)算,使BX指向?qū)?yīng)分支入口地址,最后即可使用JMP WORD PTR BX 或JMP DWORD PTR BX 指令實(shí)現(xiàn)所要轉(zhuǎn)到的分支;程序設(shè)計(jì)流程圖如圖5.6所示,a,12,圖5.6 用地址表法實(shí)現(xiàn)多路分支的結(jié)構(gòu)框圖,例5.4:編程實(shí)現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情,解:假設(shè)有3路分支,在地址表中的入口地址分別:A0、A1
7、、A2;具體見圖5.7所示,a,13,參考程序: DATASEGMENT MENUDB0DH,0AH,0:Chinese! DB0DH,0AH,1:English! DB0DH,0AH,2: German! DB0DH,0AH,Please choose one to answer the following question:$ ERDB 0DH,0AH,I am sorry,you choose the mistake!,a,14,S0DB0DH,0AH,OK,Please answer in Chinese!$ S1DB0DH,0AH,OK,Please answer in Englis
8、h!$ S2DB0DH,0AH,OK,Please answer in German!$ TABDWA0,A1,A2;地址表 DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX LEADX,MENU;顯示菜單 MOVAH,9 INT21H,a,15,MOVAH,1;1號(hào)DOS功能調(diào)用,接收分支號(hào) INT21H CMPAL,0;進(jìn)行合法判斷 JBERROR CMPAL,2 JAERROR LEABX,TAB;取地址表首址 SUBAL,30H SHLAL,1;段內(nèi)轉(zhuǎn)移乘以2,段間轉(zhuǎn)移乘以4 XORAH,AH;AH
9、清零 ADDBX,AX JMPWORD PTR BX;產(chǎn)生多分支轉(zhuǎn)移,a,16,A0:LEADX,S0;各分支程序段 MOVAH,9 INT21H JMPEXIT1 A1:LEADX,S1 MOVAH,9 INT21H JMPEXIT1 A2:LEADX,S2 MOVAH,9 INT21H JMPEXIT1,a,17,ERROR:MOVDX,OFFSET ER MOVAH,9 INT21H EXIT1:MOVAH,4CH;返回DOS INT21H CODEENDS ENDSTART,5.3.3 用轉(zhuǎn)移表法實(shí)現(xiàn)CASE結(jié)構(gòu)(即多路分支) 用轉(zhuǎn)移表法實(shí)現(xiàn)CASE結(jié)構(gòu)的基本思路:將轉(zhuǎn)到各分支程序的轉(zhuǎn)
10、移指令依次羅列形成一個(gè)轉(zhuǎn)移表,讓BX指向轉(zhuǎn)移表的首地址,從鍵盤接收或其他方式獲取要轉(zhuǎn)到的分支號(hào),再讓BX與分支號(hào)進(jìn)行運(yùn)算,使BX指向?qū)?yīng)轉(zhuǎn)移表中轉(zhuǎn)到該分支的轉(zhuǎn)移指令處,最后即可使用JMP BX指令實(shí)現(xiàn)所要轉(zhuǎn)到的分支;具體見圖5.8所示,a,18,圖5.8 用轉(zhuǎn)移表法實(shí)現(xiàn)多路分支的結(jié)構(gòu)框圖 例5.5:編程實(shí)現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情。 解:假設(shè)有3路分支,轉(zhuǎn)移表中的轉(zhuǎn)移指令分別為:JMP SHORT A0、JMP SHORT A1、JMP SHORT A2;具體見圖5.9所示,a,19,參考程序: DATASEGMENT MENUDB0DH,0AH,0:Chinese! DB0DH,
11、0AH,1:English! DB0DH,0AH,2: German! DB0DH,0AH,Please choose one to answer the following question:,a,20,ER DB 0DH,0AH,I am sorry,you shoose the mistake!$ S0DB0DH,0AH,OK,Please answer in Chinese!$ S1DB0DH,0AH,OK,Please answer in English!$ S2DB0DH,0AH,OK,Please answer in German!$ DATAENDS CODESEGMENT A
12、SSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX LEADX,MENU;顯示菜單 MOVAH,9 INT21H,a,21,MOVAH,1;1號(hào)DOS功能調(diào)用,接收分支號(hào) INT21H CMPAL,0 JBERROR CMPAL,2 JAERROR LEABX,TAB;取地址表首址 SUBAL,30H SHLAL,1;短轉(zhuǎn)移乘以2,近轉(zhuǎn)移乘以3,遠(yuǎn)轉(zhuǎn)移乘以5 XORAH,AH;AH清零 ADDBX,AX,a,22,JMPBX;產(chǎn)生多分支轉(zhuǎn)移 TAB:JMPSHORTA0;轉(zhuǎn)移表 JMPSHORTA1 JMPSHORTA2 A0:LEADX,S0;各分支
13、程序段 MOVAH,9 INT21H JMPEXIT1 A1:LEADX,S1 MOVAH,9 INT21H,a,23,JMPEXIT1 A2:LEADX,S2 MOVAH,9 INT21H JMPEXIT1 ERROR:MOVDX,OFFSET ER MOVAH,9 INT21H EXIT1:MOVAH,4CH;返回DOS INT21H CODEENDS ENDSTART,a,24,5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì) 5.4.1 循環(huán)程序的組成 1.設(shè)置循環(huán)的初始狀態(tài) 如置循環(huán)次數(shù)的計(jì)數(shù)值,以及為循環(huán)體正常工作的初始狀態(tài)等; 2.循環(huán)體 這是循環(huán)的工作主體,它由循環(huán)的工作部分及修改部分組成。3.循環(huán)控
14、制部分 它是循環(huán)程序設(shè)計(jì)的關(guān)鍵,每一個(gè)循環(huán)程序必須選擇一個(gè)循環(huán)控制條件來(lái)控制循環(huán)的運(yùn)行和結(jié)束,通常有兩種方法控制循環(huán):用計(jì)數(shù)控制循環(huán),用條件控制循環(huán),a,25,5.4.2 循環(huán)程序的結(jié)構(gòu)形式 循環(huán)程序有兩種結(jié)構(gòu),一種是DO-WHILE結(jié)構(gòu)形式,另一種是DO-UNTIL結(jié)構(gòu)形式。具體見圖5.10所示: DO-WHILE結(jié)構(gòu)把對(duì)循環(huán)控制條件的判斷放在循環(huán)的入口,先判斷條件,滿足條件就執(zhí)行循環(huán)體,否則退出循環(huán)。 DO-UNTIL結(jié)構(gòu)是先執(zhí)行循環(huán)體然后再判斷控制條件,不滿足條件則繼續(xù)執(zhí)行循環(huán)操作,一旦滿足條件則退出循環(huán)。一般講,如果循環(huán)次數(shù)等于0的可能,則應(yīng)選擇DO-WHILE結(jié)構(gòu),否則用DO-UNT
15、IL結(jié)構(gòu),圖5.10 循環(huán)程序的結(jié)構(gòu)形式,a,26,5.4.3 循環(huán)控制的方法 1.用計(jì)數(shù)控制循環(huán) 這種方法直觀、方便,易于程序設(shè)計(jì)。只要在編制程序時(shí),循環(huán)次數(shù)已知,就可以使用這種方法設(shè)計(jì)循環(huán)程序。然而更多的循環(huán)程序,在編制程序時(shí)并不能確切知道循環(huán)次數(shù),但是知道循環(huán)次數(shù)是前面運(yùn)算或操作的結(jié)果或者被存放在某內(nèi)存單元中,例5.6:試編制程序統(tǒng)計(jì)字節(jié)變量VAR中1的個(gè)數(shù),并將它存入COUNT單元中,解:要測(cè)試出VAR中1的個(gè)數(shù)就應(yīng)該逐位進(jìn)行測(cè)試,可根據(jù)最低位是否為1來(lái)計(jì)數(shù),然后用移位的辦法把各位數(shù)逐次移到最低位去,共需要測(cè)試8次。程序流程如圖5.11所示,a,27,圖5.11 例5.6的功能實(shí)現(xiàn)流程
16、圖,a,28,參考程序: DATASEGMENT VARDB 37H COUNTDB ? DATAENDS CODESEGMENT ASSUME CS:CODE,DS:DATA BEGIN:MOVAX,DATA MOV DS,AX MOVAL,VAR;ALVAR的值 MOVCX,8;賦循環(huán)初值 XORBL,BL;賦計(jì)數(shù)器初值,a,29,LL:TESTAL,1;測(cè)試AL的最低位 JZLL1;最低位為0轉(zhuǎn)LL1 INCBL;計(jì)數(shù)器加1 LL1:SHRAL,1;邏輯右移1位 LOOPLL;循環(huán)控制 MOVCOUNT,BL;COUNT計(jì)數(shù)器BL的值 MOVAH,4CH;返回DOS INT21H COD
17、EENDS ENDBEGIN,a,30,2.用條件控制循環(huán),例5.8:將正整數(shù)NUM插入到一個(gè)從小到大排列好順序的正整數(shù)字節(jié)數(shù)組序列中,分析:假設(shè)該數(shù)組的首地址和末地址分別為ARRAY_HEAD、ARRAY_END,顯然在這里需要插入的是一個(gè)數(shù),所以不一定要掃描整個(gè)數(shù)組。同時(shí)為了插入這個(gè)數(shù)據(jù),必須要空出位置,即凡是比它大的數(shù)據(jù)都應(yīng)該向地址增大的方向移動(dòng)一個(gè)字節(jié),故應(yīng)該從數(shù)組的尾部向頭部查找,可逐字節(jié)取出比較。值得注意的是,應(yīng)該考慮正整數(shù)NUM大于或小于數(shù)組中的所有數(shù)的可能,即如果NUM大于數(shù)組中所有數(shù),則第一次比較就可以結(jié)束查找;如果NUM小于數(shù)組中所有數(shù),則必須及時(shí)結(jié)束查找,絕對(duì)不允許查找的
18、范圍超出數(shù)組的首地址,當(dāng)然可以把數(shù)組的首地址或循環(huán)次數(shù)作為結(jié)束查找的條件。根據(jù)上述分析,可以得出程序流程如圖5.13所示,a,31,圖5.13 例5.8的功能實(shí)現(xiàn)流程圖,a,32,參考程序: NUMEQU36H DATASEGMENT ARRAYDB12H,24H,48H,60H,72H,84H YDB? DATAENDS CODESEGMENT ASSUME CS:CODE,DS:DATA BEGIN:MOVAX,DATA MOVDS,AX MOVCX,Y-ARRAY;循環(huán)次數(shù)初始化 MOVAL,NUM;插入值送AL,a,33,LEASI,Y DECSI ;取得ARRAY的最后元素的偏移地址
19、 LOP:CMPARRAYSI,AL;比較 JLEINSERT MOVAH,ARRAYSI MOVARRAYSI+1,AH;數(shù)據(jù)交換 DECSI;修改偏移地址 LOOPLOP INSERT:MOVARRAYSI+1,AL;插入數(shù)據(jù) MOVAH,4CH,a,34,INT21H CODE ENDS ENDBEGIN,5.5 子程序設(shè)計(jì),5.5.1 子程序的構(gòu)造 前面我們學(xué)習(xí)了過(guò)程定義偽指令,我們也就是用它們來(lái)構(gòu)成的子程序,其格式為: 子程序名PROC(NEAR/FAR) 保存信息 恢復(fù)信息 RET 子程序名ENDP,a,35,5.5.2 子程序的調(diào)用與返回 子程序的正確執(zhí)行是由子程序的正確調(diào)用和返
20、回保證的。IBM PC機(jī)的CALL和RET指令就分別完成了子程序的調(diào)用和返回功能。 1.調(diào)用指令:CALL 過(guò)程名 執(zhí)行CALL指令,首先保留斷點(diǎn)地址于堆棧中,然后轉(zhuǎn)移到目標(biāo)單元,它對(duì)PSW無(wú)影響。 2.返回指令:RET 一個(gè)子程序執(zhí)行的最后一條指令必定是返回指令RET,用以返回到調(diào)用子程序的斷點(diǎn)處。但在位置上并不一定就是是最后一條指令。它的位置靈活,并不是必須要在最后。只是習(xí)慣上我們通常將它置于子程序的最后,a,36,5.5.3 編制子程序的要求 1.子程序必須具有通用性 2.注意保存信息和恢復(fù)信息 要注意最先壓入堆棧的應(yīng)該最后彈出來(lái),值得注意的是:必須搞清楚那些寄存器是必須保存的,那些又是
21、不必要或不應(yīng)該保存的。一般來(lái)說(shuō),子程序中用到的寄存器是應(yīng)該保存的,但是如果主程序和子程序之間使用寄存器傳遞參數(shù)的話,該寄存器則不一定需要保存,特別是用來(lái)向主程序回送結(jié)果(即出口參數(shù))的寄存器,則更不應(yīng)該因保存和恢復(fù)該寄存器的內(nèi)容而破壞了應(yīng)該向主程序傳送的信息。 3.選用適當(dāng)?shù)姆椒ㄔ谧映绦蚝椭鞒绦蛑g的進(jìn)行參數(shù)傳遞,a,37,這種主程序與子程序之間的信息傳送稱為參數(shù)傳遞,它可以有以下三種: 用寄存器傳遞參數(shù) 這是最常用的一種方式,通常在參量不多的時(shí)候使用這種方法。 用地址表傳遞參數(shù) 通過(guò)地址表傳送參數(shù)的方法是在主程序中首先建立一個(gè)地址表,把要傳送給子程序的參數(shù)都存放在地址表中,然后把地址表的首地
22、址通過(guò)寄存器傳送到子程序中去;最后子程序通過(guò)地址表取得所需參數(shù)。 用堆棧傳遞參數(shù) 這種方法是在主程序中把要傳送給子程序的參數(shù)先保存到堆棧中,然后子程序再?gòu)亩褩V腥〕鰠?shù)以達(dá)到傳送參數(shù)的目的,a,38,5.6 高級(jí)匯編語(yǔ)言技術(shù) 5.6.1 宏匯編 1宏定義 宏在使用前必須先進(jìn)行宏定義。宏定義格式為: 宏指令名MACRO形式參數(shù),形式參數(shù), 宏體 ENDM 其中,宏指令名:宏定義的名字(即給宏體中程序段指定一個(gè)符號(hào)名),不可缺省,宏調(diào)用時(shí)要使用它,第一個(gè)符號(hào)必須是字母,其后可以是字母或數(shù)字,a,39,MACROENDM:宏定義偽指令助記符,不可缺省。它們成對(duì)出現(xiàn),表示宏定義的開始和結(jié)束,ENDM前
23、不帶宏指令名。 宏體:一段有獨(dú)立功能的程序代碼段。 形式參數(shù):又稱啞元,各個(gè)啞元之間用逗號(hào)隔開,可以缺省,2宏調(diào)用 經(jīng)宏定義后的宏指令可以在源程序中調(diào)用,宏調(diào)用格式為: 宏指令名實(shí)參,實(shí)參 宏調(diào)用只需要有宏指令名,若宏定義中有形參,那么宏調(diào)用時(shí)必須帶有實(shí)際參數(shù)來(lái)替代形參,實(shí)際參數(shù)的個(gè)數(shù),順序,類型與形參一一對(duì)應(yīng),各個(gè)實(shí)參之間用逗號(hào)分開。原則上實(shí)參的個(gè)數(shù)與形參的個(gè)數(shù)相等,但匯編程序不要求它們必須相等,若實(shí)參個(gè)數(shù)大于形參個(gè)數(shù),則多余的實(shí)參不予考慮,若實(shí)參個(gè)數(shù)小于形參個(gè)數(shù),則多余的形參作“空”處理,a,40,3宏展開 匯編程序在對(duì)源程序匯編時(shí),對(duì)每個(gè)宏調(diào)用作宏展開,每條插入的宏體指令前帶上加號(hào)“,例
24、5.11:不帶參數(shù)的宏定義,用宏指令來(lái)實(shí)現(xiàn)回車換行。 宏定義: CRLFMACRO MOVDL,0DH;回車 MOVAH,2 INT21H MOVDL,0AH;換行 MOVAH,2,a,41,INT21H ENDM 宏調(diào)用:CRLF 宏展開:將下述程序段替換宏調(diào)用語(yǔ)句。 MOVDL,0DH;回車 MOVAH,2 INT21H MOVDL,0AH;換行 MOVAH,2 INT21H,a,42,4.宏調(diào)用中參數(shù)傳遞 宏定義中的參數(shù)可以有多個(gè),實(shí)參可以是數(shù)字,寄存器或操作碼。宏定義還可用部分操作碼作參數(shù),但在宏定義中必須用“&”作分隔符,&是一個(gè)操作符,它在宏定義體中可作為啞元的前綴,宏展開時(shí),可以
25、把&前后兩個(gè)符號(hào)合并成一個(gè)符號(hào),例5.12:宏定義帶一個(gè)參數(shù),用宏指令實(shí)現(xiàn)將AX中內(nèi)容右移任意次(小于256,宏定義: SHIFTMACRON MOVCL,N SALAX,CL ENDM 宏調(diào)用1:SHIFT4,a,43,宏調(diào)用2:SHIFT8 宏展開1:MOVCL,4;AX中內(nèi)容算術(shù)左移4次 SALAX,CL 宏展開2:MOVCL,8;AX中內(nèi)容算術(shù)左移8次 SALAX,CL,5.宏定義嵌套 在宏定義中允許使用宏調(diào)用,但必須先定義后調(diào)用,例5.14: 宏定義: AD1MACROM,N MOVBX,M,a,44,ADDAX,N ENDM AD1MMACROR1,R2,R3 PUSHAX PUS
26、HBX AD1R1,R2 MOVX3,AX POPBX POPAX ENDM 宏調(diào)用:AD1MCX,BX,DX 宏展開:PUSHAX,a,45,PUSHBX AD1R1,R2;此語(yǔ)句不占內(nèi)存 MOVBX,CX;AD1宏定義展開 ADDAX,BX MOVDX,AX POPBX POPAX,6.取消宏定義語(yǔ)句 格式為:PURGE 宏指令名,宏指令名 PURGE:偽指令助記符,不可缺省,因?yàn)榻?jīng)過(guò)定義的宏指令名,不允許重新定義,必須用PURGE語(yǔ)句將其取消后,才能重新定義,此語(yǔ)句一次可以取消多個(gè)宏指令名,a,46,7.宏指令與子程序的區(qū)別 過(guò)程調(diào)用使用CALL語(yǔ)句,由CPU執(zhí)行,宏指令調(diào)用由宏匯編程序
27、MASM中宏處理程序來(lái)識(shí)別。 過(guò)程調(diào)用時(shí),每調(diào)用一次都要保留程序的斷點(diǎn)和保護(hù)現(xiàn)場(chǎng),返回時(shí)要恢復(fù)現(xiàn)場(chǎng)和恢復(fù)斷點(diǎn),增加了操作時(shí)間,執(zhí)行速度慢。而宏指令調(diào)用時(shí),不需要這些入棧及出棧操作,執(zhí)行速度較快。 過(guò)程調(diào)用的子程序與主程序分開獨(dú)立存在,經(jīng)匯編后在存儲(chǔ)器中只占有一個(gè)子程序段的空間,主程序轉(zhuǎn)入此處運(yùn)行,因此目標(biāo)代碼長(zhǎng)度短,節(jié)省內(nèi)存空間。而宏調(diào)用是在匯編過(guò)程中展開,宏調(diào)用多少次,就插入多少次,因此目標(biāo)代碼長(zhǎng)度大,占內(nèi)存空間多; 一個(gè)子程序設(shè)計(jì),一般完成某一個(gè)功能,多次調(diào)用完成相同操作,僅入口參數(shù)可以改變,而宏指令可以帶啞元,調(diào)用時(shí)可以用實(shí)元取代,使不同的調(diào)用完成不同的操作,增加使用的靈活性,a,47,
28、5.6.2 重復(fù)匯編 重復(fù)匯編偽指令語(yǔ)句有以下三種: 1定重復(fù) 格式: REPT表達(dá)式 宏體 ENDM 其中,REPTENDM:偽指令助記符,必須成對(duì)出現(xiàn),不可省略。宏體:表示需要重復(fù)的語(yǔ)句序列。表達(dá)式:表示重復(fù)次數(shù),a,48,例5.16:將2、4、8、16、32分配給連續(xù)的5個(gè)存儲(chǔ)單元。 NUM=1 REPT 5 NUM=NUM*2 DB NUM ENDM 匯編后:DB 2 DB 4 DB 8 DB 16 DB 32,a,49,2不定重復(fù) 格式: IRP形參,實(shí)參表 宏體 ENDM 其中,IRPENDM:偽指令助記符,必須成對(duì)出現(xiàn),不可省略。宏體:要重復(fù)的語(yǔ)句序列,重復(fù)次數(shù)由參數(shù)個(gè)數(shù)決定。實(shí)
29、數(shù)表中是每次重復(fù)時(shí)將要取的實(shí)參,實(shí)參之間用逗號(hào)隔開,實(shí)參表用尖括號(hào)括起來(lái)。每次重復(fù),依次取實(shí)參表中一項(xiàng),代入語(yǔ)句序列中啞元。前面將2、4、8、16、32分配給連續(xù)的5個(gè)存儲(chǔ)單元的例子也可以用如下不定重復(fù)偽指令: IRPNUM,2,4,8,16,32 DBNUM ENDM,a,50,例5.17:若要把AX,BX,CX,DX的內(nèi)容壓入堆棧,則可以用如下不定重復(fù)偽指令: IRPREG,AX,BX,CX,DX PUSHREG ENDM 匯編后展開為以下四條指令: PUSHAX PUSHBX PUSHCX PUSHDX,a,51,3不定重復(fù)字符 格式為: IRPC形式參數(shù),字符串 宏體 ENDM 其中,
30、IRPC.ENDM:偽指令助記符,必須成對(duì)出現(xiàn),不可省略。宏體:重復(fù)執(zhí)行的語(yǔ)句序列,每次重復(fù)時(shí)依次用字符串中字符代替形式參數(shù),重復(fù)次數(shù)取決于字符串中字符的個(gè)數(shù)。字符串:可用尖括號(hào)也可不用尖括號(hào)括起來(lái),例5.18:若要從堆棧中彈出4個(gè)字,分別送入DX,CX,BX,AX,則可用如下不定重復(fù)字符偽指令: IRPCREG, POPREG&X ENDM,a,52,匯編后展開為以下四條指令: POPDX POPCX POPBX POPAX,5.6.3 條件匯編 條件匯編是對(duì)給定的條件進(jìn)行測(cè)試,匯編程序根據(jù)測(cè)試結(jié)果,將一段程序嵌入源程序匯編或不進(jìn)行匯編,它的一般格式為: IF表達(dá)式 指令體1;條件為真匯編指
31、令體1 ELSE指令體2;條件為假匯編指令體2 ENDIF,a,53,其中,IFENDIF:條件匯編偽指令助記符,必須成對(duì)出現(xiàn),不可省略。IF語(yǔ)句后的“”是指定的條件。如果“IF”指定的條件為真時(shí)則宏匯編程序?qū)⒅噶铙w1中的語(yǔ)句匯編成相應(yīng)的目標(biāo)代碼,否則就把指令體2中的語(yǔ)句匯編成相應(yīng)的目標(biāo)代碼。 ELSE:是任選部分,如果沒有ELSE,那么“IF”指定的條件滿足就匯編,否則就不匯編。 “IF”條件匯編的形式見表5.1所示,a,54,例5.20:利用條件匯編偽指令,可以根據(jù)不同情況,產(chǎn)生無(wú)條件轉(zhuǎn)移指令如JMP,或產(chǎn)生條件轉(zhuǎn)移指令如JE、JNE、JB、JNB等。 宏定義: GOTOMACROLOP,
32、X,REL,Y IFBREL JMPLOP ELSE MOVAL,X CMPAL,Y J&RELLOP ENDIF ENDM,a,55,宏調(diào)用: GOTOLOP1,VAR1,E,VAR2 GOTOEXIT1 宏展開: MOVAL,VAR1 CMPAL,VAR2 JELOP1 JMPEXIT1,a,56,5.7 DOS功能子程序的調(diào)用 為了了解程序運(yùn)行過(guò)程中的情況,應(yīng)設(shè)法將運(yùn)算結(jié)果顯示到顯示器上,最簡(jiǎn)單的方法就是調(diào)用操作系統(tǒng)的I/O子程序,我們稱為DOS功能調(diào)用。DOS為程序設(shè)計(jì)人員提供了許多可直接調(diào)用的功能子程序。調(diào)用時(shí)需要使用軟中斷指令: INT n 其中:n為中斷調(diào)用類型號(hào),其值為00FF
33、H。在使用INT指令前,應(yīng)將調(diào)用的功能號(hào)送入AH,有關(guān)入口參量送入指定寄存器中。若有出口參量,中斷調(diào)用返回后,結(jié)果在指定的寄存器或存儲(chǔ)單元中。DOS功能子程序的調(diào)用使用軟中斷指令“INT 21H”。DOS共有84個(gè)功能子程序。這些子程序的主要功能是:磁盤的讀寫控制、文件操作、目錄操作、內(nèi)存管理、基本輸入輸出管理及設(shè)置/讀出系統(tǒng)日期、時(shí)間等,a,57,下面例舉部分常用的DOS功能子程序。 1帶顯示的鍵盤輸入(1號(hào)功能) 該功能子程序等待鍵盤輸入,直接按下一個(gè)鍵(即輸入一個(gè)字符),把字符的ASCII碼送入AL,并在屏幕上顯示該字符。如果按下的鍵是Ctrl-C組合鍵,則停止程序運(yùn)行。如果按下TAB制
34、表鍵,屏幕上光標(biāo)自動(dòng)擴(kuò)展到緊接著的8個(gè)字符位置后面。1號(hào)功能調(diào)用,毋需入口參量,出口參量在AL中。如: MOVAH,01H INT21H,a,58,2不帶顯示的鍵盤輸入(7號(hào)功能) 與1號(hào)功能類似,它僅等待鍵盤輸入一個(gè)字符,并將字符的ASCII碼送入AL中。但按下Ctrl-C組合鍵和TAB制表鍵無(wú)反應(yīng)。調(diào)用方法如下: MOVAH,7 INT21H 緩沖區(qū)第一個(gè)字節(jié)存放它能保存的最大字符數(shù)(1255,不能為0?。?,該值由用戶程序自己事先設(shè)置。如果鍵如的字符數(shù)比此數(shù)大,那就會(huì)發(fā)出“嘟嘟”聲,而且光標(biāo)不再向右移動(dòng),a,59,緩沖區(qū)第二個(gè)字節(jié)存放用戶本次調(diào)用時(shí)實(shí)際輸入的字符數(shù)(回車鍵除外),這個(gè)數(shù)由D
35、OS返回時(shí)自動(dòng)填入。用戶從鍵盤輸入的字符從第三個(gè)字節(jié)開始存放,直到用戶輸入回車鍵為止,并將回車鍵碼(0DH)加在剛才輸入字符串的末尾上。 調(diào)用時(shí),用DS:DX寄存器指向輸入緩沖區(qū)的段基值:偏移量。例如在數(shù)據(jù)區(qū)定義的字符緩沖區(qū)如下: MAXLENDB18 ACTLENDB? STRINGDB18DUP(0,a,60,則輸入串的指令如下: MOVAX,SEGMAXLEN MOVDS,AX MOVDX,OFFSETMAXLEN MOVAH,0AH INT21H 5字符顯示(2號(hào)功能) 本功能子程序僅在屏幕上顯示單個(gè)字符。要顯示字符的ASCII碼存放在DL中。如果DL中存放退格鍵編碼,在屏幕上便向左移一個(gè)字符位置,并使該位置成為空格。移動(dòng)后光標(biāo)停留在那里。如要顯示字符A,可用下列幾條指令調(diào)用: MOVDL,A MOVAH,2 INT21H,a,61,6字符打?。?號(hào)功能) 5號(hào)功能子程序把DL中的字符(ASCII碼)送入打印機(jī)接口,打印輸出。功能調(diào)用為: MOVDL,A MOVAH,5 INT21H 7字符串顯示(9號(hào)功能) 9號(hào)功能子程序能在屏幕上顯示多于一個(gè)的字符串。要顯示的字符串必須先放在內(nèi)存一數(shù)據(jù)區(qū)中,且字符串以美元符號(hào)作為結(jié)束標(biāo)志。非顯示字符,可以
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 利用主題班會(huì)增強(qiáng)班級(jí)凝聚力計(jì)劃
- 酒店員工薪酬管理總結(jié)
- 紡織行業(yè)生產(chǎn)作業(yè)安全總結(jié)
- 七年級(jí)生物下冊(cè) 1.1人類的起源和發(fā)展 人教新課標(biāo)版課件
- 2025年全球及中國(guó)智慧康養(yǎng)平臺(tái)行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球魚塘凈水器行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球插畫設(shè)計(jì)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球繩狀海藻酸鹽敷料行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)后裝載機(jī)卡車行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)翻新SSD和HDD行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 《系統(tǒng)解剖學(xué)》期末考試復(fù)習(xí)題庫(kù)大全-下(多選題匯總)
- 廈門弘愛醫(yī)院硼中子俘獲治療系統(tǒng)項(xiàng)目環(huán)境影響報(bào)告
- 《中國(guó)高考評(píng)價(jià)體系》解讀(化學(xué)學(xué)科)
- 企業(yè)人員測(cè)評(píng)理論與方法
- 你好法語(yǔ)第七課課件
- 圖形創(chuàng)意(高職藝術(shù)設(shè)計(jì)類)PPT完整全套教學(xué)課件
- 環(huán)境空氣顆粒物(PM10、PM2.5)自動(dòng)監(jiān)測(cè)手工比對(duì)核查技術(shù)規(guī)范
- 水上水下作業(yè)應(yīng)急預(yù)案
- Jane-Eyre簡(jiǎn)愛英文課件
- (小學(xué))人教版一年級(jí)下冊(cè)數(shù)學(xué)《認(rèn)識(shí)鐘表》課件
- 2022年?duì)I口市大學(xué)生專考專招考試真題及答案
評(píng)論
0/150
提交評(píng)論