Intel匯編語言程序設(shè)計[第五版]Chapter10結(jié)構(gòu)和宏2_第1頁
Intel匯編語言程序設(shè)計[第五版]Chapter10結(jié)構(gòu)和宏2_第2頁
Intel匯編語言程序設(shè)計[第五版]Chapter10結(jié)構(gòu)和宏2_第3頁
Intel匯編語言程序設(shè)計[第五版]Chapter10結(jié)構(gòu)和宏2_第4頁
Intel匯編語言程序設(shè)計[第五版]Chapter10結(jié)構(gòu)和宏2_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件10.3 條件匯編偽指令條件匯編偽指令條件匯編偽指令的一般格式: IF condition statements ELSE statements ENDIF 當(dāng)condition為真時,允許匯編statements中的語句。 條件匯編偽指令條件匯編偽指令偽指令說明IF 表達(dá)式如果表達(dá)式為真則允許匯編。IFB 如果參數(shù)為空則允許匯編,參數(shù)名必須用括起來IFNB 如果參數(shù)不為空則允許匯編,參數(shù)名必須用括起來IFIDN ,如果兩個參數(shù)相同則允許匯編,參數(shù)區(qū)分大小寫IFIDNI ,如果兩個參數(shù)相同則允許匯編,參數(shù)不區(qū)分大小寫IFDIF ,如果兩個參數(shù)不同則允許

2、匯編,參數(shù)區(qū)分大小寫IFDIFI ,如果兩個參數(shù)不同則允許匯編,參數(shù)比區(qū)分大小寫IFDEF 名字如果名字已經(jīng)定義則允許匯編IFNDEF 名字如果名字未定義則允許匯編ENDIF結(jié)束一個條件匯編偽指令開始的語句塊ELSE如果前面的條件均為假,則匯編該偽指令至ENDIF之間的語句EXITM立即退出宏,阻止其后任何語句的展開立即退出宏,阻止其后任何語句的展開3計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件檢查缺少的參數(shù)檢查缺少的參數(shù)mWriteStr MACRO string IFB ECHO- ECHO * Error:parameter missing in mWriteStr ECHO * (no c

3、ode generated) ECHO- EXITM ENDIF push edx mov edx, OFFSET string call WriteString pop edxENDM 4計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件默認(rèn)的參數(shù)初始化值默認(rèn)的參數(shù)初始化值定義宏時可以有默認(rèn)的參數(shù)初始化值,如果調(diào)用宏時未給出參數(shù),則編譯器使用默認(rèn)參數(shù)值。格式為: paramname:= 例如:為mWriteLn宏提供一個空格作為默認(rèn)的參數(shù): mWriteLn MACRO text:= mWrite text call Crlf ENDM 如果調(diào)用時不帶參數(shù),那么仍然會打印一個空格并在后面跟一個換行符。

4、5計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件布爾表達(dá)式布爾表達(dá)式編譯器允許在常量布爾表達(dá)式中使用以下關(guān)系運算符: LT 小于 GT 大于 EQ 等于 NE 不等于 LE 小于等于 GE 大于等于6計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件IF,ELSE和ENDIF偽指令格式為: IF expression statement-list ENDIF或: IF expression statement-list ELSE statement-list ENDIF IF偽指令后面必須跟一個常量布爾表達(dá)式。表達(dá)式可以包含常量、符號常量或宏參數(shù)常量,但不能是寄存器或變量名。 7計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯

5、編課件課件例子:mGotoxyConst宏 mGotoxyConst宏使用LT和GT操作符對傳遞給宏的參數(shù)進(jìn)行范圍檢查,參數(shù)X和Y必須是常量。另一個常量ERRS用于統(tǒng)計發(fā)現(xiàn)的錯誤數(shù)。8計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件IFIDN和IFIDNI偽指令I(lǐng)FIDN偽指令以區(qū)分大小寫的方式比較兩個符號(包括宏參數(shù))是否相等,如果相等則返回TRUE。IFIDNI偽指令則不區(qū)分大小寫。格式為: IFIDN , statements ENDIFmReadBuf MACRO bufferPtr, maxchars IFIDNI , ECHO Warning:second argument to mrea

6、dbuf cannot be edx ECHO * EXITM ENDIF push ecx push edx mov edx, bufferPtr mov ecx, maxchars call ReadString pop edx pop ecxENDM下面的語句將導(dǎo)致宏產(chǎn)生一條錯誤信息: mReadBuf OFFSET buffer, edx 例如:下面的mReadBuf宏中,第二個參數(shù)不能是EDX,因為buffer的偏移被送到EDX時,參數(shù)會被覆蓋。例子:對矩陣行求和例子:對矩陣行求和定義宏mCalc_row_sum mCalc_row_sum MACRO index, arrayOff

7、set, rowSize, eltType LOCAL L1 mov eax, index mov ebx, arrayOffset mov ecx, rowSize mul ecx add ebx,eax shr ecx, (TYPE eltType/2) mov eax, 0 mov esi, 0L1: IFIDNI , mov edx, eltType ptrebx+esi*(TYPE eltType) ELSE movzx edx, eltType ptrebx+esi*(TYPE eltType) ENDIF loop L1ENDM11計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件特殊操作

8、符特殊操作符&替換操作符文本操作符!特殊字符操作符%展開操作符替換操作符& 將宏的內(nèi)部對宏參數(shù)的引用替換為調(diào)用時的實際值。 ShowRegister MACRO regName LOCAL tempStr .data tempStr BYTE “&regName=”,0 .code push eax push edx mov edx, offset tempStr call WriteString mov eax, regName call WriteHex pop edx pop eax ENDM當(dāng)程序中出現(xiàn)宏調(diào)用語句: ShowRegister ECX則宏調(diào)用的輸出

9、為: ECX=0000010113計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件展開操作符% 展開文本宏并把常量表達(dá)式轉(zhuǎn)換成文本。 在與用TEXTEQU聯(lián)合使用時,%操作符對常量表達(dá)式求值并將結(jié)果轉(zhuǎn)化成整數(shù)。 例1:count=10 sumVal TEXTEQU %(5+count) ; =“15” 例2:mGotoxyConst %(5*10), %(3+4) 調(diào)用宏時,兩個表達(dá)式分別被求值并作為參數(shù)傳遞14計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件行首的行首的% 當(dāng)%作為源代碼行的第一個字符時,預(yù)處理器將展開在該行發(fā)現(xiàn)的所有文本宏和宏函數(shù)。例子: .data array DWORD 1,2,3,4

10、,5,6,7,8 TempStr TEXTEQU %(SIZEOF array) .code % ECHO The array contains TempStr bytes 產(chǎn)生的輸出為: The array contains 32 bytes15計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件文本操作符 將多個字符或符號作為一個字符串進(jìn)行傳遞。 例如,本章前面的宏只接收一個唯一的字符串參數(shù),如果傳遞以下字符串,預(yù)處理器將解釋為三個參數(shù): mWrite “Line three”, 0dh, 0ah如果用文本操作符將字符串括起來,預(yù)處理器會將文本操作符里面的所有字符都作為單個宏參數(shù)進(jìn)行傳遞: mWrit

11、e 16計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件特殊字符操作符! 強制預(yù)處理器將預(yù)定義的操作符作為原始字符進(jìn)行傳遞。 例如: BadYValue TEXTEQU 2417計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件操作符的結(jié)合使用操作符的結(jié)合使用BadYValue TEXTEQU 24ShowWarning MACRO message mWrite “&message”ENDM則以下的宏調(diào)用: .code ShowWarning %BadYValue將產(chǎn)生如下結(jié)果: Warning:Y-coordinate is 24 先替換后展開先替換后展開18計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件宏

12、函數(shù)宏函數(shù)與宏過程類似,宏函數(shù)也是一個命名的匯編語句塊,唯一的不同在于,宏函數(shù)總是用EXITM偽指令返回一個常量值(整數(shù)或字符串)。 例如: IsDefined MACRO symbol IFDEF symbol EXITM ; True ELSE EXITM ; False ENDIF ENDM19計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件調(diào)用宏函數(shù):調(diào)用宏函數(shù)時參數(shù)列表必須用圓括號括起來。 例如:調(diào)用IsDefined宏,并向它傳遞一個已經(jīng)或尚未定義的參數(shù)RealMode: IF IsDefined(RealMode) mov ax, data mov ds, ax ENDIF 如果編譯器在

13、編譯該語句之前已經(jīng)遇到了RealMode的定義,則編譯后面兩條語句。20計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件10.4 定義重復(fù)塊定義重復(fù)塊 WHILE偽指令 REPEAT偽指令 FOR偽指令 FORC偽指令 鏈表 21計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件MASM中的重復(fù)塊偽指令只能用于編譯期間,而且只中的重復(fù)塊偽指令只能用于編譯期間,而且只能使用常量值作為循環(huán)條件和計數(shù)器。能使用常量值作為循環(huán)條件和計數(shù)器。 WHILE偽指令根據(jù)一個布爾表達(dá)式來重復(fù)語句塊 REPEAT偽指令根據(jù)一個計數(shù)器來重復(fù)語句塊 FOR偽指令通過遍歷一個符號列表中的每個符號來重復(fù)語句塊 FORC偽指令通過遍歷一個字

14、符串中的每個字符來重復(fù)語句塊22計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件WHILE偽指令偽指令格式如下: WHILE constExpression statements ENDM 只要常量表達(dá)式constExpression的值為真,WHILE偽指令就重復(fù)語句塊。 例如:以下代碼顯示了如何生成1到F0000000h之間的斐波那契數(shù)作為一系列編譯時期的常量。23計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件.dataval1=1val2=1DWORD val1DWORD val2val3=val1+val2WHILE val3 LT 0F0000000h DWORD val3 val1=val2 v

15、al2=val3 val3=val1+val2ENDM24計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件REPEAT偽指令偽指令REPEAT偽指令以固定次數(shù)重復(fù)指令塊。格式為: REPEAT constExpression statements ENDM constExpression是一個無符號整數(shù)常量表達(dá)式,它決定了重復(fù)次數(shù)。25計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件例如:以下的REPEAT循環(huán)創(chuàng)建了包含100個雙字的數(shù)組并用數(shù)列10,20,30,40,1000對其進(jìn)行初始化: ival=10 REPEAT 100 DWORD ival ival=ival+10 ENDM26計算機(jī)科學(xué)系計算機(jī)

16、科學(xué)系匯編匯編課件課件FOR偽指令偽指令FOR偽指令通過遍歷一個以逗號分隔的符號列表重復(fù)語句塊,符號列表中的每個符號都引發(fā)一次循環(huán)。格式如下: FOR parameter, statements ENDM 第i次循環(huán)時,參數(shù)parameter被賦值為argi27計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件FORC偽指令FORC偽指令通過遍歷一個字符串中的每個字符來重復(fù)語句塊,字符串中的每個字符都引發(fā)一次循環(huán)。格式如下: FORC parameter, statements ENDM 第i次循環(huán)中,參數(shù)parameter等于字符串string中的第i個字符。例如: Delimiters LABEL

17、BYTE FOR code,#$%&*! BYTE “&code” ENDM將生成以下數(shù)據(jù):00000000 40 1 BYTE “” 00000001 23 1 BYTE “#”00000002 24 1 BYTE “$”00000003 25 1 BYTE “%”00000004 5E 1 BYTE “”00000005 26 1 BYTE “&”00000006 2A 1 BYTE “*”00000007 3C 1 BYTE “”29計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件鏈表鏈表每個節(jié)點的數(shù)據(jù)區(qū)內(nèi)可以使用一個或多個變量存放節(jié)點的數(shù)據(jù)。在鏈接區(qū)中,用一個指針包含和鏈表相鄰的下一節(jié)點的地址。最后一個節(jié)點的鏈接區(qū)通常包含一個空指針。datalinddatalinddatalindNULL30計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件例子:首先創(chuàng)建一個鏈表節(jié)點類型,該類型包含一個整數(shù)(數(shù)據(jù)區(qū))和一個指向下一個相鄰節(jié)點的指針(鏈接區(qū)): ListNode STRUCT NodeData DWORD ? NextPtr DWORD ? ListNode ENDS31計算機(jī)科學(xué)系計算機(jī)科學(xué)系匯編匯編課件課件接著使用RE

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論