匯編語(yǔ)言-子程序_第1頁(yè)
匯編語(yǔ)言-子程序_第2頁(yè)
匯編語(yǔ)言-子程序_第3頁(yè)
匯編語(yǔ)言-子程序_第4頁(yè)
匯編語(yǔ)言-子程序_第5頁(yè)
已閱讀5頁(yè),還剩16頁(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)介

本章學(xué)習(xí)要點(diǎn):(1)子程序的編寫格式(2)子程序調(diào)用時(shí)的參數(shù)傳遞方法(3)嵌套及遞歸子程序一、過(guò)程定義語(yǔ)句(process)利用過(guò)程定義偽指令語(yǔ)句,可把程序片段說(shuō)明為具有近類型或遠(yuǎn)類型的過(guò)程,并且能給過(guò)程取一個(gè)名字。過(guò)程定于語(yǔ)句的格式如下:過(guò)程名PROC[NEAR|FAR]…過(guò)程名ENDP過(guò)程的類型在過(guò)程定義開始語(yǔ)句PROC中指定;過(guò)程可以被指定位近(NEAR)類型,也可以被指定為遠(yuǎn)類型。如果不指定,則通常默認(rèn)為近類型;定義一個(gè)過(guò)程的開始語(yǔ)句PROC和結(jié)束語(yǔ)句ENDP前使用的過(guò)程名稱必須一致,從而保持配對(duì)。2021/5/91

像普通標(biāo)號(hào)一樣,過(guò)程名具有段值、偏移和類型這三個(gè)屬性。

過(guò)程名的段值和偏移是對(duì)應(yīng)過(guò)程入口(過(guò)程定義開始偽指令語(yǔ)句后的指令語(yǔ)句)的段值和偏移。 例:下面程序片段運(yùn)行后,AL=?,BL=?。

XORAL,AL CALLSUBS MOVBL,AL CALLSUBS RCRAL,1 HLT ;停機(jī),halt SUBSPROCNEAR NOTAL JSNEXT STC ;CF=1,

SeTCf=1 NEXT:RET SUBSENDP2021/5/92

例:用程序調(diào)用的方法,完成一個(gè)把16位二進(jìn)制數(shù)轉(zhuǎn)換為4位十六進(jìn)制ASCII碼的轉(zhuǎn)換程序。 子程序說(shuō)明:入口參數(shù):DX=欲轉(zhuǎn)換的二進(jìn)制數(shù);

DS:BX=存放轉(zhuǎn)換所得ASCII碼串的緩沖區(qū)首地址,轉(zhuǎn)換后的ASCII碼串按照高位到低位的次序存放在指定的緩沖區(qū)中。

HTASCSPROC RET MOVCX,4 HTASCSENDP

HTASCS1:ROLDX,1

HTOASCPROCNEAR

ROLDX,1

ANDAL,0FH

ROLDX,1

ADDAL,30H

ROLDX,1

CMPAL,39H

MOVAL,DL

JBEHTOASC1

CALLHTOASC

ADDAL,7

MOV[BX],AL

HTOASC1:RET

INCBX

HTOASCENDP

LOOPHTASCS12021/5/93

二、主程序與子程序間的參數(shù)傳遞 主程序在調(diào)用子程序時(shí),往往要向子程序傳遞一些參數(shù);同樣地,子程序運(yùn)行后夜經(jīng)常要把一些結(jié)果傳會(huì)給主程序。主程序和子程序之間的這種信息傳遞稱為參數(shù)傳遞。 有多種參數(shù)傳遞的方法:

(1)寄存器傳遞法 (2)約定內(nèi)存單元傳遞法 (3)堆棧傳遞法 (4)其它方法

1.利用寄存器傳遞參數(shù) 利用寄存器傳遞參數(shù)就是把參數(shù)放在約定的寄存器中。這種方法適用于傳遞參數(shù)較少的情況。2021/5/94

例:寫一個(gè)大寫字母轉(zhuǎn)換為小寫字母的子程序

;子程序名:UPTOLW ;功能:大寫字母轉(zhuǎn)換為小寫字母

;入口參數(shù):AL=字符的ASCII碼

;出口參數(shù):AL=字符的ASCII碼

;說(shuō)明:如字符為大寫字母,則轉(zhuǎn)換為小寫,其它字符不變。

UPTOLWPROC

PUSHF ;保護(hù)各標(biāo)志

CMPAL,‘A’ JBUPTOLW1 CMPAL,‘Z’ JAUPTOLW1 ADDAL,20H UPTOLW1:POPF ;恢復(fù)各標(biāo)志

RET UPTOLWENDP2021/5/95

2.利用約定存儲(chǔ)單元傳遞參數(shù) 在傳遞參數(shù)較多的情況下,可利用約定的內(nèi)存變量來(lái)傳遞參數(shù)。 例:寫一個(gè)實(shí)現(xiàn)32位數(shù)相加的子程序

;子程序名:MADD ;功能:32位數(shù)相加

;入口參數(shù):DATA1和DATA2緩沖區(qū)中分別存放要相加的數(shù)

;出口參數(shù):DATA3緩沖區(qū)存放結(jié)果

;說(shuō)明:

;(1)32位數(shù)據(jù)的存放次序采用“高高低低”原則

;(2)可能產(chǎn)生的進(jìn)位放在DATA3開始的第5字節(jié)中2021/5/96 MADDPROC

PUSH

AX ;為什么會(huì)把AX,CX,SI壓入棧?

PUSHCX

PUSHSI MOVCX,2 XORSI,SI ;CF也會(huì)被清0 MADD1:MOVAX,WORDPTRDATA1[SI]

ADCAX,WORDPTRDATA2[SI] MOVWORDPTRDATA3[SI],AX INCSI INCSI POPSI LOOPMADD1 POPCX MOVAL,0 POP

AX ADCAL,0 RET MOVBYTEPTR[DATA3+4],AL MADDENDP2021/5/97

3.利用堆棧傳遞參數(shù) (1)如果利用堆棧傳遞入口參數(shù),那么主程序在調(diào)用子程序之前,把需要傳遞的參數(shù)依次壓入堆棧,子程序從堆棧中取入口參數(shù); (2)如果使用堆棧傳遞出口參數(shù),那么子程序返回前,把需要返回的參數(shù)存入堆棧,主程序在堆棧中取出口參數(shù)。 例:寫一個(gè)測(cè)量字符串長(zhǎng)度的子程序,設(shè)字符串以0為結(jié)束標(biāo)志。

;子程序名:STRLEN ;功能:測(cè)量字符串長(zhǎng)度

;入口參數(shù):字符串起始地址的段值和偏移放在堆棧中

;出口參數(shù):AX=字符串長(zhǎng)度。

2021/5/98 STRLENPROC PUSHBP MOVBP,SP PUSHDS PUSHSI MOVDS,[BP+6] MOVSI,[BP+4] MOVAL,0 STRLEN1:CMPAL,[SI] JZSTRLEN2 INCSI JMPSTRLEN1 POPDS STRLEN2:MOVAX,SI POPBP SUBAX,[BP+4] RET POPSI STRLENENDP2021/5/99

主程序調(diào)用這個(gè)子程序的代碼片段如下:

MOVAX,SEGSTR PUSHAX MOVAX,OFFSETSTR PUSHAX CALLSTRLEN MOVLEN,AX

當(dāng)然,除了上面提及的3種方式外, 如果過(guò)程和調(diào)用程序在同一文件(同 一程序塊中,則過(guò)程可直接訪問(wèn)模塊 中的變量。2021/5/910

隨著指令的豐富、子程序的引入,匯編語(yǔ)言的表達(dá)也越來(lái)越靈活。為了方便地組織數(shù)據(jù),引入了結(jié)構(gòu)偽操作STRUC。

STRUC可以把不同類型的數(shù)據(jù)放在同一個(gè)結(jié)構(gòu)里,方便處理。

a).結(jié)構(gòu)類型說(shuō)明格式為:

structure_nameSTRUC … ;DB、DW、DD等偽操作

structure_nameENDS

注意:ENDS之前為結(jié)構(gòu)名,注意與段結(jié)束相區(qū)別。 例如:下列語(yǔ)句說(shuō)明了一個(gè)名STUDENT的結(jié)構(gòu)類型:

STUDENTSTRUC IDDW? SCOREDB0 NAMEDB‘ABCDEFGH’ STUDENTENDS

但是,定義一個(gè)結(jié)構(gòu)類型的時(shí)候不進(jìn)行任何存儲(chǔ)器分配,只有在定義結(jié)構(gòu)變量時(shí)才進(jìn)行存儲(chǔ)分配。2021/5/911 b).結(jié)構(gòu)變量的定義 格式是:[變量名]結(jié)構(gòu)名<[字段值表]>

例:LisiSTUDENT<103,88,‘LI’>;三個(gè)字段重新賦值

WangwuSTUDENT<104,,‘WANG’>;字段SCORE仍用缺省值

ZhangsanSTUDENT<>;三個(gè)字段均用缺省初值

TeamSTUDENT50DUP(<>);定義50個(gè)結(jié)構(gòu)變量,初值不變 在定義結(jié)構(gòu)變量時(shí),如果某個(gè)字段有多值,就不能給該字段重新賦初值(定義時(shí)存在“DUP”,“,,,”等)。

c).訪問(wèn)方式 訪問(wèn)方式:結(jié)構(gòu)變量名.結(jié)構(gòu)字段名 該變量的地址實(shí)質(zhì)少年宮是結(jié)構(gòu)變量地址的偏移與相應(yīng)字段偏移值之和。 例:Zhangsan.ID ;訪問(wèn)張三的學(xué)號(hào),實(shí)際上是直接尋址 還可以把結(jié)構(gòu)變量地址的偏移先存入某個(gè)基址或變址寄存器,然后利用“[寄存器名]”來(lái)代替結(jié)構(gòu)變量名。 例如:MOVBX,OFFSETZhangsan MOVAL,[BX].SCORE2021/5/912

例:通過(guò)結(jié)構(gòu)類型,在主程序和子程序中傳輸信息。2021/5/913

三、嵌套與遞歸子程序 一個(gè)子程序可以作為調(diào)用程序去調(diào)用另外一個(gè)子程序,這種情況稱為子程序的嵌套。 嵌套的層數(shù)稱為嵌套深度。深度為2的嵌套2021/5/914

如果一個(gè)子程序直接調(diào)用它自身,這種調(diào)用稱為(直接)遞歸調(diào)用。 具有遞歸調(diào)用的子程序就稱為遞歸子程序。 遞歸是嵌套的特殊情況。2021/5/915

遞歸子程序的設(shè)計(jì)要點(diǎn):

(1)遞推性:逐級(jí)調(diào)用; (2)回歸性:逐層回歸; (3)有窮性:終止條件; 這3點(diǎn)為所有語(yǔ)言遞歸程序設(shè)計(jì)具有的共性。 匯編語(yǔ)言設(shè)計(jì)遞歸程序時(shí)的個(gè)性在于:

(1)參數(shù)和中間結(jié)果一般存于堆棧中,但有時(shí)也可以存于寄存器中; (2)遞歸的深度受堆??臻g的限制。2021/5/916

例:子程序FACT采用遞歸算法實(shí)現(xiàn)階乘。

;子程序名:FACT ;功能:計(jì)算n! ;入口參數(shù):(AX)=n ;出口參數(shù):(AX)=n! ;說(shuō)明:(1)采用遞歸算法實(shí)現(xiàn)階乘;

; (2)n不能超過(guò)8 FACT(n)=n*FACT(n-1)=n*[(n-1)*FACT(n-2)]…

當(dāng)n=0時(shí),F(xiàn)ACT(0)=1.

要點(diǎn): (1)遞推:只要n不為0,即推進(jìn)到FACT(n-1); (2)有窮:n=0時(shí)有確切解,即FACT(0)=1 (3)回歸:逐層返回——FACT(n-1)的解和n(保存的中間參數(shù))2021/5/917 FACTPROC PUSHDX ;保存中間參數(shù)(最外層為原有參數(shù))

MOVDX,AX CMPAX,0 ;判斷n是否為0?

JZDONE ;如是,則終止推進(jìn)。(有窮)

DECAX ;否則,繼續(xù)推進(jìn)

CALLFACT ;推進(jìn)

MULDX ;中間結(jié)果后逐層返回:n*FACT(n-1) POPDX ;得到中間參數(shù)(最外層為原有參數(shù))

RET DONE:MOVAX,1

;給出確定結(jié)果0!=1 POPDX ;得到中間參數(shù)

RET FACTENDP2021/5/918

四、綜合示例 有10個(gè)學(xué)生的成績(jī)分別為76、69……80。編制一個(gè)子程序分別統(tǒng)計(jì)60~69分,70~79分,80~89分,90~99分及100分的人數(shù),分別存放到S6,S7,S8,S9,S10單元中。

DSEGSEGMENT

RECDW76,69,63,83,92,73,65,100,99,80

S6DW0

S7DW0

S8DW0

S9DW0

S10DW0 DSEGENDS STACKSEGMENT DW64DUP(?) STACKENDS2021/5/919 CODESEGMENT MAINPROCFAR ASSUMECS:CODE,DS:DSEG,SS:STACK START:PUSHDS

SUBAX,AX

PUSHAX MOVAX,DSEG MOVDS,AX MOVCX,10

CALLCOUNT ;調(diào)用COUNT子程序進(jìn)行統(tǒng)計(jì)

;可在此處添加顯示輸出

RET MAINENDP

注意:紅色部分在這里構(gòu)成一種固定搭配,把主程序看成DOS調(diào)用的遠(yuǎn)過(guò)程,RET與前2個(gè)PUSH配對(duì),相當(dāng)于: MOVAH,4CH INT21H2021/5/920 CO

溫馨提示

  • 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)論