版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
3.6子程序設(shè)計子程序的概念子程序的調(diào)用和返回指令子程序及其調(diào)用程序設(shè)計過程的定義及功能調(diào)用3.6.1子程序的概念把功能相對獨立的程序段單獨編寫和調(diào)試,作為一個相對獨立的模塊供程序使用,就形成子程序。子程序可以實現(xiàn)源程序的模塊化,可以簡化源程序結(jié)構(gòu),可以提高編程效率。基本定義:子程序調(diào)用:進(jìn)入子程序的操作;子程序返回:子程序返回到主程序的操作;主程序與子程序相互傳遞的信息稱為參數(shù);主程序提供給子程序以便加工處理的信息稱為入口參數(shù);經(jīng)子程序加工處理后回送給主程序的信息稱為出口參數(shù)。
3.6.2.子程序/過程調(diào)用和返回指令過程(子程序)一段具有特定功能的,供其它程序調(diào)用的公用程序。特點調(diào)用子程序時,IP(CS)的內(nèi)容被壓入堆棧棧頂。從子程序返回時,棧頂?shù)膬?nèi)容又被彈出到IP(CS)。子程序執(zhí)行結(jié)束后一般均要返回調(diào)用程序。一次定義,多次調(diào)用;可帶參數(shù)調(diào)用,以完成不同的功能。優(yōu)點程序代碼短,結(jié)構(gòu)清晰,便于編程、調(diào)試、修改和閱讀。兩條相關(guān)指令:子程序調(diào)用指令CALL子程序返回指令RET一般格式:CALLsub
;sub為子程序的入口根據(jù)子程序入口的尋址方式,子程序調(diào)用有四類。①段內(nèi)直接調(diào)用子程序的偏移地址直接由CALL指令給出。格式:CALLnear_proc
CALL執(zhí)行時,它首先將IP內(nèi)容壓棧,然后把指令中給出的位移量加到IP上。
注:匯編以后的調(diào)用地址是相對于CALL的下一條指令的位移量。例:CALL0120H;子程序偏移地址由指令給出(1)調(diào)用指令CALL位移量由匯編程序在匯編時進(jìn)行計算,如下例:CS:0102 CALL0120H ;3字節(jié)
CS:0105……
則位移量為:0120-0105H=001BH于是CALL 0120H的機(jī)器碼為E81B00CS:0102 E8CS:0103 1BCALL0120HCS:0104 00CS:0105……
子程序的偏移地址在寄存器或存儲器中。格式:CALLmem16/reg16CALL執(zhí)行時,它首先將IP內(nèi)容壓棧,然后把指定的寄存器/存儲器的內(nèi)容送入IP。例:CALL AX;調(diào)用地址由AX給出 CALL WORDPTR[SI];調(diào)用地址由存儲器給出②段內(nèi)間接調(diào)用CALL
IPHIPL代碼段數(shù)據(jù)段對于CALLWORDPTR[SI]這條指令若:(DS)
=
8000H,(SI)
=
1200H則指令操作圖示如下。81200H81201H子程序的段地址和偏移地址直接由CALL指令給出。
格式:CALLfar_proc;far_proc為遠(yuǎn)過程的地址指令的操作為:
“SP←(SP)-2”((SP)-2,(SP)-1))←(CS);CS壓棧CS←段地址
“SP←(SP)-2”((SP)-4,(SP)-3))←(IP);IP壓棧IP←偏移地址例:CALL 2000H:1000H③段間直接調(diào)用子程序的段和偏移地址為存儲器的連續(xù)4個單元中的內(nèi)容。
格式:CALLmem32指令的操作為:
“SP←(SP)-2”((SP)-2,(SP)-1))←(CS);CS壓棧CS←(mem32+2)
“SP←(SP)-2”((SP)-4,(SP)-3))←(IP);IP壓棧IP←(mem32)例:CALLDWORD
PTR[DI]
調(diào)用地址在[DI],[DI]+1,[DI]+2,[DI]+3四個存儲單元中。低字內(nèi)容為偏移地址,高字內(nèi)容為段地址。④段間間接調(diào)用CALL代碼段數(shù)據(jù)段
IPHIPL
CSHCSL[DI][DI]+1[DI]+2[DI]+3段間間接調(diào)用示意圖CALLDWORD
PTR[DI]
例:下面的程序執(zhí)行后,(AX)=?(DX)=?
CS:2000HMOVAX,2012H2003HMOVCX,200CH2006HPUSHCX2007HCALL4000H200AHADDAX,BX200CHADDAX,DX200EHHLT…………CS:4000HMOVBX,200AHPOPDXRET段內(nèi)返回指令RET的操作為:
IP←((SP)+1,(SP));棧頂內(nèi)容彈出到IPSP←(SP)+2段間返回指令RET的操作為:
IP←((SP)+1,(SP));棧頂內(nèi)容彈出到IP
“SP←(SP)+2”CS←((SP)+3,(SP)+2);棧頂內(nèi)容彈出到CS
“SP←(SP)+2”另有一種帶立即數(shù)返回指令:RETn其中n為偶數(shù),表示從棧頂彈出地址后另外丟棄的字節(jié)數(shù)。例:RET4;返回后再丟棄棧頂?shù)?個字節(jié)(2)返回指令RET過程的定義過程由偽指令PROC和ENDP定義。定義過程的格式為:
過程名PROC[NEAR]或FAR
過程名ENDP
其中,PROC和ENDP必須成對出現(xiàn),且前面都有同一過程名,過程的類型由PROC的操作數(shù)指出。若PROC后無操作數(shù),則默認(rèn)為NEAR類型。子程序也可以用“:”定義,“:”定義的標(biāo)號是為該子程序起的名字。主程序把用“:”定義的子程序作為遠(yuǎn)過程來調(diào)用。若子程序與調(diào)用它的主程序在同一代碼段,則必須用過程來定義該子程序。中斷調(diào)用都是遠(yuǎn)調(diào)用,所以中斷服務(wù)子程序用“:”定義。若用過程來定義中斷服務(wù)子程序定義過程為遠(yuǎn)過程,而不論他與調(diào)用程序是否在不同的代碼段。(1)NEAR屬性:調(diào)用程序和子程序在同一代碼段中(段內(nèi)調(diào)用)(2)FAR屬性:調(diào)用程序和子程序不在同一代碼段中(段間調(diào)用)codesegment
mainprocfar......
callsubr1......retmainendpsubr1procnear......retsubr1endpcodeendscodesegment
mainprocfar......
callsubr1......retsubr1procnear......retsubr1endpmainendpcodeends例1調(diào)用程序和子程序在同一代碼段中例2調(diào)用程序和子程序不在同一代碼段中
sagxsegment
subtprocfar......retsubtendp......
callsubt......
segxendssegysegment
......
callsubt......
segyends段的定義段的定義通過SEGMENT和ENDS偽指令進(jìn)行。定義一個段的格式是:段名
SEGMENT[定位方式][組合方式]['類別名']
段名ENDS
其中,SEGMENT和ENDS必須成對出現(xiàn),它們的前面需有相同的名字,該名字為段名。
例:STACKSEGMENTSTACKDW20DUP(?)STACKENDS
偽指令SEGMENT有3個可選擇的操作數(shù):定位方式,組合方式和類別名。匯編地址計數(shù)器匯編地址計數(shù)器用符號$表示,它用來記錄正在被匯編程序匯編的指令的地址,即它的內(nèi)容標(biāo)出了匯編程序當(dāng)前的工作位置。匯編程序為每個段分配一個匯編地址計數(shù)器。對需要分配存儲單元的變量和產(chǎn)生目標(biāo)代碼的指令,$就按存儲單元數(shù)和目標(biāo)代碼的長度增值。因此,段內(nèi)定義的所有標(biāo)號和變量的偏移地址就是當(dāng)前值。
DATASEGMENTBUFDB'ABCDEF'COUNTEQU$-BUFDATAENDS
常量COUNT的值就是變量BUF數(shù)據(jù)區(qū)所占的存儲單元數(shù)16。
$可以用作指令的操作數(shù),此時$的值就是該指令的偏移地址。
$也可以出現(xiàn)在表達(dá)式中。如:$的值可以用偽指令ORG來設(shè)置。其格式是:
ORG數(shù)值表達(dá)式功能是將$設(shè)置成數(shù)值表達(dá)式的值(0000H~FFFFH之間的整數(shù))。e.gORG$+8
段寄存器的假定
存儲單元的段地址來自某個段寄存器。源程序在代碼段的開始就要對段寄存器與段之間的關(guān)系作假定,以便宏匯編程序MASM匯編時根據(jù)指令給定的偏移地址和段寄存器中的段地址計算出正確的物理地址。段寄存器與段的關(guān)系,由偽指令A(yù)SSUME設(shè)定,設(shè)定格式是:
ASSUMESREG:SNAM[,SREG:SNAM,……]其中SREG為4個段寄存器CS、SS、DS、ES中的任一個,SNAM是段名。需要說明的是,偽指令A(yù)SSUME只是將段寄存器與段間的對應(yīng)關(guān)系告訴匯編程序,它并沒有將段首址置入對應(yīng)的段寄存器中,這一工作要到程序最后投入運行時才能完成。那時系統(tǒng)自動將代碼段和堆棧段的段首址分別置入CS和SS,將PSP(programsegmentprefix)的段首址同時置入DS和ES。因此CS和SS不用程序處理;但對DS和ES,則必須由程序?qū)⑵涠问字贩謩e置入。例如:CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMOVAX,DATAMOVDS,AX
…CODEENDS源程序的結(jié)束源程序的結(jié)束要用偽指令END,其格式是:
END[表達(dá)式]該偽指令用在源程序的最后,用以表示整個源程序的結(jié)束,即告訴匯編程序,匯編工作到此結(jié)束。其中可選項表達(dá)式的值必須是存儲器的地址,該地址即為程序的啟動地址,亦就是程序的第一條可執(zhí)行指令的地址。表達(dá)式一般為過程名。如果不帶表達(dá)式,則該程序不能單獨運行,只是供其他程序調(diào)用的子模塊。宏匯編源程序的格式宏匯編源程序一般由3個段組成,其格式如下:stacksegmentstack'stack'dw32dup(?)stackendsdatasegmentdataendscodesegmentbeginprocfarassumess:stack,cs:code,ds:data
pushdssubax,axpushaxmovax,datamovds,ax …… ……retbeginendpcodeendsendbegin常用系統(tǒng)功能調(diào)用
IBMPC微機(jī)系統(tǒng)為匯編用戶提供了兩個程序接口。一個是DOS系統(tǒng)功能調(diào)用,另一個是ROM中的BIOS(basicinput/outputsystem)。系統(tǒng)功能調(diào)用和BIOS由一系列的服務(wù)子程序構(gòu)成,但調(diào)用與返回不是使用子程序調(diào)用指令CALL和返回指令RET,而是通過軟中斷指令I(lǐng)NTN和中斷返回指令I(lǐng)RET調(diào)用和返回。我們僅介紹DOS系統(tǒng)功能調(diào)用。系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用是IBMPC微機(jī)系統(tǒng)為匯編用戶提供的一個程序接口。系統(tǒng)功能調(diào)用共有4類。我們僅介紹設(shè)備管理系統(tǒng)功能調(diào)用中基本的I/O管理功能。使用系統(tǒng)功能調(diào)用的一般過程為:把調(diào)用號放入AH中,設(shè)置入口參數(shù),然后執(zhí)行INT21H指令,最后分析處理出口參數(shù)。調(diào)用方法設(shè)置入口參數(shù)在AH設(shè)置功能號m執(zhí)行中斷指令I(lǐng)NTN分析、應(yīng)用出口參數(shù)
1.1號功能調(diào)用
MOVAH,1INT21H
執(zhí)行該調(diào)用時將等待鍵入,一旦有鍵按下就將該按鍵字符的ASCII碼讀入AL,并同時顯示該字符。
2.2號功能調(diào)用
MOVDL,待顯示字符的ASCII碼
MOVAH,2INT21H
本調(diào)用執(zhí)行后,顯示器顯示待顯示的字符。
3.9號功能調(diào)用
MOVDX,待顯示字符串的首偏移地址
MOVAH,9INT21H
本調(diào)用執(zhí)行后,顯示器顯示待顯示的字符串。執(zhí)行前要在D
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《留置針使用規(guī)范》課件
- 《小數(shù)數(shù)位順序表》課件
- 八下期中測試卷01【測試范圍:第1-11課】(原卷版)
- 旅游行業(yè)導(dǎo)游講解培訓(xùn)總結(jié)
- 2006年江蘇高考語文真題及答案
- 年度目標(biāo)設(shè)定與實現(xiàn)路徑計劃
- 幼兒園工作總結(jié)用心呵護(hù)溫馨成長
- 《焊工基礎(chǔ)知識》課件
- 2023年-2024年新員工入職前安全教育培訓(xùn)試題附參考答案(奪分金卷)
- 廚師個人述職報告15篇
- 人教版小學(xué)四年級數(shù)學(xué)上冊期末復(fù)習(xí)解答題應(yīng)用題大全50題及答案
- 冀教版五年級上冊脫式計算題100道及答案
- 你是排長我是兵(2022年山東濟(jì)南中考語文試卷記敘文閱讀題及答案)
- 《ISO56001-2024創(chuàng)新管理體系 - 要求》之22:“8運行-8.2 創(chuàng)新行動”解讀和應(yīng)用指導(dǎo)材料(雷澤佳編制-2024)
- 廣東省中山市2023-2024學(xué)年高三物理上學(xué)期第五次統(tǒng)測試題含解析
- 《體育科學(xué)研究方法》題庫
- 高級會計實務(wù)案例分析-第三章 企業(yè)全面預(yù)算管理
- DL∕T 5142-2012 火力發(fā)電廠除灰設(shè)計技術(shù)規(guī)程
- 城域網(wǎng)建設(shè)方案
- 政府會計 第二版 課件 第七章 凈資產(chǎn)與預(yù)算結(jié)余
- 2024年恩施州直事業(yè)單位選聘36人歷年(高頻重點提升專題訓(xùn)練)共500題附帶答案詳解
評論
0/150
提交評論