匯編語言流程圖++_第1頁
匯編語言流程圖++_第2頁
匯編語言流程圖++_第3頁
匯編語言流程圖++_第4頁
匯編語言流程圖++_第5頁
已閱讀5頁,還剩62頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、5.1 匯編語言源程序的框架結構匯編語言源程序的框架結構 編制匯編語言源程序時,首先要使用段定義偽指令編制匯編語言源程序時,首先要使用段定義偽指令和段尋址偽指令來構造一個由若干指令和數(shù)據(jù)組成的和段尋址偽指令來構造一個由若干指令和數(shù)據(jù)組成的程序。構造一個源程序的框架結構有如下兩種格式:程序。構造一個源程序的框架結構有如下兩種格式:第一種格式:第一種格式:MOVAH,4CH ;返回;返回DOSINT21HCODEENDSENDBEGIN第第5 5章章 8086/80888086/8088匯編語言程序設計匯編語言程序設計第二種格式:第二種格式:RET;取程序段前綴首地址;取程序段前綴首地址MAINE

2、NDPCODEENDSENDBEGIN區(qū)別:兩種格式的本質區(qū)別在于返回區(qū)別:兩種格式的本質區(qū)別在于返回DOS的方法不同:的方法不同:對于第一種格式,對于第一種格式,采用了調用采用了調用DOS系統(tǒng)的系統(tǒng)的4CH功能,返回功能,返回DOS。具體方法是:在要返回具體方法是:在要返回DOS處,安排如下兩條指令:處,安排如下兩條指令:MOVAH,4CHINT21H對于第二格式,對于第二格式,DOS返回方法是調用返回方法是調用20H類型的中斷服務程序。類型的中斷服務程序。5.2 順序結構程序設計順序結構程序設計 順序程序結構是指完全按照順序逐條執(zhí)行的順序程序結構是指完全按照順序逐條執(zhí)行的指令序列,這種結構

3、的流程圖除了有一個開始框指令序列,這種結構的流程圖除了有一個開始框和結束框外,就是若干處理框,沒有判斷框,如和結束框外,就是若干處理框,沒有判斷框,如圖圖5.1所示。所示。圖圖5.1順序程序的結構形式順序程序的結構形式語 句 3語 句 2結 束開 始語 句 1例例5.1:試分別用匯編語言源程序的兩種框架結構編制程序,求出表達試分別用匯編語言源程序的兩種框架結構編制程序,求出表達式:式:(X4Y)/2的值,并保存到的值,并保存到RESULT存儲單元中,其中存儲單元中,其中X,Y均均為字節(jié)變量為字節(jié)變量。解:完成該功能的流程圖解:完成該功能的流程圖如圖如圖5.2所示:所示:圖圖5.2 例例5.1的

4、功能實現(xiàn)流程圖的功能實現(xiàn)流程圖 Z ( A L )A L ( A L ) / 2A L ( A L ) - ( Y )A L ( A L ) 4A L ( X )結 束開 始參考程序參考程序1:DATASEGMENT;數(shù)據(jù)段;數(shù)據(jù)段XDB2YDB4ZDB?;定義變量;定義變量DATAENDSSTACK SEGMENT PARA STACKDW20HDUP(0)STACK ENDSCODESEGMENT;代碼段;代碼段ASSUME CS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AX;DS賦初值賦初值MOVAL,X;ALXMOVCL,2SALAL,CL

5、;ALX4SUBAL,Y;ALX4YSARAL,1;AL(X4Y)/2MOVZ,AL;存結果;存結果MOVAH,4CH;返回;返回DOSINT21HCODEENDSENDBEGIN參考程序參考程序2:DATASEGMENTXDB2YDB4ZDB?DATAENDSSTACK SEGMENTPARASTACKDW20HDUP(0)STACK ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKPROC1 PROCFAR;使;使RET為遠返回為遠返回ENDBEGINBEGIN: PUSHDS;入棧保存地址;入棧保存地址MOVAX,0;程序段前綴的首地址;程序段前

6、綴的首地址PUSHAXMOVAX,DATAMOVDS,AXMOVAL,X;ALXMOVCL,2SALAL,CL;ALX4SUBAL,Y;ALX4YSARAL,1;AL(X4Y)/2MOVZ,AL;存結果;存結果RET;取程序段前綴首地址;取程序段前綴首地址PROC1 ENDPCODE ENDS5.3 分支結構程序設計分支結構程序設計 分支程序結構可以有兩種形式,如圖分支程序結構可以有兩種形式,如圖5.4所示,它們分所示,它們分別相當于高級語言程序中的別相當于高級語言程序中的IF-THEN-ELSE語句和語句和CASE語句,它們適用于要根據(jù)不同條件做不同處理的情況。語句,它們適用于要根據(jù)不同條件

7、做不同處理的情況。語句判定條件語句CASE結構語句nIF-THEN-ELSE結構語句判定條件語句5.3.1 用比較用比較/測試的方法實現(xiàn)測試的方法實現(xiàn)IF-THEN-ELSE結構結構 實現(xiàn)方法:在產生分支之前,通常用比較、測試的辦實現(xiàn)方法:在產生分支之前,通常用比較、測試的辦法在標志寄存器中設置相應的標志位,然后再選用適當法在標志寄存器中設置相應的標志位,然后再選用適當?shù)臈l件轉移指令,以實現(xiàn)不同情況的分支轉移。的條件轉移指令,以實現(xiàn)不同情況的分支轉移。(1)進行比較,使用比較指令:)進行比較,使用比較指令:CMPDEST,SRC該指令進行減法操作,而不保存結果,只設置標志位。該指令進行減法操作

8、,而不保存結果,只設置標志位。(2)進行測試,使用測試指令)進行測試,使用測試指令TESTDEST,SRC該指令進行邏輯與操作,而不保存結果,只設置標志位。該指令進行邏輯與操作,而不保存結果,只設置標志位。5.3.2 用地址表法實現(xiàn)用地址表法實現(xiàn)CASE結構(即多路分支)結構(即多路分支) 用地址表法實現(xiàn)用地址表法實現(xiàn)CASE結構的基本思路是:將各結構的基本思路是:將各分支程序的入口地址依次羅列形成一個地址表,讓分支程序的入口地址依次羅列形成一個地址表,讓BX指向地址表的首地址,從鍵盤接收或其他方式獲指向地址表的首地址,從鍵盤接收或其他方式獲取要轉到的分支號,再讓取要轉到的分支號,再讓BX與分

9、支號進行運算,使與分支號進行運算,使BX指向對應分支入口地址,最后即可使用指向對應分支入口地址,最后即可使用JMP WORD PTR BX 或或JMP DWORD PTR BX 指指令實現(xiàn)所要轉到的分支;程序設計流程圖如令實現(xiàn)所要轉到的分支;程序設計流程圖如圖圖5.6所所示:示:建 立 地 址 表求 出 分 支 號 所 對 應 分 支 在 地 址 表 的 存 放 地 址 , 并 送 B X接 收 分 支 號 J M PW O R D / D W O R D P T R B X 圖圖5.6用地址表法實現(xiàn)多路分支的結構框圖用地址表法實現(xiàn)多路分支的結構框圖例例5.4:編程實現(xiàn)菜單選擇,根據(jù)不同的選擇

10、做不同的事情。編程實現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情。 解:假設有解:假設有3路分支,在地址表中的入口地址分別:路分支,在地址表中的入口地址分別:A0、A1、A2;具體見圖;具體見圖5.7所示:所示:A 2 - HA 2 - LA 1 - HA 1 - LA 0 - H:T A BA 0 - L:參考程序:參考程序:DATASEGMENTMENUDB0DH,0AH,0:Chinese!DB0DH,0AH,1:English!DB0DH,0AH,2: German!DB0DH,0AH,Please choose one to answer the following question:$E

11、RDB 0DH,0AH,I am sorry,you choose the mistake!$S0DB0DH,0AH,OK,Please answer in Chinese!$S1DB0DH,0AH,OK,Please answer in English!$S2DB0DH,0AH,OK,Please answer in German!$TABDWA0,A1,A2;地址表;地址表DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATAMOVDS,AXLEADX,MENU;顯示菜單;顯示菜單MOVAH,9INT21HMOVAH,1;1號號D

12、OS功能調用,接收分支號功能調用,接收分支號INT21HCMPAL,0;進行合法判斷;進行合法判斷JBERRORCMPAL,2JAERRORLEABX,TAB;取地址表首址;取地址表首址SUBAL,30HSHLAL,1;段內轉移乘以;段內轉移乘以2,段間轉移乘以,段間轉移乘以4XORAH,AH;AH清零清零ADDBX,AXJMPWORD PTR BX;產生多分支轉移;產生多分支轉移 A0:LEADX,S0;各分支程序段;各分支程序段MOVAH,9INT21HJMPEXIT1A1:LEADX,S1MOVAH,9INT21HJMPEXIT1A2:LEADX,S2MOVAH,9INT21HJMPEX

13、IT1ERROR:MOVDX,OFFSET ERMOVAH,9INT21HEXIT1: MOVAH,4CH;返回;返回DOSINT21HCODEENDSENDSTART5.3.3 用轉移表法實現(xiàn)用轉移表法實現(xiàn)CASE結構(即多路分支)結構(即多路分支) 用轉移表法實現(xiàn)用轉移表法實現(xiàn)CASE結構的基本思路:將轉到各分支程序的轉結構的基本思路:將轉到各分支程序的轉移指令依次羅列形成一個轉移表,讓移指令依次羅列形成一個轉移表,讓BX指向轉移表的首地址,從鍵指向轉移表的首地址,從鍵盤接收或其他方式獲取要轉到的分支號,再讓盤接收或其他方式獲取要轉到的分支號,再讓BX與分支號進行運算,與分支號進行運算,使

14、使BX指向對應轉移表中轉到該分支的轉移指令處,最后即可使用指向對應轉移表中轉到該分支的轉移指令處,最后即可使用JMP BX指令實現(xiàn)所要轉到的分支;具體見指令實現(xiàn)所要轉到的分支;具體見圖圖5.8所示:所示:建 立 地 址 表求 出 分 支 號 所 對 應 分支 在 地 址 表 的 存 放 地 址 , 并 送 B X接 收 分 支 號J M P B X圖圖5.8 用轉移表法實現(xiàn)多路分支的結構框圖用轉移表法實現(xiàn)多路分支的結構框圖例例5.5:編程實現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情。編程實現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情。解:假設有解:假設有3路分支,轉移表中的轉移指令分別為:路分支,轉移表

15、中的轉移指令分別為:JMP SHORT A0、JMP SHORT A1、JMP SHORT A2;具體見;具體見圖圖5.9所示:所示:JMP SHORT A2JMP SHORT A1JMP SHORT A0:TAB:參考程序:參考程序:DATASEGMENTMENUDB0DH,0AH,0:Chinese!DB0DH,0AH,1:English!DB0DH,0AH,2: German!DB0DH,0AH,Please choose one to answer the following question:$ER DB 0DH,0AH,I am sorry,you shoose the mista

16、ke!$S0DB0DH,0AH,OK,Please answer in Chinese!$S1DB0DH,0AH,OK,Please answer in English!$S2DB0DH,0AH,OK,Please answer in German!$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATAMOVDS,AXLEADX,MENU;顯示菜單;顯示菜單MOVAH,9INT21HMOVAH,1;1號號DOS功能調用,接收分支號功能調用,接收分支號INT21HCMPAL,0JBERRORCMPAL,2JAERRORLEABX,TA

17、B ;取地址表首址;取地址表首址SUBAL,30HSHLAL,1;短轉移乘以;短轉移乘以2,近轉移乘以,近轉移乘以3,遠轉移乘以,遠轉移乘以5XORAH,AH;AH清零清零ADDBX,AXJMPBX;產生多分支轉移;產生多分支轉移TAB:JMPSHORT A0;轉移表;轉移表JMPSHORT A1JMPSHORT A2A0:LEADX,S0;各分支程序段;各分支程序段MOVAH,9INT21HJMPEXIT1A1:LEADX,S1MOVAH,9INT21HJMPEXIT1A2:LEA DX,S2MOVAH,9INT21HJMPEXIT1ERROR:MOVDX,OFFSET ERMOVAH,9I

18、NT21HEXIT1: MOVAH,4CH;返回;返回DOSINT21HCODEENDSENDSTART5.4 循環(huán)結構程序設計循環(huán)結構程序設計5.4.1 循環(huán)程序的組成循環(huán)程序的組成1.設置循環(huán)的初始狀態(tài)設置循環(huán)的初始狀態(tài)如置如置循環(huán)次數(shù)的計數(shù)值,以及為循環(huán)體正常工作的初始狀態(tài)等;循環(huán)次數(shù)的計數(shù)值,以及為循環(huán)體正常工作的初始狀態(tài)等;2.循環(huán)體循環(huán)體 這是循環(huán)的工作主體,它由循環(huán)的工作部分及修改部分組成。這是循環(huán)的工作主體,它由循環(huán)的工作部分及修改部分組成。3.循環(huán)控制部分循環(huán)控制部分它是循環(huán)程序設計的關鍵,每一個循環(huán)程序必須選擇一個循環(huán)它是循環(huán)程序設計的關鍵,每一個循環(huán)程序必須選擇一個循環(huán)控

19、制條件來控制循環(huán)的運行和結束控制條件來控制循環(huán)的運行和結束,通常有兩種方法控制循環(huán):用通常有兩種方法控制循環(huán):用計數(shù)控制循環(huán)計數(shù)控制循環(huán),用條件控制循環(huán)用條件控制循環(huán)5.4.2 循環(huán)程序的結構形式循環(huán)程序的結構形式 循環(huán)程序有兩種結構,一種是循環(huán)程序有兩種結構,一種是DO-WHILE結構形式,結構形式,另一種是另一種是DO-UNTIL結構結構形式。具體見圖形式。具體見圖5.10所示:所示: DO-WHILE結構把對循環(huán)控制條件的判斷放在循環(huán)的入結構把對循環(huán)控制條件的判斷放在循環(huán)的入口,先判斷條件,滿足條件就執(zhí)行循環(huán)體,否則退出循環(huán)???,先判斷條件,滿足條件就執(zhí)行循環(huán)體,否則退出循環(huán)。 DO-U

20、NTIL結構是先執(zhí)行循環(huán)體然后再判斷控制條件,結構是先執(zhí)行循環(huán)體然后再判斷控制條件,不滿足條件則繼續(xù)執(zhí)行循環(huán)操作,一旦滿足條件則退出循不滿足條件則繼續(xù)執(zhí)行循環(huán)操作,一旦滿足條件則退出循環(huán)。一般講,如果循環(huán)次數(shù)等于環(huán)。一般講,如果循環(huán)次數(shù)等于0的可能,則應選擇的可能,則應選擇DO-WHILE結構,否則用結構,否則用DO-UNTIL結構。結構。D O -( 當 型 循 環(huán) , 當 條 件 成 立 進 入 循 環(huán) )循 環(huán) 體N循 環(huán) 條 件 判 斷 ?Y循 環(huán) 初 始 設 置( 直 到 型 循 環(huán) , 直 到 條 件 成 立 退 出 循 環(huán) )YND O - U N T I L循 環(huán) 條 件 判

21、斷 ?循 環(huán) 體循 環(huán) 初 始 設 置圖圖5.10循環(huán)程序的結構形式循環(huán)程序的結構形式 5.4.3 循環(huán)控制的方法循環(huán)控制的方法1.用計數(shù)控制循環(huán)用計數(shù)控制循環(huán) 這種方法直觀、方便,易于程序設計。只要在編制程序時,這種方法直觀、方便,易于程序設計。只要在編制程序時,循環(huán)循環(huán)次數(shù)已知,就可以使用這種方法設計循環(huán)程序。然而更多次數(shù)已知,就可以使用這種方法設計循環(huán)程序。然而更多的循環(huán)程序,在編制的循環(huán)程序,在編制程序時并不能確切知道循環(huán)次數(shù),但是知程序時并不能確切知道循環(huán)次數(shù),但是知道循環(huán)次數(shù)是前面運算或操作的結果或者被存放在某內存單元道循環(huán)次數(shù)是前面運算或操作的結果或者被存放在某內存單元中。中。例

22、例5.6:試編制程序統(tǒng)計字節(jié)變量試編制程序統(tǒng)計字節(jié)變量VAR中中1的個數(shù),并將它的個數(shù),并將它存入存入COUNT單元中。單元中。 解:要測試出解:要測試出VAR中中1的個數(shù)就應該逐位進行測試,可根據(jù)最低位的個數(shù)就應該逐位進行測試,可根據(jù)最低位是否為是否為1來計數(shù),然后用移位的辦法把各位數(shù)逐次移到最低位去,來計數(shù),然后用移位的辦法把各位數(shù)逐次移到最低位去,共需要測試共需要測試8次。程序流程如次。程序流程如圖圖5.11所示:所示:YN ( C X ) = ( C X ) - 1A L 邏 輯 右 移 一 位NC X = 0 ?結 束Y( B L ) = ( B L ) + 1C O U N T (

23、 B L )循 環(huán) 次 數(shù) C X 0計 數(shù) 初 值 B L 0 A L V A R開 始A L 最 低 位是 否 為 1 ?圖圖5.11例例5.6的功能實現(xiàn)流程圖的功能實現(xiàn)流程圖 參考程序:參考程序:DATASEGMENTVARDB 37HCOUNT DB ?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATABEGIN: MOVAX,DATAMOV DS,AXMOVAL,VAR;ALVAR的值的值MOVCX,8;賦循環(huán)初值;賦循環(huán)初值XORBL,BL;賦計數(shù)器初值;賦計數(shù)器初值LL:TESTAL,1;測試;測試AL的最低位的最低位JZLL1;最低位為;最低位為

24、0轉轉LL1INCBL;計數(shù)器加;計數(shù)器加1LL1:SHRAL,1;邏輯右移;邏輯右移1位位LOOPLL;循環(huán)控制;循環(huán)控制MOVCOUNT,BL;COUNT計數(shù)器計數(shù)器BL的值的值MOVAH,4CH;返回;返回DOSINT21HCODEENDSENDBEGIN2.用條件控制循環(huán)用條件控制循環(huán) 例例5.8:將正整數(shù)將正整數(shù)NUM插入到一個從小到大排列好順序的正整數(shù)插入到一個從小到大排列好順序的正整數(shù)字節(jié)數(shù)組序列中。字節(jié)數(shù)組序列中。 分析:分析:假設該數(shù)組的首地址和末地址分別為假設該數(shù)組的首地址和末地址分別為ARRAY_HEAD、ARRAY_END,顯然在這里需要插入的是一個數(shù),所以不一定,顯然

25、在這里需要插入的是一個數(shù),所以不一定要掃描要掃描整個數(shù)組。同時為了插入這個數(shù)據(jù),必須要空出位置,整個數(shù)組。同時為了插入這個數(shù)據(jù),必須要空出位置,即凡是比它大的數(shù)據(jù)都應該向地址增大的方向移動一個字節(jié),即凡是比它大的數(shù)據(jù)都應該向地址增大的方向移動一個字節(jié),故應該從數(shù)組的尾部向頭部查找,可逐字節(jié)取出比較。值得注故應該從數(shù)組的尾部向頭部查找,可逐字節(jié)取出比較。值得注意的是,應該考慮正整數(shù)意的是,應該考慮正整數(shù)NUM大于或小于數(shù)組中的所有數(shù)的大于或小于數(shù)組中的所有數(shù)的可能,即如果可能,即如果NUM大于數(shù)組中所有數(shù),則第一次比較就可以大于數(shù)組中所有數(shù),則第一次比較就可以結束查找;如果結束查找;如果NUM小

26、于數(shù)組小于數(shù)組中所有數(shù),則必須及時結束查中所有數(shù),則必須及時結束查找,絕對不允許查找的范圍超出數(shù)組的首地址,當然可以把數(shù)找,絕對不允許查找的范圍超出數(shù)組的首地址,當然可以把數(shù)組的首地址或循環(huán)次數(shù)作為結束查找的條件。根據(jù)上述分析,組的首地址或循環(huán)次數(shù)作為結束查找的條件。根據(jù)上述分析,可以得出程序流程如可以得出程序流程如圖圖5.13所示:所示:YN修 改 地 址 指 針 : S I ( S I ) - 1循 環(huán) 次 數(shù) 計 數(shù) : C X ( C X ) - 1NC X = 0 ?結 束Y( A R R A Y S I ) 與 ( A R R A Y S I + 1 ) 交 換A R R A Y

27、S I + 1 A LA L 0 插 入 數(shù) 據(jù) N U MS I 0 數(shù) 組 末 偏 移 地 址C X 數(shù) 組 元 素 個 數(shù)開 始( A R R A Y S I ) ( A L ) ?圖圖5.13例例5.8的功能實現(xiàn)流程圖的功能實現(xiàn)流程圖 參考程序:參考程序:NUMEQU36HDATASEGMENTARRAY DB12H,24H,48H,60H,72H,84HYDB?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATABEGIN: MOVAX,DATAMOVDS,AXMOVCX,Y-ARRAY;循環(huán)次數(shù)初始化;循環(huán)次數(shù)初始化MOVAL,NUM;插入值送;插入值

28、送ALLEASI,YDECSI ;取得;取得ARRAY的最后元素的偏移地址的最后元素的偏移地址LOP:CMPARRAYSI,AL;比較;比較JLEINSERTMOVAH,ARRAYSIMOVARRAYSI+1,AH;數(shù)據(jù)交換;數(shù)據(jù)交換DECSI;修改偏移地址;修改偏移地址LOOPLOPINSERT:MOVARRAYSI+1,AL;插入數(shù)據(jù);插入數(shù)據(jù)MOVAH,4CH INT21HCODE ENDS ENDBEGIN5.5 子程序設計子程序設計 5.5.1 子程序的構造子程序的構造前面我們學習了過程定義偽指令,我們也就是用它們來構成的子程序,前面我們學習了過程定義偽指令,我們也就是用它們來構成的

29、子程序,其格式為:其格式為:子程序名子程序名PROC(NEAR/FAR)保存信息保存信息恢復信息恢復信息RET子程序名子程序名ENDP5.5.2 子程序的調用與返回子程序的調用與返回 子程序的正確執(zhí)行是由子程序的正確調用和返回保證的。子程序的正確執(zhí)行是由子程序的正確調用和返回保證的。IBM PC機的機的CALL和和RET指令就分別完成了子程序的調指令就分別完成了子程序的調用和返回功能。用和返回功能。1.調用指令:調用指令:CALL 過程名過程名 執(zhí)行執(zhí)行CALL指令,首先保留斷點地址于堆棧中,然后轉指令,首先保留斷點地址于堆棧中,然后轉移到目標單元,它對移到目標單元,它對PSW無影響。無影響。

30、2.返回指令:返回指令:RET一個子程序執(zhí)行的最后一條指令必定是返回指令一個子程序執(zhí)行的最后一條指令必定是返回指令RET,用以返回到調用子程序的斷點處。但在位置上并不一定就用以返回到調用子程序的斷點處。但在位置上并不一定就是是最后一條指令。它的位置靈活,并不是必須要在最后。是是最后一條指令。它的位置靈活,并不是必須要在最后。只是習慣上我們通常將它置于子程序的最后。只是習慣上我們通常將它置于子程序的最后。5.5.3 編制子程序的要求編制子程序的要求1.子程序必須具有通用性子程序必須具有通用性2.注意保存信息和恢復信息注意保存信息和恢復信息 要注意最先壓入堆棧的應該最后彈出來,值得注意的是:要注意

31、最先壓入堆棧的應該最后彈出來,值得注意的是:必須搞清楚那些必須搞清楚那些寄存器是必須保存的,那些又是不必要或不寄存器是必須保存的,那些又是不必要或不應該保存的。一般來說,子程序中用到的寄存器是應該保存應該保存的。一般來說,子程序中用到的寄存器是應該保存的,但是的,但是如果主程序和子程序之間使用寄存器傳遞參數(shù)的話,如果主程序和子程序之間使用寄存器傳遞參數(shù)的話,該寄存器則不一定需要保存,特別是用來向主程序回送結果該寄存器則不一定需要保存,特別是用來向主程序回送結果(即出口參數(shù))的寄存器,則更不應該因保存和恢復該寄存(即出口參數(shù))的寄存器,則更不應該因保存和恢復該寄存器的內容而破壞了應該向主程序傳送

32、的信息。器的內容而破壞了應該向主程序傳送的信息。3.選用適當?shù)姆椒ㄔ谧映绦蚝椭鞒绦蛑g的進行參數(shù)傳遞選用適當?shù)姆椒ㄔ谧映绦蚝椭鞒绦蛑g的進行參數(shù)傳遞 這種主程序與子程序之間的信息傳送稱為參數(shù)傳遞,它可這種主程序與子程序之間的信息傳送稱為參數(shù)傳遞,它可以有以下三種:以有以下三種: 用寄存器傳遞參數(shù)用寄存器傳遞參數(shù) 這是最常用的一種方式,通常在參量不多的時候使用這這是最常用的一種方式,通常在參量不多的時候使用這種方法。種方法。 用地址表傳遞參數(shù)用地址表傳遞參數(shù) 通過地址表傳送參數(shù)的方法是在主程序中首先建立一個通過地址表傳送參數(shù)的方法是在主程序中首先建立一個地址表,把要傳送給子程序的參數(shù)都存放在地址

33、表中,然地址表,把要傳送給子程序的參數(shù)都存放在地址表中,然后把地址表的首地址通過寄存器傳送到子程序中去;后把地址表的首地址通過寄存器傳送到子程序中去;最后最后子程序通過地址表取得所需參數(shù)。子程序通過地址表取得所需參數(shù)。 用堆棧傳遞參數(shù)用堆棧傳遞參數(shù)這種方法是在主程序中把要傳送給子程序的參數(shù)先保存這種方法是在主程序中把要傳送給子程序的參數(shù)先保存到堆棧中,然后子程序再從堆棧中取出參數(shù)以達到傳送參到堆棧中,然后子程序再從堆棧中取出參數(shù)以達到傳送參數(shù)的目的。數(shù)的目的。5.6 高級匯編語言技術高級匯編語言技術 5.6.1 宏匯編宏匯編1宏定義宏定義宏在使用前必須先進行宏定義。宏定義格式為:宏在使用前必須

34、先進行宏定義。宏定義格式為:宏指令名宏指令名MACRO形式參數(shù),形式參數(shù),形式參數(shù),形式參數(shù),宏體宏體ENDM其中,宏指令名:宏定義的名字(即給宏體中程序段指定一個其中,宏指令名:宏定義的名字(即給宏體中程序段指定一個符號名),不可缺省,宏調用時要使用它,第一個符號必須是符號名),不可缺省,宏調用時要使用它,第一個符號必須是字母,其后可以是字母或數(shù)字字母,其后可以是字母或數(shù)字MACROENDM:宏定義偽指令助記符,不可缺省。它們成對出:宏定義偽指令助記符,不可缺省。它們成對出現(xiàn),表示宏定義的開始和結束,現(xiàn),表示宏定義的開始和結束,ENDM前不帶宏指令名。前不帶宏指令名。宏體:一段有獨立功能的程

35、序代碼段。宏體:一段有獨立功能的程序代碼段。形式參數(shù):又稱啞元,各個啞元之間用逗號隔開,可以缺省。形式參數(shù):又稱啞元,各個啞元之間用逗號隔開,可以缺省。2宏調用宏調用經宏定義后的宏指令可以在源程序中調用,宏調用格式為:經宏定義后的宏指令可以在源程序中調用,宏調用格式為:宏指令名宏指令名實參,實參實參,實參 宏調用只需要有宏指令名,若宏定義中有形參,那么宏調用時必須宏調用只需要有宏指令名,若宏定義中有形參,那么宏調用時必須帶有實際參數(shù)來替代形參,實際參數(shù)的個數(shù),順序,類型與形參一一帶有實際參數(shù)來替代形參,實際參數(shù)的個數(shù),順序,類型與形參一一對應,各個實參之間用逗號分開對應,各個實參之間用逗號分開

36、。原則上實參的個數(shù)與形參的個數(shù)相。原則上實參的個數(shù)與形參的個數(shù)相等,但匯編程序不要求它們必須相等,若實參等,但匯編程序不要求它們必須相等,若實參個數(shù)大于形參個數(shù),則個數(shù)大于形參個數(shù),則多余的實參不予考慮,若實參個數(shù)小于形參個數(shù),則多余的形參作多余的實參不予考慮,若實參個數(shù)小于形參個數(shù),則多余的形參作“空空”處理。處理。 3宏展開宏展開 匯編程序在對源程序匯編時,對每個宏調用作宏展開匯編程序在對源程序匯編時,對每個宏調用作宏展開,每每條插入的宏體指令前帶上加號條插入的宏體指令前帶上加號“+”。例例5.11:不帶參數(shù)的宏定義,用宏指令來實現(xiàn)回車換行。不帶參數(shù)的宏定義,用宏指令來實現(xiàn)回車換行。宏定義

37、:宏定義:CRLFMACROMOVDL,0DH;回車回車MOVAH,2INT21HMOVDL,0AH;換行換行MOVAH,2INT21HENDM宏調用:宏調用:CRLF宏展開:將下述程序段替換宏調用語句。宏展開:將下述程序段替換宏調用語句。MOV DL,0DH;回車回車MOV AH,2INT21HMOV DL,0AH;換行換行MOV AH,2INT21H4.宏調用中參數(shù)傳遞宏調用中參數(shù)傳遞 宏定義中的參數(shù)可以有多個,實參可以是數(shù)字,寄存器或宏定義中的參數(shù)可以有多個,實參可以是數(shù)字,寄存器或操作碼。宏定義還可用部分操作碼作參數(shù),但在宏定義中必須操作碼。宏定義還可用部分操作碼作參數(shù),但在宏定義中必

38、須用用“&”作分隔符,作分隔符,&是一個操作符,它是一個操作符,它在宏定義體中可作為在宏定義體中可作為啞元的前綴,宏展開時,可以把啞元的前綴,宏展開時,可以把&前后兩個符號合并成一個符前后兩個符號合并成一個符號。號。例例5.12:宏定義帶一個參數(shù),用宏指令實現(xiàn)將:宏定義帶一個參數(shù),用宏指令實現(xiàn)將AX中內容右移任意次(小中內容右移任意次(小于于256)。 宏定義:宏定義:SHIFTMACRONMOVCL,NSALAX,CLENDM宏調用宏調用1:SHIFT4宏調用宏調用2:SHIFT8宏展開宏展開1:MOVCL,4;AX中內容算術左移中內容算術左移4次次SALAX,CL宏

39、展開宏展開2:MOVCL,8;AX中內容算術左移中內容算術左移8次次SALAX,CL5.宏定義嵌套宏定義嵌套在宏定義中允許使用宏調用,但必須先定義后調用。在宏定義中允許使用宏調用,但必須先定義后調用。 例例5.14:宏定義:宏定義:AD1MACROM,NMOVBX,MADDAX,NENDMAD1MMACROR1,R2,R3PUSHAXPUSHBXAD1R1,R2MOVX3,AXPOPBXPOPAXENDM宏調用:宏調用:AD1MCX,BX,DX宏展開:宏展開:PUSHAXPUSHBXAD1R1,R2 ;此語句不占內存;此語句不占內存MOVBX,CX ;AD1宏定義展開宏定義展開ADDAX,BX

40、MOVDX,AXPOPBXPOPAX6.取消宏定義語句取消宏定義語句格式為:格式為:PURGE 宏指令名,宏指令名宏指令名,宏指令名PURGE:偽指令助記符,不可缺省,因為經過定義的宏指令名,不:偽指令助記符,不可缺省,因為經過定義的宏指令名,不允許重新定義,必須用允許重新定義,必須用PURGE語句將其取消后,才能重新定義,此語句將其取消后,才能重新定義,此語句一次可以取消多個宏指令名。語句一次可以取消多個宏指令名。 7.7.宏指令與子程序的區(qū)別宏指令與子程序的區(qū)別過程調用使用過程調用使用CALLCALL語句,由語句,由CPUCPU執(zhí)行,宏指令調用由宏匯編程執(zhí)行,宏指令調用由宏匯編程序序MAS

41、MMASM中宏處理程序來識別。中宏處理程序來識別。過程調用時,每調用一次都要保留程序的斷點和保護現(xiàn)場,過程調用時,每調用一次都要保留程序的斷點和保護現(xiàn)場,返回時要恢復現(xiàn)場和恢復返回時要恢復現(xiàn)場和恢復斷點,增加了操作時間,執(zhí)行速度慢。斷點,增加了操作時間,執(zhí)行速度慢。而宏指令調用時,不需要這些入棧及出棧操作,執(zhí)行速度較快。而宏指令調用時,不需要這些入棧及出棧操作,執(zhí)行速度較快。過程調用的子程序與主程序分開獨立存在,經匯編后在存儲過程調用的子程序與主程序分開獨立存在,經匯編后在存儲器中只占有一個子程序段的空間,主程序轉入此處運行,因此器中只占有一個子程序段的空間,主程序轉入此處運行,因此目標代碼長

42、度短,節(jié)省內存空間。而宏調用是在匯編過程中展目標代碼長度短,節(jié)省內存空間。而宏調用是在匯編過程中展開,宏調用多少次,就插入多少次,因此目標代碼長度大開,宏調用多少次,就插入多少次,因此目標代碼長度大,占,占內存空間多;內存空間多;一個子程序設計,一般完成某一個功能,多次調用完成相同一個子程序設計,一般完成某一個功能,多次調用完成相同操作,僅入口參數(shù)可以改變,而宏指令可以帶啞元,調用時可操作,僅入口參數(shù)可以改變,而宏指令可以帶啞元,調用時可以用實元取代,使不同的調用完成不同的操作,增加使用的靈以用實元取代,使不同的調用完成不同的操作,增加使用的靈活性?;钚?。 5.6.2 重復匯編重復匯編重復匯編

43、偽指令語句有以下三種:重復匯編偽指令語句有以下三種:1定重復定重復格式:格式:REPT表達式表達式宏體宏體ENDM其中,其中,REPTENDM:偽指令助記符,必須成對出現(xiàn),不:偽指令助記符,必須成對出現(xiàn),不可省略。宏體:表示需要重復的語句序列可省略。宏體:表示需要重復的語句序列。表達式:表示重。表達式:表示重復次數(shù)。復次數(shù)。例例5.16:將將2、4、8、16、32分配給連續(xù)的分配給連續(xù)的5個存儲單元。個存儲單元。NUM=1REPT 5NUM=NUM*2DB NUMENDM匯編后匯編后: DB 2DB 4DB 8DB 16DB 322不定重復不定重復格式:格式:IRP形參,實參表形參,實參表宏體

44、宏體ENDM其中,其中,IRPENDM:偽指令助記符,必須成對出現(xiàn),不可省略。:偽指令助記符,必須成對出現(xiàn),不可省略。宏體:要重復的宏體:要重復的語句序列,重復次數(shù)由參數(shù)個數(shù)決定。實數(shù)表中語句序列,重復次數(shù)由參數(shù)個數(shù)決定。實數(shù)表中是每次重復時將要取的實參,實參之間用逗號隔開,實參表用尖是每次重復時將要取的實參,實參之間用逗號隔開,實參表用尖括號括起來。每次重復,依次取實參表中一項,代入語句序括號括起來。每次重復,依次取實參表中一項,代入語句序列中啞元。前面將列中啞元。前面將2、4、8、16、32分配給分配給連續(xù)的連續(xù)的5個存儲單元的個存儲單元的例子也可以用如下不定重復偽指令:例子也可以用如下不

45、定重復偽指令:IRPNUM,2,4,8,16,32DBNUMENDM例例5.17:若要把若要把AX,BX,CX,DX的內容壓入堆棧,則可以用的內容壓入堆棧,則可以用如下不定重復偽指令:如下不定重復偽指令:IRPREG,AX,BX,CX,DXPUSHREGENDM匯編后展開為以下四匯編后展開為以下四條指令:條指令:PUSH AXPUSH BXPUSH CXPUSH DX 3不定重復字符不定重復字符 格式為:格式為: IRPC 形式參數(shù),字符串形式參數(shù),字符串宏體宏體ENDM其中,其中,IRPC.ENDM:偽指令助記符,必須成對出現(xiàn),不可省略。:偽指令助記符,必須成對出現(xiàn),不可省略。宏體:重復宏體

46、:重復執(zhí)行的語句序列,每次重復時依次用字符串中字符代替執(zhí)行的語句序列,每次重復時依次用字符串中字符代替形式參數(shù),重復次數(shù)取決于字符串中形式參數(shù),重復次數(shù)取決于字符串中字符的個數(shù)。字符串:可用尖字符的個數(shù)。字符串:可用尖括號也可不用尖括號括起來。括號也可不用尖括號括起來。例例5.18:若要從堆棧中彈出若要從堆棧中彈出4個字,分別送入個字,分別送入DX,CX,BX,AX,則可用如下不定重復字符偽指令:則可用如下不定重復字符偽指令:IRPCREG,POPREG&XENDM匯編后展開為以下四條指令:匯編后展開為以下四條指令:POPDXPOPCXPOPBXPOPAX5.6.3 條件匯編條件匯編

47、條件匯編是對給定的條件進行測試,匯編程序根據(jù)測試結果,條件匯編是對給定的條件進行測試,匯編程序根據(jù)測試結果,將一段程序嵌入源程序匯編或不進行匯編,它的一般格式為:將一段程序嵌入源程序匯編或不進行匯編,它的一般格式為:IF表達式表達式指令體指令體1;條件為真匯編指令體;條件為真匯編指令體1ELSE指令體指令體2;條件為假匯編指令體;條件為假匯編指令體2ENDIF其中,其中,IFENDIF:條件匯編偽指令助記符,必須成對出現(xiàn),不:條件匯編偽指令助記符,必須成對出現(xiàn),不可省略??墒÷?。IF語句后的語句后的“”是指定的條件。如果是指定的條件。如果“IF”指定的條指定的條件為真時則宏匯編程序將指令體件為

48、真時則宏匯編程序將指令體1中的中的語句匯編成相應的目標代碼,否語句匯編成相應的目標代碼,否則就把指令體則就把指令體2中的語句匯編成相應的目標代碼。中的語句匯編成相應的目標代碼。ELSE:是任選部分,如果沒有:是任選部分,如果沒有ELSE,那么,那么“IF”指定的條件滿足指定的條件滿足就匯編,否則就不匯編。就匯編,否則就不匯編?!癐F”條件匯編的形式見條件匯編的形式見表表5.1所示:所示:偽指令匯編條件IF 表達式表達式的值不等于0 ,條件滿足IFE 表達式表達式的值等于0 ,條件滿足IFDEF 符號符號已定義或被說明為外部符號E X T R NIFNDEF 符號符號未定義或未被說明為外部符號E

49、 X T R NIFB 變量為空,條件滿足IFNB 變量不為空,條件滿足IFIDN , 字符串1 和字符 串2 相同,條件滿足IFDIF , 字符串1 和字符 串2 不相同,條件滿 足例例5.20:利用條件匯編偽指令,可以根據(jù)不同情況,產生無條件利用條件匯編偽指令,可以根據(jù)不同情況,產生無條件轉移指令如轉移指令如JMP,或產生條件轉移指令如,或產生條件轉移指令如JE、JNE、JB、JNB等。等。宏定義:宏定義:GOTOMACROLOP,X,REL,YIFBRELJMPLOPELSEMOVAL,XCMPAL,YJ&REL LOPENDIFENDM宏調用:宏調用:GOTOLOP1,VAR1

50、,E,VAR2GOTOEXIT1宏展開:宏展開:MOV AL,VAR1CMP AL,VAR2JELOP1JMPEXIT15.7 DOS功能子程序的調用功能子程序的調用 為了了解程序運行過程中的情況,應設法將運算結果顯示到顯示為了了解程序運行過程中的情況,應設法將運算結果顯示到顯示器上,最簡單的方法就是調用操作系統(tǒng)的器上,最簡單的方法就是調用操作系統(tǒng)的I/O子程序,我們稱為子程序,我們稱為DOS功能功能調用。調用。DOS為程序設計人員提供了許多可直接調用的功能為程序設計人員提供了許多可直接調用的功能子程序。調用時需要使用軟中斷指令:子程序。調用時需要使用軟中斷指令:INT n其中:其中:n為中斷

51、調用類型號,其值為為中斷調用類型號,其值為00FFH。在使用。在使用INT指令前,指令前,應將調用的功能號送入應將調用的功能號送入AH,有關入口參量送入指定寄存器中。若,有關入口參量送入指定寄存器中。若有出口參量,中斷調用返回后,有出口參量,中斷調用返回后,結果在指定的寄存器或存儲單元中。結果在指定的寄存器或存儲單元中。DOS功能子程序的調用使用軟中斷指令功能子程序的調用使用軟中斷指令“INT 21H”。DOS共有共有84個功能子程序。這些子程序的主要功能是:磁盤的讀寫控制、文件個功能子程序。這些子程序的主要功能是:磁盤的讀寫控制、文件操作、目錄操作、內存管理、基本輸入輸出管理及設置操作、目錄

52、操作、內存管理、基本輸入輸出管理及設置/讀出系統(tǒng)日讀出系統(tǒng)日期、時間等。期、時間等。下面例舉部分常用的下面例舉部分常用的DOS功能子程序。功能子程序。1帶顯示的鍵盤輸入(帶顯示的鍵盤輸入(1號功能)號功能) 該功能子程序等待鍵盤輸入,直接按下一個鍵(即該功能子程序等待鍵盤輸入,直接按下一個鍵(即輸入一個字符),把字符的輸入一個字符),把字符的ASCII碼送入碼送入AL,并在屏,并在屏幕上顯示該字符。如果按下的鍵是幕上顯示該字符。如果按下的鍵是Ctrl-C組合鍵,則組合鍵,則停止程序運行。如果按下停止程序運行。如果按下TAB制表鍵,屏幕上光標自制表鍵,屏幕上光標自動擴展到緊接著的動擴展到緊接著的

53、8個字符位置后面。個字符位置后面。1號功能調用,號功能調用,毋需入口參量,出口參量在毋需入口參量,出口參量在AL中。如:中。如:MOVAH,01HINT21H2不帶顯示的鍵盤輸入(不帶顯示的鍵盤輸入(7號功能)號功能) 與與1號功能類似,它僅等待鍵盤輸入一個字符,并將字號功能類似,它僅等待鍵盤輸入一個字符,并將字符的符的ASCII碼送入碼送入AL中。但按下中。但按下Ctrl-C組合鍵和組合鍵和TAB制表制表鍵無反應。調用方法如下:鍵無反應。調用方法如下:MOVAH,7INT21H 緩沖區(qū)第一個字節(jié)存放它能保存的最大字符數(shù)(緩沖區(qū)第一個字節(jié)存放它能保存的最大字符數(shù)(1255,不能為,不能為0?。?/p>

54、,該值由用戶程序自己事先設置。如?。?,該值由用戶程序自己事先設置。如果鍵如的字符數(shù)比此數(shù)大,那就會發(fā)出果鍵如的字符數(shù)比此數(shù)大,那就會發(fā)出“嘟嘟嘟嘟”聲,而且聲,而且光標不再向右移動。光標不再向右移動。緩沖區(qū)第二個字節(jié)存放用戶本次調用時實際輸入的字符數(shù)緩沖區(qū)第二個字節(jié)存放用戶本次調用時實際輸入的字符數(shù)(回車鍵除外(回車鍵除外),這個數(shù)由),這個數(shù)由DOS返回時自動填入。用戶從返回時自動填入。用戶從鍵盤輸入的字符從第三個字節(jié)開始存放,直到用戶輸入回鍵盤輸入的字符從第三個字節(jié)開始存放,直到用戶輸入回車鍵為止,并將回車鍵碼(車鍵為止,并將回車鍵碼(0DH)加在剛才輸入字符串的)加在剛才輸入字符串的末尾

55、上。末尾上。調用時,用調用時,用DS:DX寄存器指向輸入緩沖區(qū)寄存器指向輸入緩沖區(qū)的段基值:偏移的段基值:偏移量。例如在數(shù)據(jù)區(qū)定義的字符緩沖區(qū)如下:量。例如在數(shù)據(jù)區(qū)定義的字符緩沖區(qū)如下:MAXLENDB18ACTLENDB?STRINGDB18DUP(0) 則輸入串的指令如下:則輸入串的指令如下: MOV AX,SEGMAXLEN MOV DS,AX MOV DX,OFFSETMAXLEN MOV AH,0AH INT21H5字符顯示(字符顯示(2號功能)號功能)本功能子程序僅在屏幕上顯示單個字符。要顯示字符的本功能子程序僅在屏幕上顯示單個字符。要顯示字符的ASCII碼存放碼存放在在DL中。如果中。如果DL中存放退格鍵編碼,在屏幕上便向左移一個字符位中存放退格鍵編碼,在屏幕上便向左移一個字符位置,并使該位置成為空格。移動后光標停留在那里。如要顯示字符置,并使該位置成為空格。移動后光標停留在那里。如要顯示字符A,可用下列幾條指令調用:,可用下列幾條指令調用:MOVDL,AMOVAH,2INT21H6字符打印(字符打?。?號功能)號功能)5號功能子程序把號功能子程序把DL中的字符(中的字符(ASCII碼)送入打印機接口,打印輸出。碼)送入打印機接口,打印輸出。功能調用為:功能調用為:MOVDL,AMOVAH,5INT21H7字符串顯示(字符串顯示(9號功能)號

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論