匯編語(yǔ)言流程圖.ppt
《匯編語(yǔ)言流程圖.ppt》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《匯編語(yǔ)言流程圖.ppt(67頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
5.1 匯編語(yǔ)言源程序的框架結(jié)構(gòu) 編制匯編語(yǔ)言源程序時(shí),首先要使用段定義偽指令和段尋址偽指令來(lái)構(gòu)造一個(gè)由若干指令和數(shù)據(jù)組成的程序。構(gòu)造一個(gè)源程序的框架結(jié)構(gòu)有如下兩種格式: 第一種格式: …… MOV AH,4CH ;返回DOS INT 21H CODE ENDS END BEGIN,第5章 8086/8088匯編語(yǔ)言程序設(shè)計(jì),第二種格式: …… RET ;取程序段前綴首地址 MAIN ENDP CODE ENDS END BEGIN 區(qū)別:兩種格式的本質(zhì)區(qū)別在于返回DOS的方法不同: 對(duì)于第一種格式,采用了調(diào)用DOS系統(tǒng)的4CH功能,返回DOS。具體方法是:在要返回DOS處,安排如下兩條指令: MOV AH,4CH INT 21H 對(duì)于第二格式,DOS返回方法是調(diào)用20H類(lèi)型的中斷服務(wù)程序。,5.2 順序結(jié)構(gòu)程序設(shè)計(jì) 順序程序結(jié)構(gòu)是指完全按照順序逐條執(zhí)行的指令序列,這種結(jié)構(gòu)的流程圖除了有一個(gè)開(kāi)始框和結(jié)束框外,就是若干處理框,沒(méi)有判斷框,如圖5.1所示。 圖5.1 順序程序的結(jié)構(gòu)形式,,例5.1:試分別用匯編語(yǔ)言源程序的兩種框架結(jié)構(gòu)編制程序,求出表達(dá)式:(X4-Y)/2的值,并保存到RESULT存儲(chǔ)單元中,其中X,Y均為字節(jié)變量。,解:完成該功能的流程圖如圖5.2所示: 圖5.2 例5.1的功能實(shí)現(xiàn)流程圖,,參考程序1: DATA SEGMENT ;數(shù)據(jù)段 X DB 2 Y DB 4 Z DB ? ;定義變量 DATA ENDS STACK SEGMENT PARA STACK DW 20H DUP(0) STACK ENDS CODE SEGMENT ;代碼段 ASSUME CS:CODE,DS:DATA,SS:STACK,BEGIN: MOV AX,DATA MOV DS,AX ;DS賦初值 MOV AL,X ;AL←X MOV CL,2 SAL AL,CL ;AL←X4 SUB AL,Y ;AL←X4-Y SAR AL,1 ;AL←(X4-Y)/2 MOV Z,AL ;存結(jié)果 MOV AH,4CH ;返回DOS INT 21H CODE ENDS END BEGIN,參考程序2: DATA SEGMENT X DB 2 Y DB 4 Z DB ? DATA ENDS STACK SEGMENT PARA STACK DW 20H DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK PROC1 PROC FAR ;使RET為遠(yuǎn)返回 END BEGIN,BEGIN: PUSH DS ;入棧保存地址 MOV AX,0 ;程序段前綴的首地址 PUSH AX MOV AX,DATA MOV DS,AX MOV AL,X ;AL←X MOV CL,2 SAL AL,CL ;AL←X4 SUB AL,Y ;AL←X4-Y SAR AL,1 ;AL←(X4-Y)/2 MOV Z,AL ;存結(jié)果 RET ;取程序段前綴首地址,PROC1 ENDP CODE ENDS,5.3 分支結(jié)構(gòu)程序設(shè)計(jì) 分支程序結(jié)構(gòu)可以有兩種形式,如圖5.4所示,它們分別相當(dāng)于高級(jí)語(yǔ)言程序中的IF-THEN-ELSE語(yǔ)句和CASE語(yǔ)句,它們適用于要根據(jù)不同條件做不同處理的情況。,,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)行比較,使用比較指令: CMP DEST,SRC 該指令進(jìn)行減法操作,而不保存結(jié)果,只設(shè)置標(biāo)志位。 (2)進(jìn)行測(cè)試,使用測(cè)試指令 TEST DEST,SRC 該指令進(jìn)行邏輯與操作,而不保存結(jié)果,只設(shè)置標(biāo)志位。,5.3.2 用地址表法實(shí)現(xiàn)CASE結(jié)構(gòu)(即多路分支) 用地址表法實(shí)現(xiàn)CASE結(jié)構(gòu)的基本思路是:將各分支程序的入口地址依次羅列形成一個(gè)地址表,讓BX指向地址表的首地址,從鍵盤(pán)接收或其他方式獲取要轉(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所示:,,圖5.6 用地址表法實(shí)現(xiàn)多路分支的結(jié)構(gòu)框圖,例5.4:編程實(shí)現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情。,解:假設(shè)有3路分支,在地址表中的入口地址分別:A0、A1、A2;具體見(jiàn)圖5.7所示:,,參考程序: DATA SEGMENT MENU DB 0DH,0AH,“0:Chinese!“ DB 0DH,0AH,“1:English!“ DB 0DH,0AH,“2: German!“ DB 0DH,0AH,“Please choose one to answer the following question:$“ ER DB 0DH,0AH,“I am sorry,you choose the mistake!$“,S0 DB 0DH,0AH,“OK,Please answer in Chinese!$“ S1 DB 0DH,0AH,“OK,Please answer in English!$“ S2 DB 0DH,0AH,“OK,Please answer in German!$“ TAB DW A0,A1,A2 ;地址表 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,MENU ;顯示菜單 MOV AH,9 INT 21H,MOV AH,1 ;1號(hào)DOS功能調(diào)用,接收分支號(hào) INT 21H CMP AL,0 ;進(jìn)行合法判斷 JB ERROR CMP AL,2 JA ERROR LEA BX,TAB ;取地址表首址 SUB AL,30H SHL AL,1 ;段內(nèi)轉(zhuǎn)移乘以2,段間轉(zhuǎn)移乘以4 XOR AH,AH ;AH清零 ADD BX,AX JMP WORD PTR [BX] ;產(chǎn)生多分支轉(zhuǎn)移,A0: LEA DX,S0 ;各分支程序段 MOV AH,9 INT 21H JMP EXIT1 A1: LEA DX,S1 MOV AH,9 INT 21H JMP EXIT1 A2: LEA DX,S2 MOV AH,9 INT 21H JMP EXIT1,ERROR: MOV DX,OFFSET ER MOV AH,9 INT 21H EXIT1: MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,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)移指令依次羅列形成一個(gè)轉(zhuǎn)移表,讓BX指向轉(zhuǎn)移表的首地址,從鍵盤(pá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)到的分支;具體見(jiàn)圖5.8所示:,,圖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;具體見(jiàn)圖5.9所示:,,參考程序: DATA SEGMENT MENU DB 0DH,0AH,“0:Chinese!“ DB 0DH,0AH,“1:English!“ DB 0DH,0AH,“2: German!“ DB 0DH,0AH,“Please choose one to answer the following question:$“,ER DB 0DH,0AH,“I am sorry,you shoose the mistake!$“ S0 DB 0DH,0AH,“OK,Please answer in Chinese!$“ S1 DB 0DH,0AH,“OK,Please answer in English!$“ S2 DB 0DH,0AH,“OK,Please answer in German!$“ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,MENU ;顯示菜單 MOV AH,9 INT 21H,MOV AH,1 ;1號(hào)DOS功能調(diào)用,接收分支號(hào) INT 21H CMP AL,0 JB ERROR CMP AL,2 JA ERROR LEA BX,TAB ;取地址表首址 SUB AL,30H SHL AL,1 ;短轉(zhuǎn)移乘以2,近轉(zhuǎn)移乘以3,遠(yuǎn)轉(zhuǎn)移乘以5 XOR AH,AH ;AH清零 ADD BX,AX,JMP BX ;產(chǎn)生多分支轉(zhuǎn)移 TAB: JMP SHORT A0 ;轉(zhuǎn)移表 JMP SHORT A1 JMP SHORT A2 A0: LEA DX,S0 ;各分支程序段 MOV AH,9 INT 21H JMP EXIT1 A1: LEA DX,S1 MOV AH,9 INT 21H,JMP EXIT1 A2:LEA DX,S2 MOV AH,9 INT 21H JMP EXIT1 ERROR: MOV DX,OFFSET ER MOV AH,9 INT 21H EXIT1: MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,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)控制部分 它是循環(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),5.4.2 循環(huán)程序的結(jié)構(gòu)形式 循環(huán)程序有兩種結(jié)構(gòu),一種是DO-WHILE結(jié)構(gòu)形式,另一種是DO-UNTIL結(jié)構(gòu)形式。具體見(jiàn)圖5.10所示: DO-WHILE結(jié)構(gòu)把對(duì)循環(huán)控制條件的判斷放在循環(huán)的入口,先判斷條件,滿(mǎn)足條件就執(zhí)行循環(huán)體,否則退出循環(huán)。 DO-UNTIL結(jié)構(gòu)是先執(zhí)行循環(huán)體然后再判斷控制條件,不滿(mǎn)足條件則繼續(xù)執(zhí)行循環(huán)操作,一旦滿(mǎn)足條件則退出循環(huán)。一般講,如果循環(huán)次數(shù)等于0的可能,則應(yīng)選擇DO-WHILE結(jié)構(gòu),否則用DO-UNTIL結(jié)構(gòu)。,,圖5.10 循環(huán)程序的結(jié)構(gòu)形式,5.4.3 循環(huán)控制的方法 1.用計(jì)數(shù)控制循環(huán) 這種方法直觀(guā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所示:,,圖5.11 例5.6的功能實(shí)現(xiàn)流程圖,參考程序: DATA SEGMENT VAR DB 37H COUNT DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BEGIN: MOV AX,DATA MOV DS,AX MOV AL,VAR ;AL←VAR的值 MOV CX,8 ;賦循環(huán)初值 XOR BL,BL ;賦計(jì)數(shù)器初值,LL: TEST AL,1 ;測(cè)試AL的最低位 JZ LL1 ;最低位為0轉(zhuǎn)LL1 INC BL ;計(jì)數(shù)器加1 LL1: SHR AL,1 ;邏輯右移1位 LOOP LL ;循環(huán)控制 MOV COUNT,BL ;COUNT←計(jì)數(shù)器BL的值 MOV AH,4CH ;返回DOS INT 21H CODE ENDS END BEGIN,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ì)不允許查找的范圍超出數(shù)組的首地址,當(dāng)然可以把數(shù)組的首地址或循環(huán)次數(shù)作為結(jié)束查找的條件。根據(jù)上述分析,可以得出程序流程如圖5.13所示:,,圖5.13 例5.8的功能實(shí)現(xiàn)流程圖,參考程序: NUM EQU 36H DATA SEGMENT ARRAY DB 12H,24H,48H,60H,72H,84H Y DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BEGIN: MOV AX,DATA MOV DS,AX MOV CX,Y-ARRAY ;循環(huán)次數(shù)初始化 MOV AL,NUM ;插入值送AL,LEA SI,Y DEC SI ;取得ARRAY的最后元素的偏移地址 LOP: CMP ARRAY[SI],AL ;比較 JLE INSERT MOV AH,ARRAY[SI] MOV ARRAY[SI+1],AH ;數(shù)據(jù)交換 DEC SI ;修改偏移地址 LOOP LOP INSERT: MOV ARRAY[SI+1],AL ;插入數(shù)據(jù) MOV AH,4CH,INT 21H CODE ENDS END BEGIN,5.5 子程序設(shè)計(jì),5.5.1 子程序的構(gòu)造 前面我們學(xué)習(xí)了過(guò)程定義偽指令,我們也就是用它們來(lái)構(gòu)成的子程序,其格式為: 子程序名 PROC (NEAR/FAR) 保存信息 …… 恢復(fù)信息 RET 子程序名 ENDP,,5.5.2 子程序的調(diào)用與返回 子程序的正確執(zhí)行是由子程序的正確調(diào)用和返回保證的。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í)慣上我們通常將它置于子程序的最后。,5.5.3 編制子程序的要求 1.子程序必須具有通用性 2.注意保存信息和恢復(fù)信息 要注意最先壓入堆棧的應(yīng)該最后彈出來(lái),值得注意的是:必須搞清楚那些寄存器是必須保存的,那些又是不必要或不應(yīng)該保存的。一般來(lái)說(shuō),子程序中用到的寄存器是應(yīng)該保存的,但是如果主程序和子程序之間使用寄存器傳遞參數(shù)的話(huà),該寄存器則不一定需要保存,特別是用來(lái)向主程序回送結(jié)果(即出口參數(shù))的寄存器,則更不應(yīng)該因保存和恢復(fù)該寄存器的內(nèi)容而破壞了應(yīng)該向主程序傳送的信息。 3.選用適當(dāng)?shù)姆椒ㄔ谧映绦蚝椭鞒绦蛑g的進(jìn)行參數(shù)傳遞,這種主程序與子程序之間的信息傳送稱(chēng)為參數(shù)傳遞,它可以有以下三種: ① 用寄存器傳遞參數(shù) 這是最常用的一種方式,通常在參量不多的時(shí)候使用這種方法。 ② 用地址表傳遞參數(shù) 通過(guò)地址表傳送參數(shù)的方法是在主程序中首先建立一個(gè)地址表,把要傳送給子程序的參數(shù)都存放在地址表中,然后把地址表的首地址通過(guò)寄存器傳送到子程序中去;最后子程序通過(guò)地址表取得所需參數(shù)。 ③ 用堆棧傳遞參數(shù) 這種方法是在主程序中把要傳送給子程序的參數(shù)先保存到堆棧中,然后子程序再?gòu)亩褩V腥〕鰠?shù)以達(dá)到傳送參數(shù)的目的。,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ù)字,MACRO…ENDM:宏定義偽指令助記符,不可缺省。它們成對(duì)出現(xiàn),表示宏定義的開(kāi)始和結(jié)束,ENDM前不帶宏指令名。 宏體:一段有獨(dú)立功能的程序代碼段。 形式參數(shù):又稱(chēng)啞元,各個(gè)啞元之間用逗號(hào)隔開(kāi),可以缺省。,2.宏調(diào)用 經(jīng)宏定義后的宏指令可以在源程序中調(diào)用,宏調(diào)用格式為: 宏指令名 實(shí)參,實(shí)參… 宏調(diào)用只需要有宏指令名,若宏定義中有形參,那么宏調(diào)用時(shí)必須帶有實(shí)際參數(shù)來(lái)替代形參,實(shí)際參數(shù)的個(gè)數(shù),順序,類(lèi)型與形參一一對(duì)應(yīng),各個(gè)實(shí)參之間用逗號(hào)分開(kāi)。原則上實(shí)參的個(gè)數(shù)與形參的個(gè)數(shù)相等,但匯編程序不要求它們必須相等,若實(shí)參個(gè)數(shù)大于形參個(gè)數(shù),則多余的實(shí)參不予考慮,若實(shí)參個(gè)數(shù)小于形參個(gè)數(shù),則多余的形參作“空”處理。,3.宏展開(kāi) 匯編程序在對(duì)源程序匯編時(shí),對(duì)每個(gè)宏調(diào)用作宏展開(kāi),每條插入的宏體指令前帶上加號(hào)“+”。,例5.11:不帶參數(shù)的宏定義,用宏指令來(lái)實(shí)現(xiàn)回車(chē)換行。 宏定義: CRLF MACRO MOV DL,0DH ;回車(chē) MOV AH,2 INT 21H MOV DL,0AH ;換行 MOV AH,2,INT 21H ENDM 宏調(diào)用:CRLF 宏展開(kāi):將下述程序段替換宏調(diào)用語(yǔ)句。 +MOV DL,0DH ;回車(chē) +MOV AH,2 +I(xiàn)NT 21H +MOV DL,0AH ;換行 +MOV AH,2 +I(xiàn)NT 21H,4.宏調(diào)用中參數(shù)傳遞 宏定義中的參數(shù)可以有多個(gè),實(shí)參可以是數(shù)字,寄存器或操作碼。宏定義還可用部分操作碼作參數(shù),但在宏定義中必須用“&”作分隔符,&是一個(gè)操作符,它在宏定義體中可作為啞元的前綴,宏展開(kāi)時(shí),可以把&前后兩個(gè)符號(hào)合并成一個(gè)符號(hào)。,例5.12:宏定義帶一個(gè)參數(shù),用宏指令實(shí)現(xiàn)將AX中內(nèi)容右移任意次(小于256)。,宏定義: SHIFT MACRO N MOV CL,N SAL AX,CL ENDM 宏調(diào)用1: SHIFT 4,宏調(diào)用2: SHIFT 8 宏展開(kāi)1: MOV CL,4 ;AX中內(nèi)容算術(shù)左移4次 SAL AX,CL 宏展開(kāi)2: MOV CL,8 ;AX中內(nèi)容算術(shù)左移8次 SAL AX,CL,5.宏定義嵌套 在宏定義中允許使用宏調(diào)用,但必須先定義后調(diào)用。,例5.14: 宏定義: AD1 MACRO M,N MOV BX,M,ADD AX,N ENDM AD1M MACRO R1,R2,R3 PUSH AX PUSH BX AD1 R1,R2 MOV X3,AX POP BX POP AX ENDM 宏調(diào)用: AD1M CX,BX,DX 宏展開(kāi): PUSH AX,PUSH BX AD1 R1,R2 ;此語(yǔ)句不占內(nèi)存 MOV BX,CX ;AD1宏定義展開(kāi) ADD AX,BX MOV DX,AX POP BX POP AX,6.取消宏定義語(yǔ)句 格式為:PURGE 宏指令名,宏指令名… PURGE:偽指令助記符,不可缺省,因?yàn)榻?jīng)過(guò)定義的宏指令名,不允許重新定義,必須用PURGE語(yǔ)句將其取消后,才能重新定義,此語(yǔ)句一次可以取消多個(gè)宏指令名。,7.宏指令與子程序的區(qū)別 ⑴過(guò)程調(diào)用使用CALL語(yǔ)句,由CPU執(zhí)行,宏指令調(diào)用由宏匯編程序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)用的子程序與主程序分開(kāi)獨(dú)立存在,經(jīng)匯編后在存儲(chǔ)器中只占有一個(gè)子程序段的空間,主程序轉(zhuǎn)入此處運(yùn)行,因此目標(biāo)代碼長(zhǎng)度短,節(jié)省內(nèi)存空間。而宏調(diào)用是在匯編過(guò)程中展開(kāi),宏調(diào)用多少次,就插入多少次,因此目標(biāo)代碼長(zhǎng)度大,占內(nèi)存空間多; ⑷一個(gè)子程序設(shè)計(jì),一般完成某一個(gè)功能,多次調(diào)用完成相同操作,僅入口參數(shù)可以改變,而宏指令可以帶啞元,調(diào)用時(shí)可以用實(shí)元取代,使不同的調(diào)用完成不同的操作,增加使用的靈活性。,5.6.2 重復(fù)匯編 重復(fù)匯編偽指令語(yǔ)句有以下三種: 1.定重復(fù) 格式: REPT 表達(dá)式 宏體 ENDM 其中,REPT…ENDM:偽指令助記符,必須成對(duì)出現(xiàn),不可省略。宏體:表示需要重復(fù)的語(yǔ)句序列。表達(dá)式:表示重復(fù)次數(shù)。,例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,2.不定重復(fù) 格式: IRP 形參,<實(shí)參表> 宏體 ENDM 其中,IRP…ENDM:偽指令助記符,必須成對(duì)出現(xiàn),不可省略。宏體:要重復(fù)的語(yǔ)句序列,重復(fù)次數(shù)由參數(shù)個(gè)數(shù)決定。實(shí)數(shù)表中是每次重復(fù)時(shí)將要取的實(shí)參,實(shí)參之間用逗號(hào)隔開(kāi),實(shí)參表用尖括號(hào)<>括起來(lái)。每次重復(fù),依次取實(shí)參表中一項(xiàng),代入語(yǔ)句序列中啞元。前面將2、4、8、16、32分配給連續(xù)的5個(gè)存儲(chǔ)單元的例子也可以用如下不定重復(fù)偽指令: IRP NUM,<2,4,8,16,32> DB NUM ENDM,例5.17:若要把AX,BX,CX,DX的內(nèi)容壓入堆棧,則可以用如下不定重復(fù)偽指令: IRP REG,<AX,BX,CX,DX> PUSH REG ENDM 匯編后展開(kāi)為以下四條指令: +PUSH AX +PUSH BX +PUSH CX +PUSH DX,3.不定重復(fù)字符 格式為: IRPC 形式參數(shù),字符串 宏體 ENDM 其中,IRPCENDM:偽指令助記符,必須成對(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ù)字符偽指令: IRPC REG, POP REG&X ENDM,匯編后展開(kāi)為以下四條指令: +POP DX +POP CX +POP BX +POP AX,5.6.3 條件匯編 條件匯編是對(duì)給定的條件進(jìn)行測(cè)試,匯編程序根據(jù)測(cè)試結(jié)果,將一段程序嵌入源程序匯編或不進(jìn)行匯編,它的一般格式為: IF 表達(dá)式 指令體1 ;條件為真匯編指令體1 ELSE 指令體2 ;條件為假匯編指令體2 ENDIF,其中,IF…ENDIF:條件匯編偽指令助記符,必須成對(duì)出現(xiàn),不可省略。IF語(yǔ)句后的“”是指定的條件。如果“IF”指定的條件為真時(shí)則宏匯編程序?qū)⒅噶铙w1中的語(yǔ)句匯編成相應(yīng)的目標(biāo)代碼,否則就把指令體2中的語(yǔ)句匯編成相應(yīng)的目標(biāo)代碼。 ELSE:是任選部分,如果沒(méi)有ELSE,那么“IF”指定的條件滿(mǎn)足就匯編,否則就不匯編。 “IF”條件匯編的形式見(jiàn)表5.1所示:,例5.20:利用條件匯編偽指令,可以根據(jù)不同情況,產(chǎn)生無(wú)條件轉(zhuǎn)移指令如JMP,或產(chǎn)生條件轉(zhuǎn)移指令如JE、JNE、JB、JNB等。 宏定義: GOTO MACRO LOP,X,REL,Y IFB <REL> JMP LOP ELSE MOV AL,X CMP AL,Y J&REL LOP ENDIF ENDM,宏調(diào)用: …… GOTO LOP1,VAR1,E,VAR2 …… GOTO EXIT1 …… 宏展開(kāi): …… +MOV AL,VAR1 +CMP AL,VAR2 +JE LOP1 …… +JMP EXIT1 ……,5.7 DOS功能子程序的調(diào)用 為了了解程序運(yùn)行過(guò)程中的情況,應(yīng)設(shè)法將運(yùn)算結(jié)果顯示到顯示器上,最簡(jiǎn)單的方法就是調(diào)用操作系統(tǒng)的I/O子程序,我們稱(chēng)為DOS功能調(diào)用。DOS為程序設(shè)計(jì)人員提供了許多可直接調(diào)用的功能子程序。調(diào)用時(shí)需要使用軟中斷指令: INT n 其中:n為中斷調(diào)用類(lèi)型號(hào),其值為00~FFH。在使用INT指令前,應(yīng)將調(diào)用的功能號(hào)送入AH,有關(guān)入口參量送入指定寄存器中。若有出口參量,中斷調(diào)用返回后,結(jié)果在指定的寄存器或存儲(chǔ)單元中。DOS功能子程序的調(diào)用使用軟中斷指令“INT 21H”。DOS共有84個(gè)功能子程序。這些子程序的主要功能是:磁盤(pán)的讀寫(xiě)控制、文件操作、目錄操作、內(nèi)存管理、基本輸入輸出管理及設(shè)置/讀出系統(tǒng)日期、時(shí)間等。,下面例舉部分常用的DOS功能子程序。 1.帶顯示的鍵盤(pán)輸入(1號(hào)功能) 該功能子程序等待鍵盤(pán)輸入,直接按下一個(gè)鍵(即輸入一個(gè)字符),把字符的ASCII碼送入AL,并在屏幕上顯示該字符。如果按下的鍵是Ctrl-C組合鍵,則停止程序運(yùn)行。如果按下TAB制表鍵,屏幕上光標(biāo)自動(dòng)擴(kuò)展到緊接著的8個(gè)字符位置后面。1號(hào)功能調(diào)用,毋需入口參量,出口參量在AL中。如: MOV AH,01H INT 21H,2.不帶顯示的鍵盤(pán)輸入(7號(hào)功能) 與1號(hào)功能類(lèi)似,它僅等待鍵盤(pán)輸入一個(gè)字符,并將字符的ASCII碼送入AL中。但按下Ctrl-C組合鍵和TAB制表鍵無(wú)反應(yīng)。調(diào)用方法如下: MOV AH,7 INT 21H 緩沖區(qū)第一個(gè)字節(jié)存放它能保存的最大字符數(shù)(1~255,不能為‘0’?。撝涤捎脩?hù)程序自己事先設(shè)置。如果鍵如的字符數(shù)比此數(shù)大,那就會(huì)發(fā)出“嘟嘟”聲,而且光標(biāo)不再向右移動(dòng)。,緩沖區(qū)第二個(gè)字節(jié)存放用戶(hù)本次調(diào)用時(shí)實(shí)際輸入的字符數(shù)(回車(chē)鍵除外),這個(gè)數(shù)由DOS返回時(shí)自動(dòng)填入。用戶(hù)從鍵盤(pán)輸入的字符從第三個(gè)字節(jié)開(kāi)始存放,直到用戶(hù)輸入回車(chē)鍵為止,并將回車(chē)鍵碼(0DH)加在剛才輸入字符串的末尾上。 調(diào)用時(shí),用DS:DX寄存器指向輸入緩沖區(qū)的段基值:偏移量。例如在數(shù)據(jù)區(qū)定義的字符緩沖區(qū)如下: MAX_LEN DB 18 ACT_LEN DB ? STRING DB 18 DUP(0),則輸入串的指令如下: MOV AX,SEG MAX_LEN MOV DS,AX MOV DX,OFFSET MAX_LEN MOV AH,0AH INT 21H 5.字符顯示(2號(hào)功能) 本功能子程序僅在屏幕上顯示單個(gè)字符。要顯示字符的ASCII碼存放在DL中。如果DL中存放退格鍵編碼,在屏幕上便向左移一個(gè)字符位置,并使該位置成為空格。移動(dòng)后光標(biāo)停留在那里。如要顯示字符‘A’,可用下列幾條指令調(diào)用: MOV DL,‘A’ MOV AH,2 INT 21H,6.字符打?。?號(hào)功能) 5號(hào)功能子程序把DL中的字符(ASCII碼)送入打印機(jī)接口,打印輸出。功能調(diào)用為: MOV DL,‘A’ MOV AH,5 INT 21H 7.字符串顯示(9號(hào)功能) 9號(hào)功能子程序能在屏幕上顯示多于一個(gè)的字符串。要顯示的字符串必須先放在內(nèi)存一數(shù)據(jù)區(qū)中,且字符串以美元符號(hào)‘$’作為結(jié)束標(biāo)志。非顯示字符,可以用它的ASCII碼插入字符串中間。進(jìn)行9號(hào)功能調(diào)用時(shí),先把待顯示的字符串首地址的段基值和偏移量分別存入DS和DX中。 在數(shù)據(jù)段中定義一個(gè)待顯示符號(hào)串如: STRING DB “THIS IS A PROGRAM”,0AH,0DH,“$”,則顯示該符號(hào)串的指令為: LEA DX,STRING MOV AH,9 INT 21H 8.取中斷向量(35H號(hào)功能) 35H號(hào)功能把由AL指定的中斷類(lèi)型號(hào)的中斷向量從中斷向量表中取到ES:BX中。即必須把要取出的中斷類(lèi)型號(hào)N送給AL,調(diào)用35H功能后,與中斷類(lèi)型號(hào)N對(duì)應(yīng)的中斷向量則保存在ES:BX中。其調(diào)用示例如下: MOV AL,N MOV AH,35H INT 21H,9.設(shè)置中斷向量(25H號(hào)功能) 25H號(hào)功能把由AL指定的中斷類(lèi)型的中斷向量DS:DX放置在中斷向量表中。具體設(shè)置過(guò)程為:首先將要設(shè)置的中斷類(lèi)型號(hào)送AL,然后把要設(shè)置的中斷服務(wù)程序的段地址和偏移量分別送DS、DX,最后再調(diào)用25H功能。典型的使用DOS功能調(diào)用存取中斷向量的程序段如下: …… MOV AL,N ;取出并保存原中斷向量 MOV AH,35H INT 21H PUSH BX,PUSH ES PUSH DS MOV AX,SEG INTERRUPT MOV DS,AX MOV DX,OFFSET INTERRUPT MOV AL,N MOV AH,25H INT 21H POP DS …… POP DS,恢復(fù)原中斷向量 POP DX MOV AL,N MOV AH,25H INT 21H MOV AH,4CH ;返回DOS INT 21H INTERRUPT: …… ;中斷服務(wù)程序 IRET ……,10.讀出系統(tǒng)日期(2AH號(hào)功能) 本功能子程序的執(zhí)行,將系統(tǒng)的年、月、日、星期的數(shù)據(jù)讀出,并存入指定的寄存器中: CX ← 年(1980~2099) DH ← 月(1~12) DL ← 日(1~31) AL ← 星期(0—星期日,1—星期一等) 11.設(shè)置系統(tǒng)日期(2BH功能) 調(diào)用本功能子程序時(shí),必須在CX和DX中設(shè)置有效日期,其中,CX中存放年號(hào)(1980~2099),DH中存放月號(hào)(1~12),DL中存放日(1~31)。如果日期設(shè)置有效,待功能子程序返回時(shí),(AL)=0,否則(AL)=0FFH。所以為了檢查設(shè)置是否成功,通常在調(diào)用2BH號(hào)功能后檢查AL中內(nèi)容。,12.讀出系統(tǒng)時(shí)間(2CH功能) 本功能子程序從系統(tǒng)中可得到當(dāng)時(shí)的時(shí)間:時(shí)、分、秒和百分秒,它們分別存放在CX和DX寄存器中: CH ← 小時(shí) (0~23) CL ← 分 (0~59) DH ← 秒 (0~59) DL ← 百分秒(0~99) 13.設(shè)置系統(tǒng)時(shí)間(2DH功能) 調(diào)用本功能子程序時(shí),必須在CX和DX中設(shè)置有效時(shí)間(指定有關(guān)寄存器和數(shù)據(jù)范圍與2C號(hào)功能相同)。如果設(shè)置時(shí)間有效,從功能子程序返回時(shí),(AL)=0,否則(AL)=0FFH。,- 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)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 匯編語(yǔ)言 流程圖
鏈接地址:http://www.hcyjhs8.com/p-2820949.html