匯編語言流程圖.ppt
《匯編語言流程圖.ppt》由會員分享,可在線閱讀,更多相關《匯編語言流程圖.ppt(67頁珍藏版)》請在裝配圖網(wǎng)上搜索。
5.1 匯編語言源程序的框架結(jié)構(gòu) 編制匯編語言源程序時,首先要使用段定義偽指令和段尋址偽指令來構(gòu)造一個由若干指令和數(shù)據(jù)組成的程序。構(gòu)造一個源程序的框架結(jié)構(gòu)有如下兩種格式: 第一種格式: …… MOV AH,4CH ;返回DOS INT 21H CODE ENDS END BEGIN,第5章 8086/8088匯編語言程序設計,第二種格式: …… RET ;取程序段前綴首地址 MAIN ENDP CODE ENDS END BEGIN 區(qū)別:兩種格式的本質(zhì)區(qū)別在于返回DOS的方法不同: 對于第一種格式,采用了調(diào)用DOS系統(tǒng)的4CH功能,返回DOS。具體方法是:在要返回DOS處,安排如下兩條指令: MOV AH,4CH INT 21H 對于第二格式,DOS返回方法是調(diào)用20H類型的中斷服務程序。,5.2 順序結(jié)構(gòu)程序設計 順序程序結(jié)構(gòu)是指完全按照順序逐條執(zhí)行的指令序列,這種結(jié)構(gòu)的流程圖除了有一個開始框和結(jié)束框外,就是若干處理框,沒有判斷框,如圖5.1所示。 圖5.1 順序程序的結(jié)構(gòu)形式,,例5.1:試分別用匯編語言源程序的兩種框架結(jié)構(gòu)編制程序,求出表達式:(X4-Y)/2的值,并保存到RESULT存儲單元中,其中X,Y均為字節(jié)變量。,解:完成該功能的流程圖如圖5.2所示: 圖5.2 例5.1的功能實現(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為遠返回 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)程序設計 分支程序結(jié)構(gòu)可以有兩種形式,如圖5.4所示,它們分別相當于高級語言程序中的IF-THEN-ELSE語句和CASE語句,它們適用于要根據(jù)不同條件做不同處理的情況。,,5.3.1 用比較/測試的方法實現(xiàn)IF-THEN-ELSE結(jié)構(gòu) 實現(xiàn)方法:在產(chǎn)生分支之前,通常用比較、測試的辦法在標志寄存器中設置相應的標志位,然后再選用適當?shù)臈l件轉(zhuǎn)移指令,以實現(xiàn)不同情況的分支轉(zhuǎn)移。 (1)進行比較,使用比較指令: CMP DEST,SRC 該指令進行減法操作,而不保存結(jié)果,只設置標志位。 (2)進行測試,使用測試指令 TEST DEST,SRC 該指令進行邏輯與操作,而不保存結(jié)果,只設置標志位。,5.3.2 用地址表法實現(xiàn)CASE結(jié)構(gòu)(即多路分支) 用地址表法實現(xiàn)CASE結(jié)構(gòu)的基本思路是:將各分支程序的入口地址依次羅列形成一個地址表,讓BX指向地址表的首地址,從鍵盤接收或其他方式獲取要轉(zhuǎn)到的分支號,再讓BX與分支號進行運算,使BX指向?qū)种肟诘刂?,最后即可使用JMP WORD PTR [BX] 或JMP DWORD PTR [BX] 指令實現(xiàn)所要轉(zhuǎn)到的分支;程序設計流程圖如圖5.6所示:,,圖5.6 用地址表法實現(xiàn)多路分支的結(jié)構(gòu)框圖,例5.4:編程實現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情。,解:假設有3路分支,在地址表中的入口地址分別:A0、A1、A2;具體見圖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號DOS功能調(diào)用,接收分支號 INT 21H CMP AL,0 ;進行合法判斷 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)移表法實現(xiàn)CASE結(jié)構(gòu)(即多路分支) 用轉(zhuǎn)移表法實現(xiàn)CASE結(jié)構(gòu)的基本思路:將轉(zhuǎn)到各分支程序的轉(zhuǎn)移指令依次羅列形成一個轉(zhuǎn)移表,讓BX指向轉(zhuǎn)移表的首地址,從鍵盤接收或其他方式獲取要轉(zhuǎn)到的分支號,再讓BX與分支號進行運算,使BX指向?qū)D(zhuǎn)移表中轉(zhuǎn)到該分支的轉(zhuǎn)移指令處,最后即可使用JMP BX指令實現(xiàn)所要轉(zhuǎn)到的分支;具體見圖5.8所示:,,圖5.8 用轉(zhuǎn)移表法實現(xiàn)多路分支的結(jié)構(gòu)框圖 例5.5:編程實現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情。 解:假設有3路分支,轉(zhuǎn)移表中的轉(zhuǎn)移指令分別為:JMP SHORT A0、JMP SHORT A1、JMP SHORT A2;具體見圖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號DOS功能調(dià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,遠轉(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)程序設計 5.4.1 循環(huán)程序的組成 1.設置循環(huán)的初始狀態(tài) 如置循環(huán)次數(shù)的計數(shù)值,以及為循環(huán)體正常工作的初始狀態(tài)等; 2.循環(huán)體 這是循環(huán)的工作主體,它由循環(huán)的工作部分及修改部分組成。3.循環(huán)控制部分 它是循環(huán)程序設計的關鍵,每一個循環(huán)程序必須選擇一個循環(huán)控制條件來控制循環(huán)的運行和結(jié)束,通常有兩種方法控制循環(huán):用計數(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)形式。具體見圖5.10所示: DO-WHILE結(jié)構(gòu)把對循環(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的可能,則應選擇DO-WHILE結(jié)構(gòu),否則用DO-UNTIL結(jié)構(gòu)。,,圖5.10 循環(huán)程序的結(jié)構(gòu)形式,5.4.3 循環(huán)控制的方法 1.用計數(shù)控制循環(huán) 這種方法直觀、方便,易于程序設計。只要在編制程序時,循環(huán)次數(shù)已知,就可以使用這種方法設計循環(huán)程序。然而更多的循環(huán)程序,在編制程序時并不能確切知道循環(huán)次數(shù),但是知道循環(huán)次數(shù)是前面運算或操作的結(jié)果或者被存放在某內(nèi)存單元中。,例5.6:試編制程序統(tǒng)計字節(jié)變量VAR中1的個數(shù),并將它存入COUNT單元中。,解:要測試出VAR中1的個數(shù)就應該逐位進行測試,可根據(jù)最低位是否為1來計數(shù),然后用移位的辦法把各位數(shù)逐次移到最低位去,共需要測試8次。程序流程如圖5.11所示:,,圖5.11 例5.6的功能實現(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 ;賦計數(shù)器初值,LL: TEST AL,1 ;測試AL的最低位 JZ LL1 ;最低位為0轉(zhuǎn)LL1 INC BL ;計數(shù)器加1 LL1: SHR AL,1 ;邏輯右移1位 LOOP LL ;循環(huán)控制 MOV COUNT,BL ;COUNT←計數(shù)器BL的值 MOV AH,4CH ;返回DOS INT 21H CODE ENDS END BEGIN,2.用條件控制循環(huán),例5.8:將正整數(shù)NUM插入到一個從小到大排列好順序的正整數(shù)字節(jié)數(shù)組序列中。,分析:假設該數(shù)組的首地址和末地址分別為ARRAY_HEAD、ARRAY_END,顯然在這里需要插入的是一個數(shù),所以不一定要掃描整個數(shù)組。同時為了插入這個數(shù)據(jù),必須要空出位置,即凡是比它大的數(shù)據(jù)都應該向地址增大的方向移動一個字節(jié),故應該從數(shù)組的尾部向頭部查找,可逐字節(jié)取出比較。值得注意的是,應該考慮正整數(shù)NUM大于或小于數(shù)組中的所有數(shù)的可能,即如果NUM大于數(shù)組中所有數(shù),則第一次比較就可以結(jié)束查找;如果NUM小于數(shù)組中所有數(shù),則必須及時結(jié)束查找,絕對不允許查找的范圍超出數(shù)組的首地址,當然可以把數(shù)組的首地址或循環(huán)次數(shù)作為結(jié)束查找的條件。根據(jù)上述分析,可以得出程序流程如圖5.13所示:,,圖5.13 例5.8的功能實現(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 子程序設計,5.5.1 子程序的構(gòu)造 前面我們學習了過程定義偽指令,我們也就是用它們來構(gòu)成的子程序,其格式為: 子程序名 PROC (NEAR/FAR) 保存信息 …… 恢復信息 RET 子程序名 ENDP,,5.5.2 子程序的調(diào)用與返回 子程序的正確執(zhí)行是由子程序的正確調(diào)用和返回保證的。IBM PC機的CALL和RET指令就分別完成了子程序的調(diào)用和返回功能。 1.調(diào)用指令:CALL 過程名 執(zhí)行CALL指令,首先保留斷點地址于堆棧中,然后轉(zhuǎn)移到目標單元,它對PSW無影響。 2.返回指令:RET 一個子程序執(zhí)行的最后一條指令必定是返回指令RET,用以返回到調(diào)用子程序的斷點處。但在位置上并不一定就是是最后一條指令。它的位置靈活,并不是必須要在最后。只是習慣上我們通常將它置于子程序的最后。,5.5.3 編制子程序的要求 1.子程序必須具有通用性 2.注意保存信息和恢復信息 要注意最先壓入堆棧的應該最后彈出來,值得注意的是:必須搞清楚那些寄存器是必須保存的,那些又是不必要或不應該保存的。一般來說,子程序中用到的寄存器是應該保存的,但是如果主程序和子程序之間使用寄存器傳遞參數(shù)的話,該寄存器則不一定需要保存,特別是用來向主程序回送結(jié)果(即出口參數(shù))的寄存器,則更不應該因保存和恢復該寄存器的內(nèi)容而破壞了應該向主程序傳送的信息。 3.選用適當?shù)姆椒ㄔ谧映绦蚝椭鞒绦蛑g的進行參數(shù)傳遞,這種主程序與子程序之間的信息傳送稱為參數(shù)傳遞,它可以有以下三種: ① 用寄存器傳遞參數(shù) 這是最常用的一種方式,通常在參量不多的時候使用這種方法。 ② 用地址表傳遞參數(shù) 通過地址表傳送參數(shù)的方法是在主程序中首先建立一個地址表,把要傳送給子程序的參數(shù)都存放在地址表中,然后把地址表的首地址通過寄存器傳送到子程序中去;最后子程序通過地址表取得所需參數(shù)。 ③ 用堆棧傳遞參數(shù) 這種方法是在主程序中把要傳送給子程序的參數(shù)先保存到堆棧中,然后子程序再從堆棧中取出參數(shù)以達到傳送參數(shù)的目的。,5.6 高級匯編語言技術 5.6.1 宏匯編 1.宏定義 宏在使用前必須先進行宏定義。宏定義格式為: 宏指令名 MACRO 形式參數(shù),形式參數(shù),… <宏體> ENDM 其中,宏指令名:宏定義的名字(即給宏體中程序段指定一個符號名),不可缺省,宏調(diào)用時要使用它,第一個符號必須是字母,其后可以是字母或數(shù)字,MACRO…ENDM:宏定義偽指令助記符,不可缺省。它們成對出現(xiàn),表示宏定義的開始和結(jié)束,ENDM前不帶宏指令名。 宏體:一段有獨立功能的程序代碼段。 形式參數(shù):又稱啞元,各個啞元之間用逗號隔開,可以缺省。,2.宏調(diào)用 經(jīng)宏定義后的宏指令可以在源程序中調(diào)用,宏調(diào)用格式為: 宏指令名 實參,實參… 宏調(diào)用只需要有宏指令名,若宏定義中有形參,那么宏調(diào)用時必須帶有實際參數(shù)來替代形參,實際參數(shù)的個數(shù),順序,類型與形參一一對應,各個實參之間用逗號分開。原則上實參的個數(shù)與形參的個數(shù)相等,但匯編程序不要求它們必須相等,若實參個數(shù)大于形參個數(shù),則多余的實參不予考慮,若實參個數(shù)小于形參個數(shù),則多余的形參作“空”處理。,3.宏展開 匯編程序在對源程序匯編時,對每個宏調(diào)用作宏展開,每條插入的宏體指令前帶上加號“+”。,例5.11:不帶參數(shù)的宏定義,用宏指令來實現(xiàn)回車換行。 宏定義: CRLF MACRO MOV DL,0DH ;回車 MOV AH,2 INT 21H MOV DL,0AH ;換行 MOV AH,2,INT 21H ENDM 宏調(diào)用:CRLF 宏展開:將下述程序段替換宏調(diào)用語句。 +MOV DL,0DH ;回車 +MOV AH,2 +INT 21H +MOV DL,0AH ;換行 +MOV AH,2 +INT 21H,4.宏調(diào)用中參數(shù)傳遞 宏定義中的參數(shù)可以有多個,實參可以是數(shù)字,寄存器或操作碼。宏定義還可用部分操作碼作參數(shù),但在宏定義中必須用“&”作分隔符,&是一個操作符,它在宏定義體中可作為啞元的前綴,宏展開時,可以把&前后兩個符號合并成一個符號。,例5.12:宏定義帶一個參數(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 宏展開1: MOV CL,4 ;AX中內(nèi)容算術左移4次 SAL AX,CL 宏展開2: MOV CL,8 ;AX中內(nèi)容算術左移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 宏展開: PUSH AX,PUSH BX AD1 R1,R2 ;此語句不占內(nèi)存 MOV BX,CX ;AD1宏定義展開 ADD AX,BX MOV DX,AX POP BX POP AX,6.取消宏定義語句 格式為:PURGE 宏指令名,宏指令名… PURGE:偽指令助記符,不可缺省,因為經(jīng)過定義的宏指令名,不允許重新定義,必須用PURGE語句將其取消后,才能重新定義,此語句一次可以取消多個宏指令名。,7.宏指令與子程序的區(qū)別 ⑴過程調(diào)用使用CALL語句,由CPU執(zhí)行,宏指令調(diào)用由宏匯編程序MASM中宏處理程序來識別。 ⑵過程調(diào)用時,每調(diào)用一次都要保留程序的斷點和保護現(xiàn)場,返回時要恢復現(xiàn)場和恢復斷點,增加了操作時間,執(zhí)行速度慢。而宏指令調(diào)用時,不需要這些入棧及出棧操作,執(zhí)行速度較快。 ⑶過程調(diào)用的子程序與主程序分開獨立存在,經(jīng)匯編后在存儲器中只占有一個子程序段的空間,主程序轉(zhuǎn)入此處運行,因此目標代碼長度短,節(jié)省內(nèi)存空間。而宏調(diào)用是在匯編過程中展開,宏調(diào)用多少次,就插入多少次,因此目標代碼長度大,占內(nèi)存空間多; ⑷一個子程序設計,一般完成某一個功能,多次調(diào)用完成相同操作,僅入口參數(shù)可以改變,而宏指令可以帶啞元,調(diào)用時可以用實元取代,使不同的調(diào)用完成不同的操作,增加使用的靈活性。,5.6.2 重復匯編 重復匯編偽指令語句有以下三種: 1.定重復 格式: REPT 表達式 宏體 ENDM 其中,REPT…ENDM:偽指令助記符,必須成對出現(xiàn),不可省略。宏體:表示需要重復的語句序列。表達式:表示重復次數(shù)。,例5.16:將2、4、8、16、32分配給連續(xù)的5個存儲單元。 NUM=1 REPT 5 NUM=NUM*2 DB NUM ENDM 匯編后: +DB 2 +DB 4 +DB 8 +DB 16 +DB 32,2.不定重復 格式: IRP 形參,<實參表> 宏體 ENDM 其中,IRP…ENDM:偽指令助記符,必須成對出現(xiàn),不可省略。宏體:要重復的語句序列,重復次數(shù)由參數(shù)個數(shù)決定。實數(shù)表中是每次重復時將要取的實參,實參之間用逗號隔開,實參表用尖括號<>括起來。每次重復,依次取實參表中一項,代入語句序列中啞元。前面將2、4、8、16、32分配給連續(xù)的5個存儲單元的例子也可以用如下不定重復偽指令: IRP NUM,<2,4,8,16,32> DB NUM ENDM,例5.17:若要把AX,BX,CX,DX的內(nèi)容壓入堆棧,則可以用如下不定重復偽指令: IRP REG,<AX,BX,CX,DX> PUSH REG ENDM 匯編后展開為以下四條指令: +PUSH AX +PUSH BX +PUSH CX +PUSH DX,3.不定重復字符 格式為: IRPC 形式參數(shù),字符串 宏體 ENDM 其中,IRPCENDM:偽指令助記符,必須成對出現(xiàn),不可省略。宏體:重復執(zhí)行的語句序列,每次重復時依次用字符串中字符代替形式參數(shù),重復次數(shù)取決于字符串中字符的個數(shù)。字符串:可用尖括號也可不用尖括號括起來。,例5.18:若要從堆棧中彈出4個字,分別送入DX,CX,BX,AX,則可用如下不定重復字符偽指令: IRPC REG, POP REG&X ENDM,匯編后展開為以下四條指令: +POP DX +POP CX +POP BX +POP AX,5.6.3 條件匯編 條件匯編是對給定的條件進行測試,匯編程序根據(jù)測試結(jié)果,將一段程序嵌入源程序匯編或不進行匯編,它的一般格式為: IF 表達式 指令體1 ;條件為真匯編指令體1 ELSE 指令體2 ;條件為假匯編指令體2 ENDIF,其中,IF…ENDIF:條件匯編偽指令助記符,必須成對出現(xiàn),不可省略。IF語句后的“”是指定的條件。如果“IF”指定的條件為真時則宏匯編程序?qū)⒅噶铙w1中的語句匯編成相應的目標代碼,否則就把指令體2中的語句匯編成相應的目標代碼。 ELSE:是任選部分,如果沒有ELSE,那么“IF”指定的條件滿足就匯編,否則就不匯編。 “IF”條件匯編的形式見表5.1所示:,例5.20:利用條件匯編偽指令,可以根據(jù)不同情況,產(chǎn)生無條件轉(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 …… 宏展開: …… +MOV AL,VAR1 +CMP AL,VAR2 +JE LOP1 …… +JMP EXIT1 ……,5.7 DOS功能子程序的調(diào)用 為了了解程序運行過程中的情況,應設法將運算結(jié)果顯示到顯示器上,最簡單的方法就是調(diào)用操作系統(tǒng)的I/O子程序,我們稱為DOS功能調(diào)用。DOS為程序設計人員提供了許多可直接調(diào)用的功能子程序。調(diào)用時需要使用軟中斷指令: INT n 其中:n為中斷調(diào)用類型號,其值為00~FFH。在使用INT指令前,應將調(diào)用的功能號送入AH,有關入口參量送入指定寄存器中。若有出口參量,中斷調(diào)用返回后,結(jié)果在指定的寄存器或存儲單元中。DOS功能子程序的調(diào)用使用軟中斷指令“INT 21H”。DOS共有84個功能子程序。這些子程序的主要功能是:磁盤的讀寫控制、文件操作、目錄操作、內(nèi)存管理、基本輸入輸出管理及設置/讀出系統(tǒng)日期、時間等。,下面例舉部分常用的DOS功能子程序。 1.帶顯示的鍵盤輸入(1號功能) 該功能子程序等待鍵盤輸入,直接按下一個鍵(即輸入一個字符),把字符的ASCII碼送入AL,并在屏幕上顯示該字符。如果按下的鍵是Ctrl-C組合鍵,則停止程序運行。如果按下TAB制表鍵,屏幕上光標自動擴展到緊接著的8個字符位置后面。1號功能調(diào)用,毋需入口參量,出口參量在AL中。如: MOV AH,01H INT 21H,2.不帶顯示的鍵盤輸入(7號功能) 與1號功能類似,它僅等待鍵盤輸入一個字符,并將字符的ASCII碼送入AL中。但按下Ctrl-C組合鍵和TAB制表鍵無反應。調(diào)用方法如下: MOV AH,7 INT 21H 緩沖區(qū)第一個字節(jié)存放它能保存的最大字符數(shù)(1~255,不能為‘0’?。撝涤捎脩舫绦蜃约菏孪仍O置。如果鍵如的字符數(shù)比此數(shù)大,那就會發(fā)出“嘟嘟”聲,而且光標不再向右移動。,緩沖區(qū)第二個字節(jié)存放用戶本次調(diào)用時實際輸入的字符數(shù)(回車鍵除外),這個數(shù)由DOS返回時自動填入。用戶從鍵盤輸入的字符從第三個字節(jié)開始存放,直到用戶輸入回車鍵為止,并將回車鍵碼(0DH)加在剛才輸入字符串的末尾上。 調(diào)用時,用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號功能) 本功能子程序僅在屏幕上顯示單個字符。要顯示字符的ASCII碼存放在DL中。如果DL中存放退格鍵編碼,在屏幕上便向左移一個字符位置,并使該位置成為空格。移動后光標停留在那里。如要顯示字符‘A’,可用下列幾條指令調(diào)用: MOV DL,‘A’ MOV AH,2 INT 21H,6.字符打?。?號功能) 5號功能子程序把DL中的字符(ASCII碼)送入打印機接口,打印輸出。功能調(diào)用為: MOV DL,‘A’ MOV AH,5 INT 21H 7.字符串顯示(9號功能) 9號功能子程序能在屏幕上顯示多于一個的字符串。要顯示的字符串必須先放在內(nèi)存一數(shù)據(jù)區(qū)中,且字符串以美元符號‘$’作為結(jié)束標志。非顯示字符,可以用它的ASCII碼插入字符串中間。進行9號功能調(diào)用時,先把待顯示的字符串首地址的段基值和偏移量分別存入DS和DX中。 在數(shù)據(jù)段中定義一個待顯示符號串如: STRING DB “THIS IS A PROGRAM”,0AH,0DH,“$”,則顯示該符號串的指令為: LEA DX,STRING MOV AH,9 INT 21H 8.取中斷向量(35H號功能) 35H號功能把由AL指定的中斷類型號的中斷向量從中斷向量表中取到ES:BX中。即必須把要取出的中斷類型號N送給AL,調(diào)用35H功能后,與中斷類型號N對應的中斷向量則保存在ES:BX中。其調(diào)用示例如下: MOV AL,N MOV AH,35H INT 21H,9.設置中斷向量(25H號功能) 25H號功能把由AL指定的中斷類型的中斷向量DS:DX放置在中斷向量表中。具體設置過程為:首先將要設置的中斷類型號送AL,然后把要設置的中斷服務程序的段地址和偏移量分別送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,恢復原中斷向量 POP DX MOV AL,N MOV AH,25H INT 21H MOV AH,4CH ;返回DOS INT 21H INTERRUPT: …… ;中斷服務程序 IRET ……,10.讀出系統(tǒng)日期(2AH號功能) 本功能子程序的執(zhí)行,將系統(tǒng)的年、月、日、星期的數(shù)據(jù)讀出,并存入指定的寄存器中: CX ← 年(1980~2099) DH ← 月(1~12) DL ← 日(1~31) AL ← 星期(0—星期日,1—星期一等) 11.設置系統(tǒng)日期(2BH功能) 調(diào)用本功能子程序時,必須在CX和DX中設置有效日期,其中,CX中存放年號(1980~2099),DH中存放月號(1~12),DL中存放日(1~31)。如果日期設置有效,待功能子程序返回時,(AL)=0,否則(AL)=0FFH。所以為了檢查設置是否成功,通常在調(diào)用2BH號功能后檢查AL中內(nèi)容。,12.讀出系統(tǒng)時間(2CH功能) 本功能子程序從系統(tǒng)中可得到當時的時間:時、分、秒和百分秒,它們分別存放在CX和DX寄存器中: CH ← 小時 (0~23) CL ← 分 (0~59) DH ← 秒 (0~59) DL ← 百分秒(0~99) 13.設置系統(tǒng)時間(2DH功能) 調(diào)用本功能子程序時,必須在CX和DX中設置有效時間(指定有關寄存器和數(shù)據(jù)范圍與2C號功能相同)。如果設置時間有效,從功能子程序返回時,(AL)=0,否則(AL)=0FFH。,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關 鍵 詞:
- 匯編語言 流程圖
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權(quán),請勿作他用。
鏈接地址:http://www.820124.com/p-2820949.html