版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第13章高級(jí)宏匯編語(yǔ)言技術(shù)
13.1結(jié)構(gòu)
13.2記錄13.3宏匯編13.4重復(fù)匯編11.5條件匯編
13.1結(jié)構(gòu)
MASM支持結(jié)構(gòu),其直接引用高級(jí)語(yǔ)言的結(jié)構(gòu)數(shù)據(jù)概念。
13.1.1結(jié)構(gòu)的定義結(jié)構(gòu)名STRUC<數(shù)據(jù)定義語(yǔ)句序列>結(jié)構(gòu)名ENDS【例】定義一個(gè)與時(shí)間有關(guān)的結(jié)構(gòu)。TIMERSSTRUCYEAR_STRDB'CURRENTDATE:','$'YEARDW?MONTHDB?DAYDB?TIME_STRDB'CURRENTTIME:','$'HOURDB?MINUTEDB?SECDB?TIMERSENDS13.1.2結(jié)構(gòu)的預(yù)置與存儲(chǔ)單元的分配結(jié)構(gòu)變量預(yù)置語(yǔ)句的格式:結(jié)構(gòu)變量名結(jié)構(gòu)名<字段值表>
【例】TIMERS結(jié)構(gòu)進(jìn)行引用。STR1TIMERS<>STR2TIMERS<‘ABCD’,2012>所有字段都不修改。修改前兩個(gè)字段。注意:只有簡(jiǎn)單結(jié)構(gòu)字段(用DB、DW、DD定義的單項(xiàng)變量)和字符串字段的初值可以修改。13.1.3結(jié)構(gòu)變量使用舉例
【例】寫(xiě)一個(gè)程序,獲取系統(tǒng)日期和時(shí)間,并顯示。TIMERSSTRUCDATE_STRDB'Thecurrentdateis:','$'YEARDW?MONTHDB?DAYDB?TIME_STRDB'Thecurrenttimeis','$'HOURDB?MINUTEDB?SECDB?TIMERSENDSINCLUDEUSER.MACDISP_TMACROX;以十進(jìn)制輸出字節(jié)內(nèi)容DISP_CHAR':'MOVAL,XMOVAH,0MOVBX,10CALLNUM_DECENDMDATASEGMENTTIMESTIMERS<>DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXCALLGET_DATE;獲取系統(tǒng)日期CALLDISP_DATE;顯示系統(tǒng)日期CRLF;回車(chē)換行CALLGET_TIME;獲取系統(tǒng)時(shí)間CALLDISP_TIME;顯示系統(tǒng)時(shí)間MOVAX,4C00HINT21HGET_DATEPROCNEAR;取系統(tǒng)日期MOVAH,2AHINT21HMOVTIMES.YEAR,CX;年信息MOVTIMES.MONTH,DH;月MOVTIMES.DAY,DL;日RETGET_DATEENDPGET_TIMEPROCNEAR;取系統(tǒng)時(shí)間MOVAH,2CHINT21HMOVTIMES.HOUR,CHMOVTIMES.MINUTE,CLMOVTIMES.SEC,DHRETGET_TIMEENDP
DISP_DATEPROCNEAR;顯示系統(tǒng)日期DISP_STRTIMES.DATE_STRMOVAX,TIMES.YEARMOVBX,10CALLNUM_DEC;輸出年份DISP_TTIMES.MONTH;輸出月DISP_TTIMES.DAY;輸出日RETDISP_DATEENDPDISP_TIMEPROCNEAR;顯示系統(tǒng)時(shí)間DISP_STRTIMES.TIME_STRDISP_TTIMES.HOURDISP_TTIMES.MINUTEDISP_TTIMES.SECRETDISP_TIMEENDPINCLUDENUM_DEC.ASMCODEENDS宏匯編的意義:避免了重復(fù)編寫(xiě),使源程序更加簡(jiǎn)潔、易讀。
13.3.1宏功能的使用過(guò)程1.宏定義宏指令:將在源程序中多次使用到同一個(gè)程序段定義成一個(gè)“指令”格式不帶參數(shù)
宏名MACRO┇}宏體ENDM帶參數(shù)
宏名MACRO形參1,形參2,.....┇}宏體ENDM不可缺省,且名字唯一語(yǔ)句序列【例】對(duì)兩個(gè)存儲(chǔ)單元(字節(jié)/字)的內(nèi)容相互交換的程序段進(jìn)行宏定義: EXCHANGEMACROMEM1,MEM2,REG MOVREG,MEM1 XCHGREG,MEM2 MOVMEM1,REG
ENDM
形參13.3宏匯編2.宏調(diào)用含義:用宏指令名來(lái)代替原來(lái)的程序段
格式不帶參數(shù)
宏名帶參數(shù)
宏名實(shí)參1,實(shí)參2,.....數(shù)字,符號(hào)名等。3.宏展開(kāi)含義:宏匯編程序在匯編源程序時(shí)自動(dòng)用宏指令的內(nèi)容代替宏指令
注意:宏指令的使用不會(huì)減少程序的目標(biāo)代碼長(zhǎng)度
【例】宏指令使用的過(guò)程:;宏定義PUSH4 MACRO PUSHAXPUSHBX PUSHCX PUSHDX
ENDMEXCHANGEMACROMEM1,MEM2,REG MOVREG,MEM1 XCHGREG,MEM2 MOVMEM1,REG
ENDM;設(shè)置數(shù)據(jù)段DATA SEGMENT DA_W01 DW1234H DA_W02 DW5678H DATA ENDS ;設(shè)置堆棧段 STACK1SEGMENTPARASTACK DW20HDUP(?) STACK1 ENDS;設(shè)置代碼段COSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AX ┇
PUSH4
;宏指令語(yǔ)句+PUSHAX+PUSHBX+PUSHCX+PUSHDX┇
EXCHANGEDA_W01,DA_W02,CX;宏指令語(yǔ)句+MOVCX,DA_W01+XCHGCX,DA_W02+MOVDA_W01,CX┇COSEGENDSENDSTART
1.連接操作符&13.3.2宏操作符含義:宏展開(kāi)時(shí),對(duì)應(yīng)形參的實(shí)參就與它前后的符號(hào)連接在一起用途:修改某些符號(hào)【例】連接符&的使用:SHIFT_VARMARCOR_M,DIRECT,COUNTMOVCL,COUNTS&DIRECTR_M,CLENDMSHIFT_VARAX,HL,2的宏展開(kāi)為:+MOVCL,2+SHLAX,CL
SHIFT_VARBX,HR,3的宏展開(kāi)為:+ MOVCL,3+ SHRBX,CL
2.表達(dá)式操作符%含義:告訴宏匯編程序獲取表達(dá)式的值,而不是獲取表達(dá)式文本本身格式:%表達(dá)式
注意:這個(gè)操作符一般是出現(xiàn)在宏調(diào)用中,不允許出現(xiàn)在形參的前面。
【例】表達(dá)式%的使用:;宏定義SHIF0MACROCNTMOVCL,CNT
ENDMSHIF1MACROREG,DIRECT,NUMCOUNT=NUMSHIF0%COUNTS&DIRECTREG,CL
ENDM
;宏調(diào)用SHIF1AX,HL,2SHIF1BL,AR,3;宏展開(kāi)SHIF1AX,HL,2+MOVCL,2+SHLAX,CLSHIF1BL,AR,3+MOVCL,3+SARBL,CL3.文本操作符<>含義:把一個(gè)完整的實(shí)參括起來(lái),作為一個(gè)單一的實(shí)參?!纠浚篍XCHANGE<BYTEPTRDA_WORD1>,<BYTEPTRDA_WORD2>,AL宏展開(kāi)時(shí),替換的三條指令是:MOVAL,BYTEPTRDA_WORD1XCHGAL,BYTEPTRDA_WORD2MOVBYTEPTRWORD1,AL
注意:文本操作符還可以用來(lái)處理某些特殊字符:如“;”和“&”。
【例】:<;>就表示一個(gè)分號(hào)“;”的實(shí)參,而不是注釋符。
4.字符操作符!
含義:“!”后的字符不作特別的操作符使用,而是以字符本身的意義進(jìn)行處理。如:“!&”表示&不作連接操作符用,只作符號(hào)&使用。“!%”表示%不作表達(dá)式操作符使用,只作百分號(hào)用?!纠孔址僮鞣?!的使用:;宏定義:PROMPTMACRONUM,TEXTPROMP&NUMDB'&TEXT&'ENDM宏調(diào)用:PROMPT23,<Expression!>255>宏展開(kāi):PROMP23DB'Expression>255'5.宏注解符;;
含義:說(shuō)明后面的文本是注解。13.3.3LOCAL偽指令意義:在宏定義中使用變量名和標(biāo)號(hào),為了避免在宏展開(kāi)時(shí)產(chǎn)生多個(gè)相同的變量名或標(biāo)號(hào)。
格式:LOCAL<符號(hào)表>
在宏定義中定義的變量名和標(biāo)號(hào),多個(gè)符號(hào)之間用逗號(hào)間隔
注意:宏展開(kāi)時(shí),LOCAL偽指令指定的變量、標(biāo)號(hào)自動(dòng)生成格式為“??ⅩⅩⅩⅩ”的符號(hào),其中后四位順序使用0000~FFFF的十六進(jìn)制數(shù)字。
【例】用連續(xù)相加的辦法實(shí)現(xiàn)無(wú)符號(hào)數(shù)乘法運(yùn)算,編制宏定義MULTIPMULTIPMACROMULT1,MULT2,MULT3
LOCALLOP,EXIT0MOVDX,MULT1;乘數(shù)1MOVCX,MULT2;乘數(shù)2XORBX,BXXORAX,AXJCXZEXIT0
LOP:ADDBX,DXADCAX,0LOOPLOPEXIT0:MOVMULT3,BXMOVMULT3+2,AXENDM設(shè)某數(shù)據(jù)段有如下定義的變量:DA1DW1234H,5678HDA2DW120H,210HDA3DW4DUP(?)在代碼段中:如有兩次宏調(diào)用,則兩次的宏展開(kāi)如下: ┇
MULTIPDA1,DA2,DA3 +MOVDX,DA1 +MOVCX,DA2 +XORBX,BX +XORAX,AX +JCXZ??0001+??0000:ADDBX,DX +ADCAX,0 +LOOP??0000+??0001:MOVDA3,BX +MOVDA3+2,AX ┇
MULTIPDA1+2,DA2+2,DA3+4 +MOVDX,DA1+2 +MOVCX,DA2+2 +XORBX,BX +XORAX,AX +JCXA??0003+??0002:ADDBX,DXADCAX,0 LOOP??0002+??0003:MOVDA3+4,BX +MOVDA3+6,AX ┇13.3.4宏嵌套1.宏定義嵌套含義:一個(gè)宏定義中包含另一個(gè)宏定義
【例】嵌套的宏定義:JUMP MACROCOND;外層宏定義J&COND&SMACRODEST;內(nèi)層宏定義 LOCALNEXT,EXITJ&CONDNEXT JMPEXITNEXT:JMPDESTEXITENDMENDM應(yīng)用:常常用這種宏定義嵌套來(lái)產(chǎn)生一些新的宏定義
例如外層宏調(diào)用為:JUMPEJUMPNEJUMPGJUMPGE分別形成內(nèi)層宏定義的宏名:JES,JNES,JGS,JGES。
如有兩個(gè)條件轉(zhuǎn)移的目標(biāo)地址分別是SUB1和SUB2,這時(shí)內(nèi)層宏調(diào)用為:┇JESSUB1;等于0轉(zhuǎn)移┇JGESSUB2;大于或等于0轉(zhuǎn)移┇當(dāng)宏匯編程序?qū)?nèi)層宏展開(kāi)后,得如下結(jié)果:JE??0000JMP??0001??0000:JMPSUB1??0001:┇JGE??0002JMP??0003??0002:JMPSUB2??0003:┇
2.宏定義內(nèi)嵌套宏調(diào)用
含義:在一個(gè)宏定義的宏體內(nèi)有宏調(diào)用注意:被調(diào)用的宏指令必須是已定義的
【例】SHIFT是對(duì)32位數(shù)左移一位的宏定義,其中NUM1是高16位數(shù),NUM2是低16位數(shù)。MULT12是對(duì)一個(gè)32位數(shù)乘以12的宏定義,其中M_R1是存放高16位數(shù)的存儲(chǔ)單元或寄存器,M_R2是存放低16位數(shù)的存儲(chǔ)單元或寄存器。在乘法的過(guò)程中,要使用寄存器暫存32位數(shù),REG1和REG2就是指定用來(lái)暫存數(shù)據(jù)的兩個(gè)寄存器。在MULT12的宏定義中,當(dāng)需要對(duì)32位數(shù)進(jìn)行左移時(shí),就調(diào)用SHIFT的宏定義?,F(xiàn)有兩個(gè)宏定義:SHIFTMACRONUM1,NUM2SALNUM2,1RCLNUM1,1 ENDMMULT12MACROM_R1,M_R2,REG1,REG2PUSHFPUSHREG1PUSHREG2SHIFTM_R1,M_R2某數(shù)據(jù)段已定義變量:DA_WORDDW123H,456H程序中可以編寫(xiě)宏指令語(yǔ)句:┇MULT12DA_WORD+2,DA_WORD,AX,BX┇MULT12AX,BX,CX,DX┇SHIFTM_R1,M_R2MOVREG1,M_R1MOVREG2,M_R2SHIFTM_R1,M_R2ADDM_R2,REG2ADCM_R1,REG1POPREG2POPREG1POPFENDM13.3.5宏程序庫(kù)含義:若干個(gè)宏定義以文件的形式組成一個(gè)宏庫(kù),供其他源程序使用。
調(diào)用:在新編制的源程序中使用INCLUDE偽指令
宏指令與子程序的區(qū)別
相同點(diǎn):(1)簡(jiǎn)化源程序的書(shū)寫(xiě)。(2)節(jié)省編程工作量。不同點(diǎn):(1)宏指令并不節(jié)省目標(biāo)程序,子程序節(jié)省目標(biāo)代碼和存儲(chǔ)空間(2)宏指令的功能靈活,執(zhí)行速度快;子程序的靈活性差些,執(zhí)行速度也不如宏指令快【例12-10】用IRP重復(fù)匯編偽指令定義一個(gè)保存寄存器信息的宏定義:
PUSHREGMACROTEXTIRPREG,<TEXT>PUSHREGENDMENDM【例】用重復(fù)匯編可以在9*9個(gè)字節(jié)存儲(chǔ)單元中存放一個(gè)乘法九九表的數(shù)值:N=0REPT9N=N+1M=0REPT9M=M+1DBN*MENDMENDM
13.4重復(fù)匯編類型REPT偽指令
格式:REPT表達(dá)式┇┇ENDM重復(fù)語(yǔ)句序列
含義:將重復(fù)語(yǔ)句序列重復(fù)匯編,表達(dá)式的值為重復(fù)匯編的次數(shù)。重復(fù)匯編語(yǔ)句序列等效:DB1,2,3,4,5,6,7,8,9DB2,4,6,8,10,12,14,16,18DB3,6,9,12,15,18,21,24,27DB4,8,12,16,20,24,28,32,36DB5,10,15,20,25,30,35,40,45DB6,12,18,24,30,36,42,48,54DB7,14,21,28,35,42,49,56,63DB8,16,24,32,40,48,56,64,72DB9,18,27,36,45,54,63,72,81IRP偽指令
格式:
IRP形參,<實(shí)參1,實(shí)參2,……>┇┇
ENDM
含義:將重復(fù)語(yǔ)句序列重復(fù)匯編,次數(shù)由實(shí)參個(gè)數(shù)所決定。
重復(fù)語(yǔ)句序列IRPC偽指令
格式:
IRPC形參,字符串┇┇ENDM
含義:將重復(fù)語(yǔ)句序列重復(fù)匯編,次數(shù)由字符串中字符個(gè)數(shù)決定重復(fù)語(yǔ)句序列對(duì)上述宏定義的宏調(diào)用:PUSHREG<AX,BX,CX,DX>在匯編源程序時(shí),宏展開(kāi)可得:+PUSHAX+PUSHBX+PUSHCX+PUSHDX對(duì)上述宏定義的宏調(diào)用:POPREGDCBA在匯編期間,宏展開(kāi)可得:+POPDX+POPCX+POPBX+POPAX例:編制一個(gè)用IRPC偽指令從堆棧中恢復(fù)寄存器內(nèi)容的宏定義:
POPREGMACROSTRINGIRPCREG,STRINGPOPREG&XENDMENDM
13.5條件匯編含義:匯編程序根據(jù)條件的不同匯編不同的程序段。
格式:IF××表達(dá)式
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年物流園區(qū)運(yùn)營(yíng)管理承包合同模板3篇
- 社區(qū)勞動(dòng)保障工作總結(jié)范文三篇
- 甲醇課程設(shè)計(jì)
- 簡(jiǎn)單的vhdl課程設(shè)計(jì)
- 機(jī)電畢業(yè)課程設(shè)計(jì)書(shū)
- 物流園消防培訓(xùn)課程設(shè)計(jì)
- 簡(jiǎn)單網(wǎng)課程設(shè)計(jì)
- 輸變電工程施工合同(2020版)
- 紀(jì)念方法微課程設(shè)計(jì)
- 市場(chǎng)部門(mén)拓展新市場(chǎng)并提升品牌影響力
- 常用截面慣性矩與截面系數(shù)的計(jì)算
- 行車(chē)工考試試題
- 小兒頭皮靜脈輸液課件
- 宇電溫控器ai 500 501用戶手冊(cè)s 6中文說(shuō)明書(shū)
- 電力電纜高頻局放試驗(yàn)報(bào)告
- 肺病科主任年度述職匯報(bào)
- 2023年福建省晉江市數(shù)學(xué)七年級(jí)第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含解析
- 水利水電工程基礎(chǔ)坑隱蔽工程驗(yàn)收證書(shū)
- 余熱發(fā)電工程總施工組織設(shè)計(jì)方案
- 建設(shè)工程監(jiān)理費(fèi)計(jì)算器(免費(fèi))
- 希望點(diǎn)-列舉法
評(píng)論
0/150
提交評(píng)論