hAAAPPT]167;5.1匯編語(yǔ)言源程序的框架結(jié)構(gòu)_第1頁(yè)
hAAAPPT]167;5.1匯編語(yǔ)言源程序的框架結(jié)構(gòu)_第2頁(yè)
hAAAPPT]167;5.1匯編語(yǔ)言源程序的框架結(jié)構(gòu)_第3頁(yè)
hAAAPPT]167;5.1匯編語(yǔ)言源程序的框架結(jié)構(gòu)_第4頁(yè)
hAAAPPT]167;5.1匯編語(yǔ)言源程序的框架結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩64頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

2、ndpcodeendsendbegin區(qū)別:兩種格式的本質(zhì)區(qū)別在于返回區(qū)別:兩種格式的本質(zhì)區(qū)別在于返回dos的方法不同:的方法不同:對(duì)于第一種格式,對(duì)于第一種格式,采用了調(diào)用采用了調(diào)用dos系統(tǒng)的系統(tǒng)的4ch功能,返回功能,返回dos。具體方法是:在要返回具體方法是:在要返回dos處,安排如下兩條指令:處,安排如下兩條指令:movah,4chint21h對(duì)于第二格式,對(duì)于第二格式,dos返回方法是調(diào)用返回方法是調(diào)用20h類型的中斷服務(wù)程序。類型的中斷服務(wù)程序。 5.2 順序結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)程序設(shè)計(jì) 順序程序結(jié)構(gòu)是指完全按照順序逐條執(zhí)行的順序程序結(jié)構(gòu)是指完全按照順序逐條執(zhí)行的指令序列,這種結(jié)

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

4、.1的功能實(shí)現(xiàn)流程圖的功能實(shí)現(xiàn)流程圖 z(al)al(al)/2al(al)-(y)al(al)4al(x)結(jié)束開(kāi)始參考程序參考程序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;alx4subal,y;alx4ysaral,1;al(

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

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

7、 構(gòu)語(yǔ) 句 nif-then-else結(jié) 構(gòu)語(yǔ) 句 判 定 條 件語(yǔ) 句 5.3.1 用比較用比較/測(cè)試的方法實(shí)現(xiàn)測(cè)試的方法實(shí)現(xiàn)if-then-else結(jié)構(gòu)結(jié)構(gòu) 實(shí)現(xiàn)方法:在產(chǎn)生分支之前,通常用比較、測(cè)試的辦實(shí)現(xiàn)方法:在產(chǎn)生分支之前,通常用比較、測(cè)試的辦法在標(biāo)志寄存器中設(shè)置相應(yīng)的標(biāo)志位,然后再選用適當(dāng)法在標(biāo)志寄存器中設(shè)置相應(yīng)的標(biāo)志位,然后再選用適當(dāng)?shù)臈l件轉(zhuǎn)移指令,以實(shí)現(xiàn)不同情況的分支轉(zhuǎn)移。的條件轉(zhuǎn)移指令,以實(shí)現(xiàn)不同情況的分支轉(zhuǎn)移。(1)進(jìn)行比較,使用比較指令:)進(jìn)行比較,使用比較指令:cmpdest,src該指令進(jìn)行減法操作,而不保存結(jié)果,只設(shè)置標(biāo)志位。該指令進(jìn)行減法操作,而不保存結(jié)果,只設(shè)置

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

9、號(hào)進(jìn)行運(yùn)算,使bx指向?qū)?yīng)分支入口地址,最后即可使用指向?qū)?yīng)分支入口地址,最后即可使用jmp word ptr bx 或或jmp dword ptr bx 指指令實(shí)現(xiàn)所要轉(zhuǎn)到的分支;程序設(shè)計(jì)流程圖如令實(shí)現(xiàn)所要轉(zhuǎn)到的分支;程序設(shè)計(jì)流程圖如圖圖5.6所所示:示:建 立 地 址 表求 出 分 支 號(hào) 所 對(duì) 應(yīng) 分 支 在 地 址 表 的 存 放 地 址 ,并 送 bx接 收 分 支 號(hào) jmpword/dword ptr bx圖圖5.6 用地址表法實(shí)現(xiàn)多路分支的結(jié)構(gòu)框圖用地址表法實(shí)現(xiàn)多路分支的結(jié)構(gòu)框圖 例例5.4:編程實(shí)現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情。編程實(shí)現(xiàn)菜單選擇,根據(jù)不同的選擇做不同

10、的事情。 解:假設(shè)有解:假設(shè)有3路分支,在地址表中的入口地址分別:路分支,在地址表中的入口地址分別:a0、a1、a2;具體見(jiàn)圖;具體見(jiàn)圖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號(hào)號(hào)dos功能調(diào)用,接收分支號(hào)功能調(diào)用,接收分支號(hào)int21hcmpal,0;進(jìn)行合法判斷;進(jìn)行

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

13、ovah,4ch;返回;返回dosint21hcodeendsendstart5.3.3 用轉(zhuǎn)移表法實(shí)現(xiàn)用轉(zhuǎn)移表法實(shí)現(xiàn)case結(jié)構(gòu)(即多路分支)結(jié)構(gòu)(即多路分支) 用轉(zhuǎn)移表法實(shí)現(xiàn)用轉(zhuǎn)移表法實(shí)現(xiàn)case結(jié)構(gòu)的基本思路:將轉(zhuǎn)到各分支程序的轉(zhuǎn)結(jié)構(gòu)的基本思路:將轉(zhuǎn)到各分支程序的轉(zhuǎn)移指令依次羅列形成一個(gè)轉(zhuǎn)移表,讓移指令依次羅列形成一個(gè)轉(zhuǎn)移表,讓bx指向轉(zhuǎn)移表的首地址,從鍵指向轉(zhuǎn)移表的首地址,從鍵盤接收或其他方式獲取要轉(zhuǎn)到的分支號(hào),再讓盤接收或其他方式獲取要轉(zhuǎn)到的分支號(hào),再讓bx與分支號(hào)進(jìn)行運(yùn)算,與分支號(hào)進(jìn)行運(yùn)算,使使bx指向?qū)?yīng)轉(zhuǎn)移表中轉(zhuǎn)到該分支的轉(zhuǎn)移指令處,最后即可使用指向?qū)?yīng)轉(zhuǎn)移表中轉(zhuǎn)到該分支的轉(zhuǎn)移

14、指令處,最后即可使用jmp bx指令實(shí)現(xiàn)所要轉(zhuǎn)到的分支;具體見(jiàn)指令實(shí)現(xiàn)所要轉(zhuǎn)到的分支;具體見(jiàn)圖圖5.8所示:所示:建立地址表求出分支號(hào)所對(duì)應(yīng)分支在地址表的存放地 址,并送bx接收分支號(hào)jmp bx圖圖5.8 用轉(zhuǎn)移表法實(shí)現(xiàn)多路分支的結(jié)構(gòu)框圖用轉(zhuǎn)移表法實(shí)現(xiàn)多路分支的結(jié)構(gòu)框圖例例5.5:編程實(shí)現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情。編程實(shí)現(xiàn)菜單選擇,根據(jù)不同的選擇做不同的事情。解:假設(shè)有解:假設(shè)有3路分支,轉(zhuǎn)移表中的轉(zhuǎn)移指令分別為:路分支,轉(zhuǎn)移表中的轉(zhuǎn)移指令分別為:jmp short a0、jmp short a1、jmp short a2;具體見(jiàn);具體見(jiàn)圖圖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號(hào)號(hào)dos功能調(diào)用,接收分支號(hào)功能調(diào)用,接收分支號(hào)int21hcmpal,0jberrorcmpal,2jaerrorleabx,tab ;取地址表首址;取地址表首址subal,30hshlal,1;短轉(zhuǎn)移乘以;短轉(zhuǎn)移乘以2,近轉(zhuǎn)移乘以,近轉(zhuǎn)移乘以3,遠(yuǎn)轉(zhuǎn)移乘以,遠(yuǎn)轉(zhuǎn)移乘以5xorah,

17、ah;ah清零清零addbx,axjmpbx;產(chǎn)生多分支轉(zhuǎn)移;產(chǎn)生多分支轉(zhuǎn)移tab:jmpshort a0;轉(zhuǎn)移表;轉(zhuǎn)移表jmpshort a1jmpshort a2a0:leadx,s0;各分支程序段;各分支程序段movah,9int21hjmpexit1a1:leadx,s1movah,9int21hjmpexit1a2:lea dx,s2movah,9int21hjmpexit1error:movdx,offset ermovah,9int21hexit1: movah,4ch;返回;返回dosint21hcodeendsendstart5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序設(shè)計(jì) 5.4.

18、1 循環(huán)程序的組成循環(huán)程序的組成1.設(shè)置循環(huán)的初始狀態(tài)設(shè)置循環(huán)的初始狀態(tài)如置如置循環(huán)次數(shù)的計(jì)數(shù)值,以及為循環(huán)體正常工作的初始狀態(tài)等;循環(huán)次數(shù)的計(jì)數(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)程序設(shè)計(jì)的關(guān)鍵,每一個(gè)循環(huán)程序必須選擇一個(gè)循環(huán)它是循環(huán)程序設(shè)計(jì)的關(guān)鍵,每一個(gè)循環(huán)程序必須選擇一個(gè)循環(huán)控制條件來(lái)控制循環(huán)的運(yùn)行和結(jié)束控制條件來(lái)控制循環(huán)的運(yùn)行和結(jié)束,通常有兩種方法控制循環(huán):用通常有兩種方法控制循環(huán):用計(jì)數(shù)控制循環(huán)計(jì)數(shù)控制循環(huán),用條件控制循

19、環(huán)用條件控制循環(huán) 5.4.2 循環(huán)程序的結(jié)構(gòu)形式循環(huán)程序的結(jié)構(gòu)形式 循環(huán)程序有兩種結(jié)構(gòu),一種是循環(huán)程序有兩種結(jié)構(gòu),一種是do-while結(jié)構(gòu)形式,結(jié)構(gòu)形式,另一種是另一種是do-until結(jié)構(gòu)結(jié)構(gòu)形式。具體見(jiàn)圖形式。具體見(jiàn)圖5.10所示:所示: do-while結(jié)構(gòu)把對(duì)循環(huán)控制條件的判斷放在循環(huán)的入結(jié)構(gòu)把對(duì)循環(huán)控制條件的判斷放在循環(huán)的入口,先判斷條件,滿足條件就執(zhí)行循環(huán)體,否則退出循環(huán)???,先判斷條件,滿足條件就執(zhí)行循環(huán)體,否則退出循環(huán)。 do-until結(jié)構(gòu)是先執(zhí)行循環(huán)體然后再判斷控制條件,結(jié)構(gòu)是先執(zhí)行循環(huán)體然后再判斷控制條件,不滿足條件則繼續(xù)執(zhí)行循環(huán)操作,一旦滿足條件則退出循不滿足條件則繼

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

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

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

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

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

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

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

27、movds,axmovcx,y-array;循環(huán)次數(shù)初始化;循環(huán)次數(shù)初始化moval,num;插入值送;插入值送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 子程序設(shè)計(jì)子程序設(shè)計(jì) 5.5.1 子程序的構(gòu)造子程序的構(gòu)造前面我

28、們學(xué)習(xí)了過(guò)程定義偽指令,我們也就是用它們來(lái)構(gòu)成的子程序,前面我們學(xué)習(xí)了過(guò)程定義偽指令,我們也就是用它們來(lái)構(gòu)成的子程序,其格式為:其格式為:子程序名子程序名proc(near/far)保存信息保存信息恢復(fù)信息恢復(fù)信息ret子程序名子程序名endp5.5.2 子程序的調(diào)用與返回子程序的調(diào)用與返回 子程序的正確執(zhí)行是由子程序的正確調(diào)用和返回保證的。子程序的正確執(zhí)行是由子程序的正確調(diào)用和返回保證的。ibm pc機(jī)的機(jī)的call和和ret指令就分別完成了子程序的調(diào)指令就分別完成了子程序的調(diào)用和返回功能。用和返回功能。1.調(diào)用指令:調(diào)用指令:call 過(guò)程名過(guò)程名 執(zhí)行執(zhí)行call指令,首先保留斷點(diǎn)地址于

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

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

31、,則更不應(yīng)該因保存和恢復(fù)該寄存(即出口參數(shù))的寄存器,則更不應(yīng)該因保存和恢復(fù)該寄存器的內(nèi)容而破壞了應(yīng)該向主程序傳送的信息。器的內(nèi)容而破壞了應(yīng)該向主程序傳送的信息。3.選用適當(dāng)?shù)姆椒ㄔ谧映绦蚝椭鞒绦蛑g的進(jìn)行參數(shù)傳遞選用適當(dāng)?shù)姆椒ㄔ谧映绦蚝椭鞒绦蛑g的進(jìn)行參數(shù)傳遞 這種主程序與子程序之間的信息傳送稱為參數(shù)傳遞,它可這種主程序與子程序之間的信息傳送稱為參數(shù)傳遞,它可以有以下三種:以有以下三種: 用寄存器傳遞參數(shù)用寄存器傳遞參數(shù) 這是最常用的一種方式,通常在參量不多的時(shí)候使用這這是最常用的一種方式,通常在參量不多的時(shí)候使用這種方法。種方法。 用地址表傳遞參數(shù)用地址表傳遞參數(shù) 通過(guò)地址表傳送參數(shù)的方法

32、是在主程序中首先建立一個(gè)通過(guò)地址表傳送參數(shù)的方法是在主程序中首先建立一個(gè)地址表,把要傳送給子程序的參數(shù)都存放在地址表中,然地址表,把要傳送給子程序的參數(shù)都存放在地址表中,然后把地址表的首地址通過(guò)寄存器傳送到子程序中去;后把地址表的首地址通過(guò)寄存器傳送到子程序中去;最后最后子程序通過(guò)地址表取得所需參數(shù)。子程序通過(guò)地址表取得所需參數(shù)。 用堆棧傳遞參數(shù)用堆棧傳遞參數(shù) 這種方法是在主程序中把要傳送給子程序的參數(shù)先保存這種方法是在主程序中把要傳送給子程序的參數(shù)先保存到堆棧中,然后子程序再?gòu)亩褩V腥〕鰠?shù)以達(dá)到傳送參到堆棧中,然后子程序再?gòu)亩褩V腥〕鰠?shù)以達(dá)到傳送參數(shù)的目的。數(shù)的目的。 5.6 高級(jí)匯編語(yǔ)

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

34、,表示宏定義的開(kāi)始和結(jié)束,現(xiàn),表示宏定義的開(kāi)始和結(jié)束,endm前不帶宏指令名。前不帶宏指令名。宏體:一段有獨(dú)立功能的程序代碼段。宏體:一段有獨(dú)立功能的程序代碼段。形式參數(shù):又稱啞元,各個(gè)啞元之間用逗號(hào)隔開(kāi),可以缺省。形式參數(shù):又稱啞元,各個(gè)啞元之間用逗號(hào)隔開(kāi),可以缺省。2宏調(diào)用宏調(diào)用經(jīng)宏定義后的宏指令可以在源程序中調(diào)用,宏調(diào)用格式為:經(jīng)宏定義后的宏指令可以在源程序中調(diào)用,宏調(diào)用格式為:宏指令名宏指令名實(shí)參,實(shí)參實(shí)參,實(shí)參 宏調(diào)用只需要有宏指令名,若宏定義中有形參,那么宏調(diào)用時(shí)必須宏調(diào)用只需要有宏指令名,若宏定義中有形參,那么宏調(diào)用時(shí)必須帶有實(shí)際參數(shù)來(lái)替代形參,實(shí)際參數(shù)的個(gè)數(shù),順序,類型與形參一

35、一帶有實(shí)際參數(shù)來(lái)替代形參,實(shí)際參數(shù)的個(gè)數(shù),順序,類型與形參一一對(duì)應(yīng),各個(gè)實(shí)參之間用逗號(hào)分開(kā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ù),則個(gè)數(shù)大于形參個(gè)數(shù),則多余的實(shí)參不予考慮,若實(shí)參個(gè)數(shù)小于形參個(gè)數(shù),則多余的形參作多余的實(shí)參不予考慮,若實(shí)參個(gè)數(shù)小于形參個(gè)數(shù),則多余的形參作“空空”處理。處理。 3宏展開(kāi)宏展開(kāi) 匯編程序在對(duì)源程序匯編時(shí),對(duì)每個(gè)宏調(diào)用作宏展開(kāi)匯編程序在對(duì)源程序匯編時(shí),對(duì)每個(gè)宏調(diào)用作宏展開(kāi),每每條插入的宏體指令前帶上加號(hào)條插入的宏體指令前帶

36、上加號(hào)“+”。例例5.11:不帶參數(shù)的宏定義,用宏指令來(lái)實(shí)現(xiàn)回車換行。不帶參數(shù)的宏定義,用宏指令來(lái)實(shí)現(xiàn)回車換行。宏定義:宏定義:crlfmacromovdl,0dh;回車回車movah,2int21hmovdl,0ah;換行換行movah,2int21hendm宏調(diào)用:宏調(diào)用:crlf宏展開(kāi):將下述程序段替換宏調(diào)用語(yǔ)句。宏展開(kāi):將下述程序段替換宏調(diào)用語(yǔ)句。mov dl,0dh;回車回車mov ah,2int21hmov dl,0ah;換行換行mov ah,2int21h4.宏調(diào)用中參數(shù)傳遞宏調(diào)用中參數(shù)傳遞 宏定義中的參數(shù)可以有多個(gè),實(shí)參可以是數(shù)字,寄存器或宏定義中的參數(shù)可以有多個(gè),實(shí)參可以是數(shù)

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

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

39、hbxad1r1,r2 ;此語(yǔ)句不占內(nèi)存;此語(yǔ)句不占內(nèi)存movbx,cx ;ad1宏定義展開(kāi)宏定義展開(kāi)addax,bxmovdx,axpopbxpopax6.取消宏定義語(yǔ)句取消宏定義語(yǔ)句格式為:格式為:purge 宏指令名,宏指令名宏指令名,宏指令名purge:偽指令助記符,不可缺省,因?yàn)榻?jīng)過(guò)定義的宏指令名,不:偽指令助記符,不可缺省,因?yàn)榻?jīng)過(guò)定義的宏指令名,不允許重新定義,必須用允許重新定義,必須用purge語(yǔ)句將其取消后,才能重新定義,此語(yǔ)句將其取消后,才能重新定義,此語(yǔ)句一次可以取消多個(gè)宏指令名。語(yǔ)句一次可以取消多個(gè)宏指令名。 7.7.宏指令與子程序的區(qū)別宏指令與子程序的區(qū)別過(guò)程調(diào)用使用

40、過(guò)程調(diào)用使用callcall語(yǔ)句,由語(yǔ)句,由cpucpu執(zhí)行,宏指令調(diào)用由宏匯編程執(zhí)行,宏指令調(diào)用由宏匯編程序序masmmasm中宏處理程序來(lái)識(shí)別。中宏處理程序來(lái)識(shí)別。過(guò)程調(diào)用時(shí),每調(diào)用一次都要保留程序的斷點(diǎn)和保護(hù)現(xiàn)場(chǎng),過(guò)程調(diào)用時(shí),每調(diào)用一次都要保留程序的斷點(diǎn)和保護(hù)現(xiàn)場(chǎng),返回時(shí)要恢復(fù)現(xiàn)場(chǎng)和恢復(fù)返回時(shí)要恢復(fù)現(xiàn)場(chǎng)和恢復(fù)斷點(diǎn),增加了操作時(shí)間,執(zhí)行速度慢。斷點(diǎn),增加了操作時(shí)間,執(zhí)行速度慢。而宏指令調(diào)用時(shí),不需要這些入棧及出棧操作,執(zhí)行速度較快。而宏指令調(diào)用時(shí),不需要這些入棧及出棧操作,執(zhí)行速度較快。過(guò)程調(diào)用的子程序與主程序分開(kāi)獨(dú)立存在,經(jīng)匯編后在存儲(chǔ)過(guò)程調(diào)用的子程序與主程序分開(kāi)獨(dú)立存在,經(jīng)匯編后在存儲(chǔ)

41、器中只占有一個(gè)子程序段的空間,主程序轉(zhuǎn)入此處運(yùn)行,因此器中只占有一個(gè)子程序段的空間,主程序轉(zhuǎn)入此處運(yùn)行,因此目標(biāo)代碼長(zhǎng)度短,節(jié)省內(nèi)存空間。而宏調(diào)用是在匯編過(guò)程中展目標(biāo)代碼長(zhǎng)度短,節(jié)省內(nèi)存空間。而宏調(diào)用是在匯編過(guò)程中展開(kāi),宏調(diào)用多少次,就插入多少次,因此目標(biāo)代碼長(zhǎng)度大開(kāi),宏調(diào)用多少次,就插入多少次,因此目標(biāo)代碼長(zhǎng)度大,占,占內(nèi)存空間多;內(nèi)存空間多;一個(gè)子程序設(shè)計(jì),一般完成某一個(gè)功能,多次調(diào)用完成相同一個(gè)子程序設(shè)計(jì),一般完成某一個(gè)功能,多次調(diào)用完成相同操作,僅入口參數(shù)可以改變,而宏指令可以帶啞元,調(diào)用時(shí)可操作,僅入口參數(shù)可以改變,而宏指令可以帶啞元,調(diào)用時(shí)可以用實(shí)元取代,使不同的調(diào)用完成不同的操作

42、,增加使用的靈以用實(shí)元取代,使不同的調(diào)用完成不同的操作,增加使用的靈活性?;钚?。 5.6.2 重復(fù)匯編重復(fù)匯編重復(fù)匯編偽指令語(yǔ)句有以下三種:重復(fù)匯編偽指令語(yǔ)句有以下三種:1定重復(fù)定重復(fù)格式:格式:rept表達(dá)式表達(dá)式宏體宏體endm其中,其中,reptendm:偽指令助記符,必須成對(duì)出現(xiàn),不:偽指令助記符,必須成對(duì)出現(xiàn),不可省略。宏體:表示需要重復(fù)的語(yǔ)句序列可省略。宏體:表示需要重復(fù)的語(yǔ)句序列。表達(dá)式:表示重。表達(dá)式:表示重復(fù)次數(shù)。復(fù)次數(shù)。例例5.16:將將2、4、8、16、32分配給連續(xù)的分配給連續(xù)的5個(gè)存儲(chǔ)單元。個(gè)存儲(chǔ)單元。num=1rept 5num=num*2db numendm匯編后

43、匯編后: db 2db 4db 8db 16db 322不定重復(fù)不定重復(fù)格式:格式:irp形參,實(shí)參表形參,實(shí)參表宏體宏體endm其中,其中,irpendm:偽指令助記符,必須成對(duì)出現(xiàn),不可省略。:偽指令助記符,必須成對(duì)出現(xiàn),不可省略。宏體:要重復(fù)的宏體:要重復(fù)的語(yǔ)句序列,重復(fù)次數(shù)由參數(shù)個(gè)數(shù)決定。實(shí)數(shù)表中語(yǔ)句序列,重復(fù)次數(shù)由參數(shù)個(gè)數(shù)決定。實(shí)數(shù)表中是每次重復(fù)時(shí)將要取的實(shí)參,實(shí)參之間用逗號(hào)隔開(kāi),實(shí)參表用尖是每次重復(fù)時(shí)將要取的實(shí)參,實(shí)參之間用逗號(hào)隔開(kāi),實(shí)參表用尖括號(hào)括起來(lái)。每次重復(fù),依次取實(shí)參表中一項(xiàng),代入語(yǔ)句序括號(hào)括起來(lái)。每次重復(fù),依次取實(shí)參表中一項(xiàng),代入語(yǔ)句序列中啞元。前面將列中啞元。前面將2、

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

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

46、后展開(kāi)為以下四條指令:匯編后展開(kāi)為以下四條指令:popdxpopcxpopbxpopax5.6.3 條件匯編條件匯編 條件匯編是對(duì)給定的條件進(jìn)行測(cè)試,匯編程序根據(jù)測(cè)試結(jié)果,條件匯編是對(duì)給定的條件進(jìn)行測(cè)試,匯編程序根據(jù)測(cè)試結(jié)果,將一段程序嵌入源程序匯編或不進(jìn)行匯編,它的一般格式為:將一段程序嵌入源程序匯編或不進(jìn)行匯編,它的一般格式為:if表達(dá)式表達(dá)式指令體指令體1;條件為真匯編指令體;條件為真匯編指令體1else指令體指令體2;條件為假匯編指令體;條件為假匯編指令體2endif其中,其中,ifendif:條件匯編偽指令助記符,必須成對(duì)出現(xiàn),不:條件匯編偽指令助記符,必須成對(duì)出現(xiàn),不可省略??墒÷?/p>

47、。if語(yǔ)句后的語(yǔ)句后的“”是指定的條件。如果是指定的條件。如果“if”指定的條指定的條件為真時(shí)則宏匯編程序?qū)⒅噶铙w件為真時(shí)則宏匯編程序?qū)⒅噶铙w1中的中的語(yǔ)句匯編成相應(yīng)的目標(biāo)代碼,否語(yǔ)句匯編成相應(yīng)的目標(biāo)代碼,否則就把指令體則就把指令體2中的語(yǔ)句匯編成相應(yīng)的目標(biāo)代碼。中的語(yǔ)句匯編成相應(yīng)的目標(biāo)代碼。else:是任選部分,如果沒(méi)有:是任選部分,如果沒(méi)有else,那么,那么“if”指定的條件滿足指定的條件滿足就匯編,否則就不匯編。就匯編,否則就不匯編?!癷f”條件匯編的形式見(jiàn)條件匯編的形式見(jiàn)表表5.1所示:所示:偽指令匯編條件if 表達(dá)式表達(dá)式的值不等于0 ,條件滿足ife 表達(dá)式表達(dá)式的值等于0 ,條

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

49、semoval,xcmpal,yj&rel lopendifendm宏調(diào)用:宏調(diào)用:gotolop1,var1,e,var2gotoexit1宏展開(kāi):宏展開(kāi):mov al,var1cmp al,var2jelop1jmpexit15.7 dos功能子程序的調(diào)用功能子程序的調(diào)用 為了了解程序運(yùn)行過(guò)程中的情況,應(yīng)設(shè)法將運(yùn)算結(jié)果顯示到顯示為了了解程序運(yùn)行過(guò)程中的情況,應(yīng)設(shè)法將運(yùn)算結(jié)果顯示到顯示器上,最簡(jiǎn)單的方法就是調(diào)用操作系統(tǒng)的器上,最簡(jiǎn)單的方法就是調(diào)用操作系統(tǒng)的i/o子程序,我們稱為子程序,我們稱為dos功能功能調(diào)用。調(diào)用。dos為程序設(shè)計(jì)人員提供了許多可直接調(diào)用的功能為程序設(shè)計(jì)人員提供了

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

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

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

53、h 緩沖區(qū)第一個(gè)字節(jié)存放它能保存的最大字符數(shù)(緩沖區(qū)第一個(gè)字節(jié)存放它能保存的最大字符數(shù)(1255,不能為,不能為0!),該值由用戶程序自己事先設(shè)置。如?。?,該值由用戶程序自己事先設(shè)置。如果鍵如的字符數(shù)比此數(shù)大,那就會(huì)發(fā)出果鍵如的字符數(shù)比此數(shù)大,那就會(huì)發(fā)出“嘟嘟嘟嘟”聲,而且聲,而且光標(biāo)不再向右移動(dòng)。光標(biāo)不再向右移動(dòng)。緩沖區(qū)第二個(gè)字節(jié)存放用戶本次調(diào)用時(shí)實(shí)際輸入的字符數(shù)緩沖區(qū)第二個(gè)字節(jié)存放用戶本次調(diào)用時(shí)實(shí)際輸入的字符數(shù)(回車鍵除外(回車鍵除外),這個(gè)數(shù)由),這個(gè)數(shù)由dos返回時(shí)自動(dòng)填入。用戶從返回時(shí)自動(dòng)填入。用戶從鍵盤輸入的字符從第三個(gè)字節(jié)開(kāi)始存放,直到用戶輸入回鍵盤輸入的字符從第三個(gè)字節(jié)開(kāi)始存放

54、,直到用戶輸入回車鍵為止,并將回車鍵碼(車鍵為止,并將回車鍵碼(0dh)加在剛才輸入字符串的)加在剛才輸入字符串的末尾上。末尾上。調(diào)用時(shí),用調(diào)用時(shí),用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號(hào)功能)號(hào)功能)本功能子程序僅

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

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

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

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

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

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

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論