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