第13章 高級宏匯編語言技術(shù)_第1頁
第13章 高級宏匯編語言技術(shù)_第2頁
第13章 高級宏匯編語言技術(shù)_第3頁
第13章 高級宏匯編語言技術(shù)_第4頁
第13章 高級宏匯編語言技術(shù)_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論