




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第13章高級宏匯編語言技術(shù)
13.1結(jié)構(gòu)
13.2記錄13.3宏匯編13.4重復(fù)匯編11.5條件匯編
13.1結(jié)構(gòu)
MASM支持結(jié)構(gòu),其直接引用高級語言的結(jié)構(gòu)數(shù)據(jù)概念。
13.1.1結(jié)構(gòu)的定義結(jié)構(gòu)名STRUC<數(shù)據(jù)定義語句序列>結(jié)構(gòu)名ENDS【例】定義一個與時間有關(guān)的結(jié)構(gòu)。TIMERSSTRUCYEAR_STRDB'CURRENTDATE:','$'YEARDW?MONTHDB?DAYDB?TIME_STRDB'CURRENTTIME:','$'HOURDB?MINUTEDB?SECDB?TIMERSENDS13.1.2結(jié)構(gòu)的預(yù)置與存儲單元的分配結(jié)構(gòu)變量預(yù)置語句的格式:結(jié)構(gòu)變量名結(jié)構(gòu)名<字段值表>
【例】TIMERS結(jié)構(gòu)進行引用。STR1TIMERS<>STR2TIMERS<‘ABCD’,2012>所有字段都不修改。修改前兩個字段。注意:只有簡單結(jié)構(gòu)字段(用DB、DW、DD定義的單項變量)和字符串字段的初值可以修改。13.1.3結(jié)構(gòu)變量使用舉例
【例】寫一個程序,獲取系統(tǒng)日期和時間,并顯示。TIMERSSTRUCDATE_STRDB'Thecurrentdateis:','$'YEARDW?MONTHDB?DAYDB?TIME_STRDB'Thecurrenttimeis','$'HOURDB?MINUTEDB?SECDB?TIMERSENDSINCLUDEUSER.MACDISP_TMACROX;以十進制輸出字節(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;回車換行CALLGET_TIME;獲取系統(tǒng)時間CALLDISP_TIME;顯示系統(tǒng)時間MOVAX,4C00HINT21HGET_DATEPROCNEAR;取系統(tǒng)日期MOVAH,2AHINT21HMOVTIMES.YEAR,CX;年信息MOVTIMES.MONTH,DH;月MOVTIMES.DAY,DL;日RETGET_DATEENDPGET_TIMEPROCNEAR;取系統(tǒng)時間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)時間DISP_STRTIMES.TIME_STRDISP_TTIMES.HOURDISP_TTIMES.MINUTEDISP_TTIMES.SECRETDISP_TIMEENDPINCLUDENUM_DEC.ASMCODEENDS宏匯編的意義:避免了重復(fù)編寫,使源程序更加簡潔、易讀。
13.3.1宏功能的使用過程1.宏定義宏指令:將在源程序中多次使用到同一個程序段定義成一個“指令”格式不帶參數(shù)
宏名MACRO┇}宏體ENDM帶參數(shù)
宏名MACRO形參1,形參2,.....┇}宏體ENDM不可缺省,且名字唯一語句序列【例】對兩個存儲單元(字節(jié)/字)的內(nèi)容相互交換的程序段進行宏定義: EXCHANGEMACROMEM1,MEM2,REG MOVREG,MEM1 XCHGREG,MEM2 MOVMEM1,REG
ENDM
形參13.3宏匯編2.宏調(diào)用含義:用宏指令名來代替原來的程序段
格式不帶參數(shù)
宏名帶參數(shù)
宏名實參1,實參2,.....數(shù)字,符號名等。3.宏展開含義:宏匯編程序在匯編源程序時自動用宏指令的內(nèi)容代替宏指令
注意:宏指令的使用不會減少程序的目標(biāo)代碼長度
【例】宏指令使用的過程:;宏定義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
;宏指令語句+PUSHAX+PUSHBX+PUSHCX+PUSHDX┇
EXCHANGEDA_W01,DA_W02,CX;宏指令語句+MOVCX,DA_W01+XCHGCX,DA_W02+MOVDA_W01,CX┇COSEGENDSENDSTART
1.連接操作符&13.3.2宏操作符含義:宏展開時,對應(yīng)形參的實參就與它前后的符號連接在一起用途:修改某些符號【例】連接符&的使用:SHIFT_VARMARCOR_M,DIRECT,COUNTMOVCL,COUNTS&DIRECTR_M,CLENDMSHIFT_VARAX,HL,2的宏展開為:+MOVCL,2+SHLAX,CL
SHIFT_VARBX,HR,3的宏展開為:+ MOVCL,3+ SHRBX,CL
2.表達式操作符%含義:告訴宏匯編程序獲取表達式的值,而不是獲取表達式文本本身格式:%表達式
注意:這個操作符一般是出現(xiàn)在宏調(diào)用中,不允許出現(xiàn)在形參的前面。
【例】表達式%的使用:;宏定義SHIF0MACROCNTMOVCL,CNT
ENDMSHIF1MACROREG,DIRECT,NUMCOUNT=NUMSHIF0%COUNTS&DIRECTREG,CL
ENDM
;宏調(diào)用SHIF1AX,HL,2SHIF1BL,AR,3;宏展開SHIF1AX,HL,2+MOVCL,2+SHLAX,CLSHIF1BL,AR,3+MOVCL,3+SARBL,CL3.文本操作符<>含義:把一個完整的實參括起來,作為一個單一的實參?!纠浚篍XCHANGE<BYTEPTRDA_WORD1>,<BYTEPTRDA_WORD2>,AL宏展開時,替換的三條指令是:MOVAL,BYTEPTRDA_WORD1XCHGAL,BYTEPTRDA_WORD2MOVBYTEPTRWORD1,AL
注意:文本操作符還可以用來處理某些特殊字符:如“;”和“&”。
【例】:<;>就表示一個分號“;”的實參,而不是注釋符。
4.字符操作符!
含義:“!”后的字符不作特別的操作符使用,而是以字符本身的意義進行處理。如:“!&”表示&不作連接操作符用,只作符號&使用。“!%”表示%不作表達式操作符使用,只作百分號用。【例】字符操作符!的使用:;宏定義:PROMPTMACRONUM,TEXTPROMP&NUMDB'&TEXT&'ENDM宏調(diào)用:PROMPT23,<Expression!>255>宏展開:PROMP23DB'Expression>255'5.宏注解符;;
含義:說明后面的文本是注解。13.3.3LOCAL偽指令意義:在宏定義中使用變量名和標(biāo)號,為了避免在宏展開時產(chǎn)生多個相同的變量名或標(biāo)號。
格式:LOCAL<符號表>
在宏定義中定義的變量名和標(biāo)號,多個符號之間用逗號間隔
注意:宏展開時,LOCAL偽指令指定的變量、標(biāo)號自動生成格式為“??ⅩⅩⅩⅩ”的符號,其中后四位順序使用0000~FFFF的十六進制數(shù)字。
【例】用連續(xù)相加的辦法實現(xiàn)無符號數(shù)乘法運算,編制宏定義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)用,則兩次的宏展開如下: ┇
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.宏定義嵌套含義:一個宏定義中包含另一個宏定義
【例】嵌套的宏定義:JUMP MACROCOND;外層宏定義J&COND&SMACRODEST;內(nèi)層宏定義 LOCALNEXT,EXITJ&CONDNEXT JMPEXITNEXT:JMPDESTEXITENDMENDM應(yīng)用:常常用這種宏定義嵌套來產(chǎn)生一些新的宏定義
例如外層宏調(diào)用為:JUMPEJUMPNEJUMPGJUMPGE分別形成內(nèi)層宏定義的宏名:JES,JNES,JGS,JGES。
如有兩個條件轉(zhuǎn)移的目標(biāo)地址分別是SUB1和SUB2,這時內(nèi)層宏調(diào)用為:┇JESSUB1;等于0轉(zhuǎn)移┇JGESSUB2;大于或等于0轉(zhuǎn)移┇當(dāng)宏匯編程序?qū)?nèi)層宏展開后,得如下結(jié)果:JE??0000JMP??0001??0000:JMPSUB1??0001:┇JGE??0002JMP??0003??0002:JMPSUB2??0003:┇
2.宏定義內(nèi)嵌套宏調(diào)用
含義:在一個宏定義的宏體內(nèi)有宏調(diào)用注意:被調(diào)用的宏指令必須是已定義的
【例】SHIFT是對32位數(shù)左移一位的宏定義,其中NUM1是高16位數(shù),NUM2是低16位數(shù)。MULT12是對一個32位數(shù)乘以12的宏定義,其中M_R1是存放高16位數(shù)的存儲單元或寄存器,M_R2是存放低16位數(shù)的存儲單元或寄存器。在乘法的過程中,要使用寄存器暫存32位數(shù),REG1和REG2就是指定用來暫存數(shù)據(jù)的兩個寄存器。在MULT12的宏定義中,當(dāng)需要對32位數(shù)進行左移時,就調(diào)用SHIFT的宏定義?,F(xiàn)有兩個宏定義:SHIFTMACRONUM1,NUM2SALNUM2,1RCLNUM1,1 ENDMMULT12MACROM_R1,M_R2,REG1,REG2PUSHFPUSHREG1PUSHREG2SHIFTM_R1,M_R2某數(shù)據(jù)段已定義變量:DA_WORDDW123H,456H程序中可以編寫宏指令語句:┇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宏程序庫含義:若干個宏定義以文件的形式組成一個宏庫,供其他源程序使用。
調(diào)用:在新編制的源程序中使用INCLUDE偽指令
宏指令與子程序的區(qū)別
相同點:(1)簡化源程序的書寫。(2)節(jié)省編程工作量。不同點:(1)宏指令并不節(jié)省目標(biāo)程序,子程序節(jié)省目標(biāo)代碼和存儲空間(2)宏指令的功能靈活,執(zhí)行速度快;子程序的靈活性差些,執(zhí)行速度也不如宏指令快【例12-10】用IRP重復(fù)匯編偽指令定義一個保存寄存器信息的宏定義:
PUSHREGMACROTEXTIRPREG,<TEXT>PUSHREGENDMENDM【例】用重復(fù)匯編可以在9*9個字節(jié)存儲單元中存放一個乘法九九表的數(shù)值:N=0REPT9N=N+1M=0REPT9M=M+1DBN*MENDMENDM
13.4重復(fù)匯編類型REPT偽指令
格式:REPT表達式┇┇ENDM重復(fù)語句序列
含義:將重復(fù)語句序列重復(fù)匯編,表達式的值為重復(fù)匯編的次數(shù)。重復(fù)匯編語句序列等效: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形參,<實參1,實參2,……>┇┇
ENDM
含義:將重復(fù)語句序列重復(fù)匯編,次數(shù)由實參個數(shù)所決定。
重復(fù)語句序列IRPC偽指令
格式:
IRPC形參,字符串┇┇ENDM
含義:將重復(fù)語句序列重復(fù)匯編,次數(shù)由字符串中字符個數(shù)決定重復(fù)語句序列對上述宏定義的宏調(diào)用:PUSHREG<AX,BX,CX,DX>在匯編源程序時,宏展開可得:+PUSHAX+PUSHBX+PUSHCX+PUSHDX對上述宏定義的宏調(diào)用:POPREGDCBA在匯編期間,宏展開可得:+POPDX+POPCX+POPBX+POPAX例:編制一個用IRPC偽指令從堆棧中恢復(fù)寄存器內(nèi)容的宏定義:
POPREGMACROSTRINGIRPCREG,STRINGPOPREG&XENDMENDM
13.5條件匯編含義:匯編程序根據(jù)條件的不同匯編不同的程序段。
格式:IF××表達式
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家政禮品服務(wù)合同協(xié)議書
- 2025寵物貓買賣合同范本
- C語言中圖像處理愛好者的實踐試題及答案
- 適應(yīng)變化2025年ACCESS考試試題及答案
- 2025企業(yè)辦公場地租賃合同范本
- 和老婆的合同協(xié)議書
- 2025年貴陽市公積金租房提?。汉贤闹匾约稗k理流程
- 2025年計算機二級VFP考試重要提醒試題及答案
- 2025大豆的收購合同范本
- 快餐合作合同協(xié)議書模板
- 東莞2025年東莞濱海灣新區(qū)管理委員會下屬事業(yè)單位招聘筆試歷年參考題庫附帶答案詳解
- 生死擂臺免責(zé)協(xié)議書
- 試管嬰兒合格協(xié)議書
- 事業(yè)單位公開招聘分類考試公共科目筆試考試大綱(2025版)
- 2023年甘肅省榆中縣事業(yè)單位公開招聘筆試題帶答案
- 高考考務(wù)人員培訓(xùn)系統(tǒng)試題答案
- 2023年江蘇省沭陽縣事業(yè)單位公開招聘輔警33名筆試題帶答案
- 健康管理PBL教程 課件 項目八 肥胖癥的健康管理
- 移動營業(yè)廳合作合同協(xié)議
- 家政搬家合同協(xié)議
- 2025-2030中國核電用鋼行業(yè)市場發(fā)展分析及發(fā)展趨勢預(yù)測研究報告
評論
0/150
提交評論