(PPT)匯編語言源程序的框構_第1頁
(PPT)匯編語言源程序的框構_第2頁
(PPT)匯編語言源程序的框構_第3頁
(PPT)匯編語言源程序的框構_第4頁
(PPT)匯編語言源程序的框構_第5頁
已閱讀5頁,還剩64頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

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

2、ndpcodeendsendbegin區別:兩種格式的本質區別在于返回區別:兩種格式的本質區別在于返回dos的方法不同:的方法不同:對于第一種格式,對于第一種格式,采用了調用采用了調用dos系統的系統的4ch功能,返回功能,返回dos。具體方法是:在要返回具體方法是:在要返回dos處,安排如下兩條指令:處,安排如下兩條指令:movah,4chint21h對于第二格式,對于第二格式,dos返回方法是調用返回方法是調用20h類型的中斷服務程序。類型的中斷服務程序。 5.2 順序結構程序設計順序結構程序設計 順序程序結構是指完全按照順序逐條執行的順序程序結構是指完全按照順序逐條執行的指令序列,這種結

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

4、.1的功能實現流程圖的功能實現流程圖 z(al)al(al)/2al(al)-(y)al(al)4al(x)結束開始參考程序參考程序1:datasegment;數據段;數據段xdb2ydb4zdb?;定義變量;定義變量dataendsstack segment para stackdw20hdup(0)stack endscodesegment;代碼段;代碼段assume cs:code,ds:data,ss:stackbegin:movax,datamovds,ax;ds賦初值賦初值moval,x;alxmovcl,2salal,cl;alx4subal,y;alx4ysaral,1;al(

5、x4y)/2movz,al;存結果;存結果movah,4ch;返回;返回dosint21hcodeendsendbegin參考程序參考程序2:datasegmentxdb2ydb4zdb?dataendsstack segmentparastackdw20hdup(0)stack endscodesegmentassumecs:code,ds:data,ss:stackproc1 procfar;使;使ret為遠返回為遠返回endbeginbegin: pushds;入棧保存地址;入棧保存地址movax,0;程序段前綴的首地址;程序段前綴的首地址pushaxmovax,datamovds,ax

6、moval,x;alxmovcl,2salal,cl;alx4subal,y;alx4ysaral,1;al(x4y)/2movz,al;存結果;存結果ret;取程序段前綴首地址;取程序段前綴首地址proc1 endpcode ends5.3 分支結構程序設計分支結構程序設計 分支程序結構可以有兩種形式,如圖分支程序結構可以有兩種形式,如圖5.4所示,它們分所示,它們分別相當于高級語言程序中的別相當于高級語言程序中的if-then-else語句和語句和case語句,它們適用于要根據不同條件做不同處理的情況。語句,它們適用于要根據不同條件做不同處理的情況。語 句 判 定 條 件語 句 case結

7、 構語 句 nif-then-else結 構語 句 判 定 條 件語 句 5.3.1 用比較用比較/測試的方法實現測試的方法實現if-then-else結構結構 實現方法:在產生分支之前,通常用比較、測試的辦實現方法:在產生分支之前,通常用比較、測試的辦法在標志寄存器中設置相應的標志位,然后再選用適當法在標志寄存器中設置相應的標志位,然后再選用適當的條件轉移指令,以實現不同情況的分支轉移。的條件轉移指令,以實現不同情況的分支轉移。(1)進行比較,使用比較指令:)進行比較,使用比較指令:cmpdest,src該指令進行減法操作,而不保存結果,只設置標志位。該指令進行減法操作,而不保存結果,只設置

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

9、號進行運算,使bx指向對應分支入口地址,最后即可使用指向對應分支入口地址,最后即可使用jmp word ptr bx 或或jmp dword ptr bx 指指令實現所要轉到的分支;程序設計流程圖如令實現所要轉到的分支;程序設計流程圖如圖圖5.6所所示:示:建 立 地 址 表求 出 分 支 號 所 對 應 分 支 在 地 址 表 的 存 放 地 址 ,并 送 bx接 收 分 支 號 jmpword/dword ptr bx圖圖5.6 用地址表法實現多路分支的結構框圖用地址表法實現多路分支的結構框圖 例例5.4:編程實現菜單選擇,根據不同的選擇做不同的事情。編程實現菜單選擇,根據不同的選擇做不同

10、的事情。 解:假設有解:假設有3路分支,在地址表中的入口地址分別:路分支,在地址表中的入口地址分別:a0、a1、a2;具體見圖;具體見圖5.7所示:所示: a2-ha2-la1-ha1-la0-h:taba0-l:參考程序:參考程序:datasegmentmenudb0dh,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

11、!$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號號dos功能調用,接收分支號功能調用,接收分支號int21hcmpal,0;進行合法判斷;進行

12、合法判斷jberrorcmpal,2jaerrorleabx,tab;取地址表首址;取地址表首址subal,30hshlal,1;段內轉移乘以;段內轉移乘以2,段間轉移乘以,段間轉移乘以4xorah,ah;ah清零清零addbx,axjmpword ptr bx;產生多分支轉移;產生多分支轉移 a0:leadx,s0;各分支程序段;各分支程序段movah,9int21hjmpexit1a1:leadx,s1movah,9int21hjmpexit1a2:leadx,s2movah,9int21hjmpexit1error:movdx,offset ermovah,9int21hexit1: m

13、ovah,4ch;返回;返回dosint21hcodeendsendstart5.3.3 用轉移表法實現用轉移表法實現case結構(即多路分支)結構(即多路分支) 用轉移表法實現用轉移表法實現case結構的基本思路:將轉到各分支程序的轉結構的基本思路:將轉到各分支程序的轉移指令依次羅列形成一個轉移表,讓移指令依次羅列形成一個轉移表,讓bx指向轉移表的首地址,從鍵指向轉移表的首地址,從鍵盤接收或其他方式獲取要轉到的分支號,再讓盤接收或其他方式獲取要轉到的分支號,再讓bx與分支號進行運算,與分支號進行運算,使使bx指向對應轉移表中轉到該分支的轉移指令處,最后即可使用指向對應轉移表中轉到該分支的轉移

14、指令處,最后即可使用jmp bx指令實現所要轉到的分支;具體見指令實現所要轉到的分支;具體見圖圖5.8所示:所示:建立地址表求出分支號所對應分支在地址表的存放地 址,并送bx接收分支號jmp bx圖圖5.8 用轉移表法實現多路分支的結構框圖用轉移表法實現多路分支的結構框圖例例5.5:編程實現菜單選擇,根據不同的選擇做不同的事情。編程實現菜單選擇,根據不同的選擇做不同的事情。解:假設有解:假設有3路分支,轉移表中的轉移指令分別為:路分支,轉移表中的轉移指令分別為:jmp short a0、jmp short a1、jmp short a2;具體見;具體見圖圖5.9所示:所示:jmp short

15、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 mistake!$s0db0dh,0ah,ok,please answer in chinese!$s1db0dh,0ah,ok,please answer in

16、english!$s2db0dh,0ah,ok,please answer in german!$dataendscodesegmentassumecs:code,ds:datastart: movax,datamovds,axleadx,menu;顯示菜單;顯示菜單movah,9int21hmovah,1;1號號dos功能調用,接收分支號功能調用,接收分支號int21hcmpal,0jberrorcmpal,2jaerrorleabx,tab ;取地址表首址;取地址表首址subal,30hshlal,1;短轉移乘以;短轉移乘以2,近轉移乘以,近轉移乘以3,遠轉移乘以,遠轉移乘以5xorah,

17、ah;ah清零清零addbx,axjmpbx;產生多分支轉移;產生多分支轉移tab:jmpshort a0;轉移表;轉移表jmpshort a1jmpshort a2a0:leadx,s0;各分支程序段;各分支程序段movah,9int21hjmpexit1a1:leadx,s1movah,9int21hjmpexit1a2:lea dx,s2movah,9int21hjmpexit1error:movdx,offset ermovah,9int21hexit1: movah,4ch;返回;返回dosint21hcodeendsendstart5.4 循環結構程序設計循環結構程序設計 5.4.

18、1 循環程序的組成循環程序的組成1.設置循環的初始狀態設置循環的初始狀態如置如置循環次數的計數值,以及為循環體正常工作的初始狀態等;循環次數的計數值,以及為循環體正常工作的初始狀態等;2.循環體循環體 這是循環的工作主體,它由循環的工作部分及修改部分組成。這是循環的工作主體,它由循環的工作部分及修改部分組成。3.循環控制部分循環控制部分 它是循環程序設計的關鍵,每一個循環程序必須選擇一個循環它是循環程序設計的關鍵,每一個循環程序必須選擇一個循環控制條件來控制循環的運行和結束控制條件來控制循環的運行和結束,通常有兩種方法控制循環:用通常有兩種方法控制循環:用計數控制循環計數控制循環,用條件控制循

19、環用條件控制循環 5.4.2 循環程序的結構形式循環程序的結構形式 循環程序有兩種結構,一種是循環程序有兩種結構,一種是do-while結構形式,結構形式,另一種是另一種是do-until結構結構形式。具體見圖形式。具體見圖5.10所示:所示: do-while結構把對循環控制條件的判斷放在循環的入結構把對循環控制條件的判斷放在循環的入口,先判斷條件,滿足條件就執行循環體,否則退出循環。口,先判斷條件,滿足條件就執行循環體,否則退出循環。 do-until結構是先執行循環體然后再判斷控制條件,結構是先執行循環體然后再判斷控制條件,不滿足條件則繼續執行循環操作,一旦滿足條件則退出循不滿足條件則繼

20、續執行循環操作,一旦滿足條件則退出循環。一般講,如果循環次數等于環。一般講,如果循環次數等于0的可能,則應選擇的可能,則應選擇do-while結構,否則用結構,否則用do-until結構。結構。do-(當型循環,當條件成立進入循環)循環體n循環條件判斷?y循環初始設置(直到型循環,直到條件成立退出循環)yndo-until循環條件判斷?循環體循環初始設置圖圖5.10 循環程序的結構形式循環程序的結構形式 5.4.3 循環控制的方法循環控制的方法 1.用計數控制循環用計數控制循環 這種方法直觀、方便,易于程序設計。只要在編制程序時,這種方法直觀、方便,易于程序設計。只要在編制程序時,循環循環次數

21、已知,就可以使用這種方法設計循環程序。然而更多次數已知,就可以使用這種方法設計循環程序。然而更多的循環程序,在編制的循環程序,在編制程序時并不能確切知道循環次數,但是知程序時并不能確切知道循環次數,但是知道循環次數是前面運算或操作的結果或者被存放在某內存單元道循環次數是前面運算或操作的結果或者被存放在某內存單元中。中。例例5.6:試編制程序統計字節變量試編制程序統計字節變量var中中1的個數,并將它的個數,并將它存入存入count單元中。單元中。 解:要測試出解:要測試出var中中1的個數就應該逐位進行測試,可根據最低位的個數就應該逐位進行測試,可根據最低位是否為是否為1來計數,然后用移位的辦

22、法把各位數逐次移到最低位去,來計數,然后用移位的辦法把各位數逐次移到最低位去,共需要測試共需要測試8次。程序流程如次。程序流程如圖圖5.11所示:所示:yn (cx)=(cx)-1al邏 輯 右 移 一 位ncx=0?結 束y(bl)=(bl)+1count (bl)循 環 次 數 cx 0計 數 初 值 bl 0 al var開 始al最 低 位是 否 為 1?圖圖5.11 例例5.6的功能實現流程圖的功能實現流程圖 參考程序:參考程序:datasegmentvardb 37hcount db ?dataendscodesegmentassume cs:code,ds:databegin:

23、movax,datamov ds,axmoval,var;alvar的值的值movcx,8;賦循環初值;賦循環初值xorbl,bl;賦計數器初值;賦計數器初值ll:testal,1;測試;測試al的最低位的最低位jzll1;最低位為;最低位為0轉轉ll1incbl;計數器加;計數器加1ll1:shral,1;邏輯右移;邏輯右移1位位loopll;循環控制;循環控制movcount,bl;count計數器計數器bl的值的值movah,4ch;返回;返回dosint21hcodeendsendbegin2.用條件控制循環用條件控制循環 例例5.8:將正整數將正整數num插入到一個從小到大排列好順序

24、的正整數插入到一個從小到大排列好順序的正整數字節數組序列中。字節數組序列中。 分析:分析:假設該數組的首地址和末地址分別為假設該數組的首地址和末地址分別為array_head、array_end,顯然在這里需要插入的是一個數,所以不一定,顯然在這里需要插入的是一個數,所以不一定要掃描要掃描整個數組。同時為了插入這個數據,必須要空出位置,整個數組。同時為了插入這個數據,必須要空出位置,即凡是比它大的數據都應該向地址增大的方向移動一個字節,即凡是比它大的數據都應該向地址增大的方向移動一個字節,故應該從數組的尾部向頭部查找,可逐字節取出比較。值得注故應該從數組的尾部向頭部查找,可逐字節取出比較。值得

25、注意的是,應該考慮正整數意的是,應該考慮正整數num大于或小于數組中的所有數的大于或小于數組中的所有數的可能,即如果可能,即如果num大于數組中所有數,則第一次比較就可以大于數組中所有數,則第一次比較就可以結束查找;如果結束查找;如果num小于數組小于數組中所有數,則必須及時結束查中所有數,則必須及時結束查找,絕對不允許查找的范圍超出數組的首地址,當然可以把數找,絕對不允許查找的范圍超出數組的首地址,當然可以把數組的首地址或循環次數作為結束查找的條件。根據上述分析,組的首地址或循環次數作為結束查找的條件。根據上述分析,可以得出程序流程如可以得出程序流程如圖圖5.13所示:所示:yn修 改 地

26、址 指 針 :si (si)-1循 環 次 數 計 數 :cx (cx)-1ncx=0?結 束y(arraysi)與 (arraysi+1)交 換arraysi+1 alal 0插 入 數 據 numsi 0數 組 末 偏 移 地 址cx 數 組 元 素 個 數開 始(arraysi)(al)?圖圖5.13 例例5.8的功能實現流程圖的功能實現流程圖 參考程序:參考程序:numequ36hdatasegmentarray db12h,24h,48h,60h,72h,84hydb?dataendscodesegmentassume cs:code,ds:databegin: movax,data

27、movds,axmovcx,y-array;循環次數初始化;循環次數初始化moval,num;插入值送;插入值送alleasi,ydecsi ;取得;取得array的最后元素的偏移地址的最后元素的偏移地址lop:cmparraysi,al;比較;比較jleinsertmovah,arraysimovarraysi+1,ah;數據交換;數據交換decsi;修改偏移地址;修改偏移地址looplopinsert:movarraysi+1,al;插入數據;插入數據movah,4ch int21hcode ends endbegin5.5 子程序設計子程序設計 5.5.1 子程序的構造子程序的構造前面我

28、們學習了過程定義偽指令,我們也就是用它們來構成的子程序,前面我們學習了過程定義偽指令,我們也就是用它們來構成的子程序,其格式為:其格式為:子程序名子程序名proc(near/far)保存信息保存信息恢復信息恢復信息ret子程序名子程序名endp5.5.2 子程序的調用與返回子程序的調用與返回 子程序的正確執行是由子程序的正確調用和返回保證的。子程序的正確執行是由子程序的正確調用和返回保證的。ibm pc機的機的call和和ret指令就分別完成了子程序的調指令就分別完成了子程序的調用和返回功能。用和返回功能。1.調用指令:調用指令:call 過程名過程名 執行執行call指令,首先保留斷點地址于

29、堆棧中,然后轉指令,首先保留斷點地址于堆棧中,然后轉移到目標單元,它對移到目標單元,它對psw無影響。無影響。2.返回指令:返回指令:ret 一個子程序執行的最后一條指令必定是返回指令一個子程序執行的最后一條指令必定是返回指令ret,用以返回到調用子程序的斷點處。但在位置上并不一定就用以返回到調用子程序的斷點處。但在位置上并不一定就是是最后一條指令。它的位置靈活,并不是必須要在最后。是是最后一條指令。它的位置靈活,并不是必須要在最后。只是習慣上我們通常將它置于子程序的最后。只是習慣上我們通常將它置于子程序的最后。 5.5.3 編制子程序的要求編制子程序的要求1.子程序必須具有通用性子程序必須具

30、有通用性2.注意保存信息和恢復信息注意保存信息和恢復信息 要注意最先壓入堆棧的應該最后彈出來,值得注意的是:要注意最先壓入堆棧的應該最后彈出來,值得注意的是:必須搞清楚那些必須搞清楚那些寄存器是必須保存的,那些又是不必要或不寄存器是必須保存的,那些又是不必要或不應該保存的。一般來說,子程序中用到的寄存器是應該保存應該保存的。一般來說,子程序中用到的寄存器是應該保存的,但是的,但是如果主程序和子程序之間使用寄存器傳遞參數的話,如果主程序和子程序之間使用寄存器傳遞參數的話,該寄存器則不一定需要保存,特別是用來向主程序回送結果該寄存器則不一定需要保存,特別是用來向主程序回送結果(即出口參數)的寄存器

31、,則更不應該因保存和恢復該寄存(即出口參數)的寄存器,則更不應該因保存和恢復該寄存器的內容而破壞了應該向主程序傳送的信息。器的內容而破壞了應該向主程序傳送的信息。3.選用適當的方法在子程序和主程序之間的進行參數傳遞選用適當的方法在子程序和主程序之間的進行參數傳遞 這種主程序與子程序之間的信息傳送稱為參數傳遞,它可這種主程序與子程序之間的信息傳送稱為參數傳遞,它可以有以下三種:以有以下三種: 用寄存器傳遞參數用寄存器傳遞參數 這是最常用的一種方式,通常在參量不多的時候使用這這是最常用的一種方式,通常在參量不多的時候使用這種方法。種方法。 用地址表傳遞參數用地址表傳遞參數 通過地址表傳送參數的方法

32、是在主程序中首先建立一個通過地址表傳送參數的方法是在主程序中首先建立一個地址表,把要傳送給子程序的參數都存放在地址表中,然地址表,把要傳送給子程序的參數都存放在地址表中,然后把地址表的首地址通過寄存器傳送到子程序中去;后把地址表的首地址通過寄存器傳送到子程序中去;最后最后子程序通過地址表取得所需參數。子程序通過地址表取得所需參數。 用堆棧傳遞參數用堆棧傳遞參數 這種方法是在主程序中把要傳送給子程序的參數先保存這種方法是在主程序中把要傳送給子程序的參數先保存到堆棧中,然后子程序再從堆棧中取出參數以達到傳送參到堆棧中,然后子程序再從堆棧中取出參數以達到傳送參數的目的。數的目的。 5.6 高級匯編語

33、言技術高級匯編語言技術 5.6.1 宏匯編宏匯編1宏定義宏定義宏在使用前必須先進行宏定義。宏定義格式為:宏在使用前必須先進行宏定義。宏定義格式為:宏指令名宏指令名macro形式參數,形式參數,形式參數,形式參數,宏體宏體endm其中,宏指令名:宏定義的名字(即給宏體中程序段指定一個其中,宏指令名:宏定義的名字(即給宏體中程序段指定一個符號名),不可缺省,宏調用時要使用它,第一個符號必須是符號名),不可缺省,宏調用時要使用它,第一個符號必須是字母,其后可以是字母或數字字母,其后可以是字母或數字macroendm:宏定義偽指令助記符,不可缺省。它們成對出:宏定義偽指令助記符,不可缺省。它們成對出現

34、,表示宏定義的開始和結束,現,表示宏定義的開始和結束,endm前不帶宏指令名。前不帶宏指令名。宏體:一段有獨立功能的程序代碼段。宏體:一段有獨立功能的程序代碼段。形式參數:又稱啞元,各個啞元之間用逗號隔開,可以缺省。形式參數:又稱啞元,各個啞元之間用逗號隔開,可以缺省。2宏調用宏調用經宏定義后的宏指令可以在源程序中調用,宏調用格式為:經宏定義后的宏指令可以在源程序中調用,宏調用格式為:宏指令名宏指令名實參,實參實參,實參 宏調用只需要有宏指令名,若宏定義中有形參,那么宏調用時必須宏調用只需要有宏指令名,若宏定義中有形參,那么宏調用時必須帶有實際參數來替代形參,實際參數的個數,順序,類型與形參一

35、一帶有實際參數來替代形參,實際參數的個數,順序,類型與形參一一對應,各個實參之間用逗號分開對應,各個實參之間用逗號分開。原則上實參的個數與形參的個數相。原則上實參的個數與形參的個數相等,但匯編程序不要求它們必須相等,若實參等,但匯編程序不要求它們必須相等,若實參個數大于形參個數,則個數大于形參個數,則多余的實參不予考慮,若實參個數小于形參個數,則多余的形參作多余的實參不予考慮,若實參個數小于形參個數,則多余的形參作“空空”處理。處理。 3宏展開宏展開 匯編程序在對源程序匯編時,對每個宏調用作宏展開匯編程序在對源程序匯編時,對每個宏調用作宏展開,每每條插入的宏體指令前帶上加號條插入的宏體指令前帶

36、上加號“+”。例例5.11:不帶參數的宏定義,用宏指令來實現回車換行。不帶參數的宏定義,用宏指令來實現回車換行。宏定義:宏定義:crlfmacromovdl,0dh;回車回車movah,2int21hmovdl,0ah;換行換行movah,2int21hendm宏調用:宏調用:crlf宏展開:將下述程序段替換宏調用語句。宏展開:將下述程序段替換宏調用語句。mov dl,0dh;回車回車mov ah,2int21hmov dl,0ah;換行換行mov ah,2int21h4.宏調用中參數傳遞宏調用中參數傳遞 宏定義中的參數可以有多個,實參可以是數字,寄存器或宏定義中的參數可以有多個,實參可以是數

37、字,寄存器或操作碼。宏定義還可用部分操作碼作參數,但在宏定義中必須操作碼。宏定義還可用部分操作碼作參數,但在宏定義中必須用用“&”作分隔符,作分隔符,&是一個操作符,它是一個操作符,它在宏定義體中可作為在宏定義體中可作為啞元的前綴,宏展開時,可以把啞元的前綴,宏展開時,可以把&前后兩個符號合并成一個符前后兩個符號合并成一個符號。號。例例5.12:宏定義帶一個參數,用宏指令實現將:宏定義帶一個參數,用宏指令實現將ax中內容右移任意次(小中內容右移任意次(小于于256)。 宏定義:宏定義:shiftmacronmovcl,nsalax,clendm宏調用宏調用1:shift

38、4宏調用宏調用2:shift8宏展開宏展開1:movcl,4;ax中內容算術左移中內容算術左移4次次salax,cl宏展開宏展開2:movcl,8;ax中內容算術左移中內容算術左移8次次salax,cl5.宏定義嵌套宏定義嵌套在宏定義中允許使用宏調用,但必須先定義后調用。在宏定義中允許使用宏調用,但必須先定義后調用。 例例5.14:宏定義:宏定義:ad1macrom,nmovbx,maddax,nendmad1mmacror1,r2,r3pushaxpushbxad1r1,r2movx3,axpopbxpopaxendm宏調用:宏調用:ad1mcx,bx,dx宏展開:宏展開:pushaxpus

39、hbxad1r1,r2 ;此語句不占內存;此語句不占內存movbx,cx ;ad1宏定義展開宏定義展開addax,bxmovdx,axpopbxpopax6.取消宏定義語句取消宏定義語句格式為:格式為:purge 宏指令名,宏指令名宏指令名,宏指令名purge:偽指令助記符,不可缺省,因為經過定義的宏指令名,不:偽指令助記符,不可缺省,因為經過定義的宏指令名,不允許重新定義,必須用允許重新定義,必須用purge語句將其取消后,才能重新定義,此語句將其取消后,才能重新定義,此語句一次可以取消多個宏指令名。語句一次可以取消多個宏指令名。 7.7.宏指令與子程序的區別宏指令與子程序的區別過程調用使用

40、過程調用使用callcall語句,由語句,由cpucpu執行,宏指令調用由宏匯編程執行,宏指令調用由宏匯編程序序masmmasm中宏處理程序來識別。中宏處理程序來識別。過程調用時,每調用一次都要保留程序的斷點和保護現場,過程調用時,每調用一次都要保留程序的斷點和保護現場,返回時要恢復現場和恢復返回時要恢復現場和恢復斷點,增加了操作時間,執行速度慢。斷點,增加了操作時間,執行速度慢。而宏指令調用時,不需要這些入棧及出棧操作,執行速度較快。而宏指令調用時,不需要這些入棧及出棧操作,執行速度較快。過程調用的子程序與主程序分開獨立存在,經匯編后在存儲過程調用的子程序與主程序分開獨立存在,經匯編后在存儲

41、器中只占有一個子程序段的空間,主程序轉入此處運行,因此器中只占有一個子程序段的空間,主程序轉入此處運行,因此目標代碼長度短,節省內存空間。而宏調用是在匯編過程中展目標代碼長度短,節省內存空間。而宏調用是在匯編過程中展開,宏調用多少次,就插入多少次,因此目標代碼長度大開,宏調用多少次,就插入多少次,因此目標代碼長度大,占,占內存空間多;內存空間多;一個子程序設計,一般完成某一個功能,多次調用完成相同一個子程序設計,一般完成某一個功能,多次調用完成相同操作,僅入口參數可以改變,而宏指令可以帶啞元,調用時可操作,僅入口參數可以改變,而宏指令可以帶啞元,調用時可以用實元取代,使不同的調用完成不同的操作

42、,增加使用的靈以用實元取代,使不同的調用完成不同的操作,增加使用的靈活性。活性。 5.6.2 重復匯編重復匯編重復匯編偽指令語句有以下三種:重復匯編偽指令語句有以下三種:1定重復定重復格式:格式:rept表達式表達式宏體宏體endm其中,其中,reptendm:偽指令助記符,必須成對出現,不:偽指令助記符,必須成對出現,不可省略。宏體:表示需要重復的語句序列可省略。宏體:表示需要重復的語句序列。表達式:表示重。表達式:表示重復次數。復次數。例例5.16:將將2、4、8、16、32分配給連續的分配給連續的5個存儲單元。個存儲單元。num=1rept 5num=num*2db numendm匯編后

43、匯編后: db 2db 4db 8db 16db 322不定重復不定重復格式:格式:irp形參,實參表形參,實參表宏體宏體endm其中,其中,irpendm:偽指令助記符,必須成對出現,不可省略。:偽指令助記符,必須成對出現,不可省略。宏體:要重復的宏體:要重復的語句序列,重復次數由參數個數決定。實數表中語句序列,重復次數由參數個數決定。實數表中是每次重復時將要取的實參,實參之間用逗號隔開,實參表用尖是每次重復時將要取的實參,實參之間用逗號隔開,實參表用尖括號括起來。每次重復,依次取實參表中一項,代入語句序括號括起來。每次重復,依次取實參表中一項,代入語句序列中啞元。前面將列中啞元。前面將2、

44、4、8、16、32分配給分配給連續的連續的5個存儲單元的個存儲單元的例子也可以用如下不定重復偽指令:例子也可以用如下不定重復偽指令:irpnum,2,4,8,16,32dbnumendm例例5.17:若要把若要把ax,bx,cx,dx的內容壓入堆棧,則可以用的內容壓入堆棧,則可以用如下不定重復偽指令:如下不定重復偽指令:irpreg,ax,bx,cx,dxpushregendm匯編后展開為以下四匯編后展開為以下四條指令:條指令:push axpush bxpush cxpush dx 3不定重復字符不定重復字符 格式為:格式為: irpc 形式參數,字符串形式參數,字符串宏體宏體endm其中,

45、其中,irpc.endm:偽指令助記符,必須成對出現,不可省略。:偽指令助記符,必須成對出現,不可省略。宏體:重復宏體:重復執行的語句序列,每次重復時依次用字符串中字符代替執行的語句序列,每次重復時依次用字符串中字符代替形式參數,重復次數取決于字符串中形式參數,重復次數取決于字符串中字符的個數。字符串:可用尖字符的個數。字符串:可用尖括號也可不用尖括號括起來。括號也可不用尖括號括起來。例例5.18:若要從堆棧中彈出若要從堆棧中彈出4個字,分別送入個字,分別送入dx,cx,bx,ax,則可用如下不定重復字符偽指令:則可用如下不定重復字符偽指令:irpcreg,popreg&xendm匯編

46、后展開為以下四條指令:匯編后展開為以下四條指令:popdxpopcxpopbxpopax5.6.3 條件匯編條件匯編 條件匯編是對給定的條件進行測試,匯編程序根據測試結果,條件匯編是對給定的條件進行測試,匯編程序根據測試結果,將一段程序嵌入源程序匯編或不進行匯編,它的一般格式為:將一段程序嵌入源程序匯編或不進行匯編,它的一般格式為:if表達式表達式指令體指令體1;條件為真匯編指令體;條件為真匯編指令體1else指令體指令體2;條件為假匯編指令體;條件為假匯編指令體2endif其中,其中,ifendif:條件匯編偽指令助記符,必須成對出現,不:條件匯編偽指令助記符,必須成對出現,不可省略。可省略

47、。if語句后的語句后的“”是指定的條件。如果是指定的條件。如果“if”指定的條指定的條件為真時則宏匯編程序將指令體件為真時則宏匯編程序將指令體1中的中的語句匯編成相應的目標代碼,否語句匯編成相應的目標代碼,否則就把指令體則就把指令體2中的語句匯編成相應的目標代碼。中的語句匯編成相應的目標代碼。else:是任選部分,如果沒有:是任選部分,如果沒有else,那么,那么“if”指定的條件滿足指定的條件滿足就匯編,否則就不匯編。就匯編,否則就不匯編。“if”條件匯編的形式見條件匯編的形式見表表5.1所示:所示:偽指令匯編條件if 表達式表達式的值不等于0 ,條件滿足ife 表達式表達式的值等于0 ,條

48、件滿足ifdef 符號符號已定義或被說明為外部符號e x t r nifndef 符號符號未定義或未被說明為外部符號e x t r nifb 變量為空,條件滿足ifnb 變量不為空,條件滿足ifidn , 字符串1 和字符 串2 相同,條件滿足ifdif , 字符串1 和字符 串2 不相同,條件滿 足例例5.20:利用條件匯編偽指令,可以根據不同情況,產生無條件利用條件匯編偽指令,可以根據不同情況,產生無條件轉移指令如轉移指令如jmp,或產生條件轉移指令如,或產生條件轉移指令如je、jne、jb、jnb等。等。宏定義:宏定義:gotomacrolop,x,rel,yifbreljmplopel

49、semoval,xcmpal,yj&rel lopendifendm宏調用:宏調用:gotolop1,var1,e,var2gotoexit1宏展開:宏展開:mov al,var1cmp al,var2jelop1jmpexit15.7 dos功能子程序的調用功能子程序的調用 為了了解程序運行過程中的情況,應設法將運算結果顯示到顯示為了了解程序運行過程中的情況,應設法將運算結果顯示到顯示器上,最簡單的方法就是調用操作系統的器上,最簡單的方法就是調用操作系統的i/o子程序,我們稱為子程序,我們稱為dos功能功能調用。調用。dos為程序設計人員提供了許多可直接調用的功能為程序設計人員提供了

50、許多可直接調用的功能子程序。調用時需要使用軟中斷指令:子程序。調用時需要使用軟中斷指令:int n其中:其中:n為中斷調用類型號,其值為為中斷調用類型號,其值為00ffh。在使用。在使用int指令前,指令前,應將調用的功能號送入應將調用的功能號送入ah,有關入口參量送入指定寄存器中。若,有關入口參量送入指定寄存器中。若有出口參量,中斷調用返回后,有出口參量,中斷調用返回后,結果在指定的寄存器或存儲單元中。結果在指定的寄存器或存儲單元中。dos功能子程序的調用使用軟中斷指令功能子程序的調用使用軟中斷指令“int 21h”。dos共有共有84個功能子程序。這些子程序的主要功能是:磁盤的讀寫控制、文

51、件個功能子程序。這些子程序的主要功能是:磁盤的讀寫控制、文件操作、目錄操作、內存管理、基本輸入輸出管理及設置操作、目錄操作、內存管理、基本輸入輸出管理及設置/讀出系統日讀出系統日期、時間等。期、時間等。下面例舉部分常用的下面例舉部分常用的dos功能子程序。功能子程序。1帶顯示的鍵盤輸入(帶顯示的鍵盤輸入(1號功能)號功能) 該功能子程序等待鍵盤輸入,直接按下一個鍵(即該功能子程序等待鍵盤輸入,直接按下一個鍵(即輸入一個字符),把字符的輸入一個字符),把字符的ascii碼送入碼送入al,并在屏,并在屏幕上顯示該字符。如果按下的鍵是幕上顯示該字符。如果按下的鍵是ctrl-c組合鍵,則組合鍵,則停止

52、程序運行。如果按下停止程序運行。如果按下tab制表鍵,屏幕上光標自制表鍵,屏幕上光標自動擴展到緊接著的動擴展到緊接著的8個字符位置后面。個字符位置后面。1號功能調用,號功能調用,毋需入口參量,出口參量在毋需入口參量,出口參量在al中。如:中。如:movah,01hint21h2不帶顯示的鍵盤輸入(不帶顯示的鍵盤輸入(7號功能)號功能) 與與1號功能類似,它僅等待鍵盤輸入一個字符,并將字號功能類似,它僅等待鍵盤輸入一個字符,并將字符的符的ascii碼送入碼送入al中。但按下中。但按下ctrl-c組合鍵和組合鍵和tab制表制表鍵無反應。調用方法如下:鍵無反應。調用方法如下:movah,7int21

53、h 緩沖區第一個字節存放它能保存的最大字符數(緩沖區第一個字節存放它能保存的最大字符數(1255,不能為,不能為0!),該值由用戶程序自己事先設置。如!),該值由用戶程序自己事先設置。如果鍵如的字符數比此數大,那就會發出果鍵如的字符數比此數大,那就會發出“嘟嘟嘟嘟”聲,而且聲,而且光標不再向右移動。光標不再向右移動。緩沖區第二個字節存放用戶本次調用時實際輸入的字符數緩沖區第二個字節存放用戶本次調用時實際輸入的字符數(回車鍵除外(回車鍵除外),這個數由),這個數由dos返回時自動填入。用戶從返回時自動填入。用戶從鍵盤輸入的字符從第三個字節開始存放,直到用戶輸入回鍵盤輸入的字符從第三個字節開始存放

54、,直到用戶輸入回車鍵為止,并將回車鍵碼(車鍵為止,并將回車鍵碼(0dh)加在剛才輸入字符串的)加在剛才輸入字符串的末尾上。末尾上。調用時,用調用時,用ds:dx寄存器指向輸入緩沖區寄存器指向輸入緩沖區的段基值:偏移的段基值:偏移量。例如在數據區定義的字符緩沖區如下:量。例如在數據區定義的字符緩沖區如下:maxlendb18actlendb?stringdb18dup(0) 則輸入串的指令如下:則輸入串的指令如下: mov ax,segmaxlen mov ds,ax mov dx,offsetmaxlen mov ah,0ah int21h5字符顯示(字符顯示(2號功能)號功能)本功能子程序僅

55、在屏幕上顯示單個字符。要顯示字符的本功能子程序僅在屏幕上顯示單個字符。要顯示字符的ascii碼存放碼存放在在dl中。如果中。如果dl中存放退格鍵編碼,在屏幕上便向左移一個字符位中存放退格鍵編碼,在屏幕上便向左移一個字符位置,并使該位置成為空格。移動后光標停留在那里。如要顯示字符置,并使該位置成為空格。移動后光標停留在那里。如要顯示字符a,可用下列幾條指令調用:,可用下列幾條指令調用:movdl,amovah,2int21h6字符打印(字符打印(5號功能)號功能)5號功能子程序把號功能子程序把dl中的字符(中的字符(ascii碼)送入打印機接口,打印輸出。碼)送入打印機接口,打印輸出。功能調用為

56、:功能調用為:movdl,amovah,5int21h7字符串顯示(字符串顯示(9號功能)號功能) 9號功能子程序能在屏幕上顯示多于一個的字符串。要顯示的字符號功能子程序能在屏幕上顯示多于一個的字符串。要顯示的字符串必須先放串必須先放在內存一數據區中,且字符串以美元符號在內存一數據區中,且字符串以美元符號作為結束標作為結束標志。非顯示字符,可以用它的志。非顯示字符,可以用它的ascii碼插入字符串中間。進行碼插入字符串中間。進行9號功能號功能調用時,先把待顯示的字符串首地址的段基值調用時,先把待顯示的字符串首地址的段基值和偏移量分別存入和偏移量分別存入ds和和dx中。中。在數據段中定義一個待顯

57、示符號串如:在數據段中定義一個待顯示符號串如:stringdb“this is a program”,0ah,0dh,“”則顯示該符號串的指令為:則顯示該符號串的指令為:leadx,stringmovah,9int21h8取中斷向量(取中斷向量(35h號功能)號功能) 35h號功能把由號功能把由al指定的中斷類型號的中斷向量從中斷指定的中斷類型號的中斷向量從中斷向量表中取到向量表中取到es:bx中。即必須把要取出的中斷類型號中。即必須把要取出的中斷類型號n送送給給al,調用,調用35h功能后,與中斷類型號功能后,與中斷類型號n對應的中斷向量則對應的中斷向量則保存在保存在es:bx中。其調用示例

58、如下:中。其調用示例如下:moval,nmovah,35hint21h9設置中斷向量(設置中斷向量(25h號功能)號功能) 25h號功能把由號功能把由al指定的中斷類型的中斷向量指定的中斷類型的中斷向量ds:dx放置在中斷向量表中。具體設置過程為:首先將要設置的中放置在中斷向量表中。具體設置過程為:首先將要設置的中斷類型號送斷類型號送al,然后把要設置的中斷服務程序的段地址和,然后把要設置的中斷服務程序的段地址和偏移量分別送偏移量分別送ds、dx,最后再調用,最后再調用25h功能。典型的使用功能。典型的使用dos功能調用存取中斷向量的程序段如下:功能調用存取中斷向量的程序段如下:moval,n

59、;取出并保存原中斷向量;取出并保存原中斷向量movah,35hint21hpushbxpushespushdsmovax,seg interruptmovds,axmovdx,offset interruptmoval,nmovah,25hint21hpopdspopds恢復原中斷向量恢復原中斷向量popdxmoval,nmovah,25hint21hmovah,4ch;返回;返回dosint21hinterrupt:;中斷服務程序;中斷服務程序iret10讀出系統日期(讀出系統日期(2ah號功能)號功能) 本功能子程序的執行,將系統的年、月、日、星期的數據讀本功能子程序的執行,將系統的年、月

60、、日、星期的數據讀出,并存入指定的寄存器中:出,并存入指定的寄存器中:cx 年年(19802099)dh 月(月(112)dl 日(日(131)al 星期(星期(0星期日,星期日,1星期一等)星期一等)11設置系統日期(設置系統日期(2bh功能)功能) 調用本功能子程序時,必須在調用本功能子程序時,必須在cx和和dx中設置有效日期,其中設置有效日期,其中,中,cx中存放年號(中存放年號(19802099),),dh中存放月號(中存放月號(112),),dl中存放日(中存放日(131)。如果日期設置有效,待功能子)。如果日期設置有效,待功能子程序返回時,(程序返回時,(al)=0,否則(,否則(al)=0ffh。所以為了檢查。所以為了檢查設置是否成功,通常在調用設置是否成功,通常在調用2bh號功能后檢查號功能后檢查al中內容。中內容。 12讀出系統時間(讀出系統時間(2ch功能)

溫馨提示

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

評論

0/150

提交評論