宏匯編匯編語(yǔ)言第5章.ppt
《宏匯編匯編語(yǔ)言第5章.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《宏匯編匯編語(yǔ)言第5章.ppt(34頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第5章結(jié)構(gòu)化程序設(shè)計(jì),教學(xué)要求:?理解宏匯編的概念和作用。?掌握宏匯編的編程技術(shù)。,教學(xué)要求:?理解宏匯編的概念和作用。?掌握宏匯編的編程技術(shù)。,教學(xué)要求:?理解宏匯編的概念和作用。?掌握宏匯編的編程技術(shù)。,教學(xué)要求:?理解宏匯編的概念和作用。?掌握宏匯編的編程技術(shù)。,教學(xué)要求:?理解宏匯編的概念和作用。?掌握宏匯編的編程技術(shù)。,5.1子程序的概念5.2子程序的定義、調(diào)用和返回**5.3子程序的現(xiàn)場(chǎng)保護(hù)與參數(shù)傳遞**5.4子程序設(shè)計(jì)*5.5子程序的嵌套與遞歸調(diào)用5.6宏匯編程序設(shè)計(jì),教學(xué)基本內(nèi)容,什么是宏?,宏是源程序中一段有獨(dú)立功能的程序代碼。它只需在源程序中定義一次就可以多次調(diào)用它,調(diào)用時(shí),只需要用一個(gè)宏指令語(yǔ)句就可以了宏(Macro)是匯編語(yǔ)言的一個(gè)特點(diǎn),它是與子程序類似又獨(dú)具特色的另一種簡(jiǎn)化源程序的方法,5.6宏結(jié)構(gòu)程序設(shè)計(jì),宏匯編重復(fù)匯編條件匯編,宏結(jié)構(gòu),,一、宏匯編,內(nèi)容宏定義宏調(diào)用宏展開,1、宏定義,宏名macro[形參表]┇;宏指令體(宏體)endm,(1)宏名(宏指令名):給出該宏定義的名稱(第一個(gè)符號(hào)必須是字母)。(2)macro/endm系統(tǒng)提供的定義宏的偽指令。(3)形參表:給出宏定義中所用到的形式參數(shù),參數(shù)可以沒有,或帶有一個(gè)或是多個(gè),當(dāng)是多個(gè)參數(shù)時(shí),每個(gè)形參之間需用逗號(hào)隔開。具體參數(shù)可以是常數(shù)、變量、指令或它們的一部分,也可以是表達(dá)式。(4)宏指令體:一組有獨(dú)立功能的匯編程序代碼。其中可以包括指令、偽指令及宏指令等。,1、宏定義(續(xù)),fillsegmacroDsegname;帶有形參Dsegnamemovax,Dsegname;宏定義中使用參數(shù)movds,axendm;宏定義結(jié)束,舉例:,思考:此處的形參Dsegname是什么?,Dsegname是數(shù)據(jù)段的段名,2、宏調(diào)用,宏名[實(shí)參表];調(diào)用時(shí),只需使用宏指令名來(lái)調(diào)用該宏定義,例如:對(duì)上面的宏定義的調(diào)用形式為:┆FILLSEGDATA;DATA為數(shù)據(jù)段的段名┆說(shuō)明:(1)匯編時(shí),匯編程序?qū)γ總€(gè)宏調(diào)用作宏展開–––用宏定義體取代源程序中的宏指令名,用實(shí)參代替宏定義中的形參。取代時(shí),實(shí)參和形參是一一對(duì)應(yīng)的。若實(shí)參個(gè)數(shù)>形參個(gè)數(shù),則多余實(shí)參不考慮,若實(shí)參個(gè)數(shù)<形參個(gè)數(shù),則多余形參作“空”處理。(2)取代后,所得到的語(yǔ)句應(yīng)該是有效的,否則匯編程序?qū)?huì)指示出錯(cuò)。(3)每調(diào)用一次就把宏定義體展開一次,因而它占有的存儲(chǔ)空間與調(diào)用次數(shù)有關(guān)。,3、宏展開,宏調(diào)用的實(shí)質(zhì)是在匯編過程中進(jìn)行宏展開宏展開的具體過程是:當(dāng)匯編程序掃描源程序遇到已有定義的宏調(diào)用時(shí),即用相應(yīng)的宏定義體取代源程序的宏指令,同時(shí)用位置匹配的實(shí)參對(duì)形參進(jìn)行取代。,1MOVAX,DATA1MOVDS,AX,例如:上面的宏調(diào)用,其展開形式為:,宏匯編應(yīng)用舉例例5-9,datasegmentbuf1db0dh,0ah,whatareyourname?$buf2db0dh,0ah,mynameisliyang!$dataendscodesegmentassumeds:data,cs:codestart:movax,datamovds,ax,dispmacromleadx,mmovah,9int21hendmdispbuf1dispbuf2movah,4chint21hcodeendsendstart,宏匯編應(yīng)用舉例例5-17P148,multiplymacroopr1,opr2,result;定義宏pushdxpushaxmoval,opr1imulopr2movresult,axpopaxpopdxendmdatasegmentadb3bdw?dataendsstacksegmentstackdb200dup(0)stackends,codesegmentassumeds:data,cs:code,ss:stackstart:movax,datamovds,axmovcl,2movbx,0multiplycl,a,b[bx];宏調(diào)用movdx,b[bx]adddl,30hmovah,2int21hmovah,4chint21hcodeendsendstart,宏——具有宏名的一段匯編語(yǔ)句序列——宏定義時(shí)書寫宏指令——這段匯編語(yǔ)句序列的縮寫——宏調(diào)用時(shí)書寫宏展開——宏指令處用這段宏代替的過程——宏匯編時(shí)實(shí)現(xiàn)宏的參數(shù)功能強(qiáng)大,頗具特色,思考:,在匯編語(yǔ)言程序設(shè)計(jì)過程中,可以將具有一定功能,需多次重復(fù)使用,且比較短的程序段定義成一條宏指令。使用宏指令語(yǔ)句可以減少程序書寫錯(cuò)誤,縮短源程序長(zhǎng)度,使源程序編寫像高級(jí)語(yǔ)言一樣清晰、簡(jiǎn)潔。特別是使用宏庫(kù)后,可以提高編程效率。,在什么情況下使用宏?為什么要使用宏?,比較,僅是源程序級(jí)的簡(jiǎn)化:宏調(diào)用在匯編時(shí)進(jìn)行程序語(yǔ)句的展開,不需要返回;不減小目標(biāo)程序,執(zhí)行速度沒有改變通過形參、實(shí)參結(jié)合實(shí)現(xiàn)參數(shù)傳遞,簡(jiǎn)捷直觀、靈活多變,還是目標(biāo)程序級(jí)的簡(jiǎn)化:子程序調(diào)用在執(zhí)行時(shí)由CALL指令轉(zhuǎn)向、RET指令返回;形成的目標(biāo)代碼較短,執(zhí)行速度減慢需要利用寄存器、存儲(chǔ)單元或堆棧等傳遞參數(shù),宏,子程序,,,比較結(jié)論,宏,子程序,,,相同點(diǎn):簡(jiǎn)化源程序的設(shè)計(jì)和結(jié)構(gòu)不同點(diǎn):※對(duì)目標(biāo)程序的長(zhǎng)度影響不同?!鶎?duì)目標(biāo)程序執(zhí)行速度的影響不同。※傳遞參數(shù)的方式不同;傳遞參數(shù)過程中如出現(xiàn)錯(cuò)誤,錯(cuò)誤的性質(zhì)不同。(宏:語(yǔ)法;子程序:邏輯)宏與子程序具有各自的特點(diǎn),程序員應(yīng)該根據(jù)具體問題選擇使用那種方法通常,當(dāng)程序段較短或要求較快執(zhí)行時(shí),應(yīng)選用宏;當(dāng)程序段較長(zhǎng)或?yàn)闇p小目標(biāo)代碼時(shí),要選用子程序,4、宏調(diào)用中的參數(shù)(宏運(yùn)算),宏的參數(shù)形式靈活多變,可以是常數(shù)、變量、存儲(chǔ)單元、指令操作碼或它們的一部分,也可以是表達(dá)式,使用靈活多變的參數(shù),同一個(gè)宏定義甚至可以執(zhí)行不同的操作。幾個(gè)宏操作符的使用%:表達(dá)式操作符:將其后面跟的表達(dá)式的值作為實(shí)參,而不是將表達(dá)式本身作為參數(shù),用在實(shí)參中。&:替換操作符:用于將參數(shù)與其他字符分開。用在宏體中。如果參數(shù)緊跟在其他字符之前或之后,或者參數(shù)出現(xiàn)在帶引號(hào)的字符串中,就必須使用該偽操作符。,表達(dá)符操作%示例。DAMACROA,B,C,DDWA,B,CDBDDUP(0)ENDM如果宏調(diào)用為:X=10Y=20DA%X+2,5,%X+Y,%Y-5DAX+2,5,X+Y,Y-5,則相應(yīng)的宏展開為:1DW12,5,301DB15DUP(0)1DWX+2,5,X+Y1DBY-5DUP(0),表達(dá)符操作%示例,dat1macroa,b,c,ddwa,b,cdbddup(0)endmdatasegmentx=10y=20dat1%x+2,5,%x+y,%y-5dat1x+2,5,x+y,y-5dataends,codesegmentassumeds:data,cs:codestart:movax,datamovds,axmovah,4chint21hcodeendsendstart,表達(dá)符操作%示例,表達(dá)符操作&示例。DAMACROSSDB‘Exam:重復(fù)次數(shù)重復(fù)的語(yǔ)句組ENDM,例1:定義100個(gè)初值為32的字節(jié)單元,該存儲(chǔ)單元的起始符號(hào)地址為Table。,方法1:用偽指令REPT來(lái)實(shí)現(xiàn)TableLABELbyterept100db32endm,匯編結(jié)果為:TableLABELbytedb32┆db32,上述字節(jié)定義重復(fù)100次,方法2:用DUP來(lái)實(shí)現(xiàn):TableDB100DUP(32),本例用偽指令REPT重復(fù)定義的存儲(chǔ)單元可以用重復(fù)操作符DUP來(lái)代替,但前者的功能更靈活、更強(qiáng)大。,重復(fù)次數(shù)確定,格式:,【例2】將A~Z這26個(gè)字母數(shù)據(jù)填入數(shù)組CHAR中。CHARLABELBYTECHR=AREPT26DBCHRCHR=CHR+1ENDM,匯編后產(chǎn)生:1DB41H1DB42HDB5AH┆,例3:計(jì)算1+2+…+100,并把其值存入寄存器AX。,方法1:用偽指令REPT來(lái)實(shí)現(xiàn)…xorAX,axCOUNT=1REPT100ADcAX,COUNTCOUNT=COUNT+1ENDM…,匯編結(jié)果與下面程序段相一致:xorAX,0ADcAX,1ADcAX,2…ADcAX,100…,比較:右邊語(yǔ)句的執(zhí)行能完成所指定的功能,但是用100條加法指令來(lái)直接計(jì)算,這無(wú)疑會(huì)大大增加目標(biāo)代碼的長(zhǎng)度。,方法2:用循環(huán)指令LOOP來(lái)實(shí)現(xiàn)…xorax,axmovcx,100again:adcax,cxloopagain…,方法1與方法2的比較,不難看出:偽指令REPT與循環(huán)指令起作用的時(shí)期和方式是截然不同的。它們之間的主要差異如下表所列,,操作演示,偽指令REPT與循環(huán)指令LOOP之間的主要差異,2、偽指令I(lǐng)RP,重復(fù)次數(shù)不確定,格式:,IRP形參,;重復(fù)的語(yǔ)句ENDM,其中,①實(shí)參數(shù)必須寫在尖括號(hào)內(nèi),可以有多個(gè),參數(shù)之間用逗號(hào)分隔開。②重復(fù)時(shí),第一次重復(fù)將用第一個(gè)實(shí)參數(shù)替換語(yǔ)句塊中的形參所在位置,第二次重復(fù)用第二個(gè)實(shí)參數(shù),依此類推。如果沒有實(shí)參數(shù),那么這個(gè)塊只處理一次,并且被一個(gè)空參數(shù)所替換。,例5:把8個(gè)16位通用寄存器之值相加,并把結(jié)果存入寄存器AX中。解答:由于16位通用寄存器名是一些不同的符號(hào),不能用計(jì)數(shù)的方法來(lái)依次訪問它們,所以,我們需要用偽指令I(lǐng)RP來(lái)實(shí)現(xiàn)。,IRPREG,ADDAX,REGENDM,【例4】產(chǎn)生將AX、BX、CX和DX壓入堆棧的指令。TABELLABELNEARIRPREG,PUSHREGENDM,擴(kuò)展后為TABELLABELNEAR1PUSHAX1PUSHBX1PUSHCX1PUSHDX,條件匯編允許用戶在編制匯編語(yǔ)言程序時(shí)根據(jù)某些條件是否成立(為真)來(lái)決定是否匯編某一段語(yǔ)句。條件匯編指令提供有10個(gè),分為互補(bǔ)的5對(duì),分別用來(lái)測(cè)試表達(dá)式掃描遍數(shù)、符號(hào)定義、參數(shù)和兩個(gè)字符串是否相同等。條件匯編偽指令的一般格式是:IF表達(dá)式或參數(shù)語(yǔ)句1;成立時(shí)匯編這一段語(yǔ)句[ELSE語(yǔ)句2];條件不成立時(shí)匯編這一段語(yǔ)句(稱為反條件語(yǔ)句塊)ENDIF;條件匯編結(jié)束命令,三、條件匯編,其中,條件偽指令I(lǐng)F中的””可以是1、2、E、DEF、NDEF、B、NB、IDN和DIF等,用來(lái)規(guī)定條件,表達(dá)式或參數(shù)指明被測(cè)試的條件表達(dá)式或參數(shù)。當(dāng)被測(cè)試的表達(dá)式或參數(shù)符合條件(成立)時(shí),IF和ELSE之間的條件語(yǔ)句塊才被匯編。ELSE是一個(gè)可選擇的子句,它表示條件為假時(shí),ELSE和ENDIF之間的反條件語(yǔ)句塊才被匯編。,1.IF和IFE格式:IF表達(dá)式IFE表達(dá)式IF表示如果表達(dá)式的值不為零(≠0)則為真,而IFE表示當(dāng)表達(dá)式的值為零時(shí)則為真。注意:表達(dá)式只能有一個(gè),表達(dá)式中的項(xiàng)不能是變量且不能提前引用。,條件匯編語(yǔ)句是不會(huì)生成目標(biāo)代碼的。因此IF語(yǔ)句除在匯編時(shí)選擇條件塊語(yǔ)句或反條件塊語(yǔ)句外,不影響標(biāo)志寄存器的狀態(tài)。此外,IF語(yǔ)句中的LT表示小于的關(guān)系運(yùn)算符,當(dāng)關(guān)系成立時(shí)為真,否則為假。類似地也可使用關(guān)系符EQ、NE、LE、GT和GE等。,例7:定義一個(gè)元素個(gè)數(shù)不超過100個(gè)的數(shù)組。PDATAMACRONUMIFNUMLT100DBNUMDUP(?)ELSEDB100DUP(?)ENDIFENDM,使用條件匯編偽指令的主要目的:同一個(gè)源程序能根據(jù)不同的匯編條件生成不同功能的目標(biāo)程序,增強(qiáng)宏定義的使用范圍。條件匯編偽指令與高級(jí)語(yǔ)言(如:C/C++)的條件編譯語(yǔ)句在書寫形式上相似,在所起作用方面是完全一致的。,作業(yè),定義100個(gè)初值分別為1,2,…,100的字節(jié)單元,該存儲(chǔ)單元的起始符號(hào)地址為Table。,作業(yè),定義100個(gè)初值分別為1,2,…,100的字節(jié)單元,該存儲(chǔ)單元的起始符號(hào)地址為Table。TableLABELbyte匯編結(jié)果相當(dāng)于:COUNT=1TableLABELTYPEREPT100DB1DBCOUNTDB2COUNT=COUNT+1…ENDMDB100上面定義了100個(gè)字節(jié),其初值為1,2,…,100。本例好象不能用重復(fù)操作符DUP來(lái)說(shuō)明字節(jié)存儲(chǔ)單元。,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 匯編 匯編語(yǔ)言
鏈接地址:http://m.italysoccerbets.com/p-3375435.html