chap5程序設(shè)計(jì)方法ppt課件_第1頁
chap5程序設(shè)計(jì)方法ppt課件_第2頁
chap5程序設(shè)計(jì)方法ppt課件_第3頁
chap5程序設(shè)計(jì)方法ppt課件_第4頁
chap5程序設(shè)計(jì)方法ppt課件_第5頁
已閱讀5頁,還剩114頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第5章章 程序設(shè)計(jì)方法程序設(shè)計(jì)方法5.1 概概 述述5.2 順序程序設(shè)計(jì)順序程序設(shè)計(jì)5.3 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)5.4 分支程序設(shè)計(jì)分支程序設(shè)計(jì)5.5 子程序設(shè)計(jì)子程序設(shè)計(jì)5.6 模塊化程序設(shè)計(jì)模塊化程序設(shè)計(jì)5.7 高級匯編語言技術(shù)高級匯編語言技術(shù)5.1 概述概述5.1.1 匯編語言程序設(shè)計(jì)的一般步匯編語言程序設(shè)計(jì)的一般步驟驟5.1.2 流程圖流程圖5.1.1 匯編語言程序設(shè)計(jì)的一般步匯編語言程序設(shè)計(jì)的一般步驟驟匯編語言程序設(shè)計(jì)一般有以下幾個(gè)步匯編語言程序設(shè)計(jì)一般有以下幾個(gè)步驟:驟:1分析問題,確定算法分析問題,確定算法 數(shù)據(jù)段、變數(shù)據(jù)段、變量等量等2繪制流程圖繪制流程圖3根據(jù)流程圖編制

2、程序根據(jù)流程圖編制程序4調(diào)試程序調(diào)試程序5.1.2 流程圖流程圖1流程圖的概念流程圖的概念流程圖是由特定的幾何圖形、指向線、文流程圖是由特定的幾何圖形、指向線、文字說明來表示數(shù)據(jù)處理的步驟,形象描述字說明來表示數(shù)據(jù)處理的步驟,形象描述邏輯控制結(jié)構(gòu)以及數(shù)據(jù)流程的示意圖。流邏輯控制結(jié)構(gòu)以及數(shù)據(jù)流程的示意圖。流程圖具有簡潔、明了、直觀的特點(diǎn)。程圖具有簡潔、明了、直觀的特點(diǎn)。2流程圖符號表示流程圖符號表示(1起止框:表示程序起止框:表示程序的開始和結(jié)束。的開始和結(jié)束。起止框起止框(2判斷框判斷框 (3處理框處理框 (4調(diào)用框調(diào)用框 (5指向線指向線 (6連接框連接框 5.2 順序程序設(shè)計(jì)順序程序設(shè)計(jì)下

3、面舉例說明順序程序的設(shè)計(jì)。下面舉例說明順序程序的設(shè)計(jì)?!纠吭嚲帉懸怀绦蛴?jì)算以下表達(dá)式的【例】試編寫一程序計(jì)算以下表達(dá)式的值。值。=(v-(*+-540)/x式中式中x、v均為有符號字?jǐn)?shù)據(jù)。均為有符號字?jǐn)?shù)據(jù)。設(shè)設(shè) x, y, z, v 的值存放在字變量、的值存放在字變量、V中,結(jié)果存放在雙字變量之中,結(jié)果存放在雙字變量之中,程序的流程圖如圖中,程序的流程圖如圖5.1所示。所示。圖圖5.1 5.1 順序運(yùn)算程序流程圖順序運(yùn)算程序流程圖=(v-(*+-540)/xDATASEGMENTX DW200Y DW100Z DW 3000V DW10000W DW 2 DUP(?)(?)DATAENDSC

4、ODESEGMENTASSUME DS:DATA,CS:CODEMIAN PROC FARSTART: MOVAX,DATAMOVDS,AX ;DATAAXMOVAX,X IMULY;(;(X)*(Y)DX:AXMOVCX,AXMOVBX,DX ;(DX:AX)(BX:CX)MOVAX,ZCWD;(;(Z符號擴(kuò)展符號擴(kuò)展CWD;(;(V符號擴(kuò)展符號擴(kuò)展SUB AX,CXSBB DX,BX;(DX:AX)-(BX:CX)(DX:AX)DIV X;(;(DX:AX)/XADD CX,AXADC BX,DX;(BX:CX)+(DX:AX)(BX:CX)SUB CX,540SBB BX,0;(;(BX

5、:CX)-550(BX:CX)MOVAX,V MOV W,AX;商;商WMOV W+2,DX ;余數(shù);余數(shù)DXW+2MOV AH,4CHINT21HMIAN ENDPCODEENDS;退出;退出DOS 狀態(tài)狀態(tài)END START【例】【例】已知某班學(xué)生的英語成績按學(xué)號從已知某班學(xué)生的英語成績按學(xué)號從1/0開始從小到大的順序排列在開始從小到大的順序排列在TAB表中,要查的學(xué)生的學(xué)號放在表中,要查的學(xué)生的學(xué)號放在變量變量NO中,查表結(jié)果放在變量中,查表結(jié)果放在變量ENGLISH中。編寫程序如下:中。編寫程序如下:STACKSEGMENT STACKDB 200 DUP0)STACKENDSDATA

6、SEGMENTTAB DB 80,85,86,71,79,96 DB 83,56,32,66,78,85NO DB 10ENGLIST DB ?DATAENDSCODESEGMENTASSUME DS:DATA, SS: STACK,CS: CODEMAIN PROC FARBEGIN:MOVAX,DATAMOVDS ,AXLEABX,TAB MOVAL,NO80858510-TABNOENGLISTDEL ALXLATTABMOVENGLISH,ALMOVAH,4CHINT 21HMAIN ENDPCODEENDSEND BEGIN80858510-TABNOENGLIST5.3 循環(huán)程序設(shè)

7、計(jì)循環(huán)程序設(shè)計(jì)5.3.1 循環(huán)程序的結(jié)構(gòu)循環(huán)程序的結(jié)構(gòu)5.3.2 單重循環(huán)程序設(shè)計(jì)單重循環(huán)程序設(shè)計(jì)5.3.3 多重循環(huán)程序設(shè)計(jì)多重循環(huán)程序設(shè)計(jì)5.3.1 循環(huán)程序的結(jié)構(gòu)循環(huán)程序的結(jié)構(gòu)1初始化部分初始化部分2循環(huán)體部分循環(huán)體部分3循環(huán)控制部分循環(huán)控制部分LOOP指令指令條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令循環(huán)常見結(jié)構(gòu)如圖所示。循環(huán)常見結(jié)構(gòu)如圖所示。5.3.2 單重循環(huán)程序設(shè)計(jì)單重循環(huán)程序設(shè)計(jì)1計(jì)數(shù)控制計(jì)數(shù)控制 已知循環(huán)次數(shù)已知循環(huán)次數(shù) 類似類似FOR語句語句2條件控制條件控制 通過某條件控制通過某條件控制 如:當(dāng)某數(shù)不為零時(shí)循環(huán)如:當(dāng)某數(shù)不為零時(shí)循環(huán) 類似類似WHILE語句語句【例】【例】 試編一程序,把試

8、編一程序,把BX寄存器內(nèi)的二進(jìn)制數(shù)寄存器內(nèi)的二進(jìn)制數(shù)用十六進(jìn)制的形式在屏幕上顯示出來用十六進(jìn)制的形式在屏幕上顯示出來1.四位一組轉(zhuǎn)換成十六進(jìn)制四位一組轉(zhuǎn)換成十六進(jìn)制11010101B=D5H2.在屏幕上顯示時(shí),要使用在屏幕上顯示時(shí),要使用ASCII碼碼要顯示要顯示D5必須轉(zhuǎn)成必須轉(zhuǎn)成 44H 35H3.分離十六進(jìn)制的每一位,先輸出最高位分離十六進(jìn)制的每一位,先輸出最高位4.使用使用DOS功能調(diào)用功能調(diào)用 02功能功能 要輸入的字符的要輸入的字符的ASCII碼存入碼存入DL中,功能號送中,功能號送AH中中MOV DL,S MOV AH,02 INT 21H 0101 0000 011000111

9、101 00110101 00110000 00110110 3D 35 30 36 ? 5 0 6 44H DD 5 0 6PROGNAME SEGMENTMAIN PROC FARASSUME CS: PROGNAMESTART: PUSH DS SUB AX,AX;AX=0 PUSH AX MOV CH, 4;循環(huán)次數(shù)循環(huán)次數(shù)ROTATE: MOV CL, 4 ; BX=D506H ROL BX, CL ; BX=506DHMOV AL, BL ; BL=6DHAND AL, 0FH ; AL=0DHADD AL, 30H ; AL=3DHCMP AL,3AHJL PRINITADD A

10、L,07H ;AL=3D+07=44HPRINIT: MOV DL, AL ; DL=44HMOV AH, 02HINT 21H ; 在屏幕上輸出在屏幕上輸出DDEC CH;JNZ ROTATE;處理下四個(gè)二進(jìn)制位;處理下四個(gè)二進(jìn)制位RETMAIN ENDPPROGNAME ENDSEND START例:在例:在ADDR單元中存放著數(shù)單元中存放著數(shù)Y的地址,試編的地址,試編制一程序把制一程序把Y中的中的1的個(gè)數(shù)存入的個(gè)數(shù)存入COUNT單元中單元中Y=0 ? 如果如果Y=0則則1的個(gè)數(shù)是的個(gè)數(shù)是0否則,按位判斷否則,按位判斷移位指令移位指令 SF CF Y01101 0101 0010 0110

11、0011010 1010 0100 110001DATA SEGMENTADDR DW NUMBERNUMBER DW 1101010100100110BCOUNT DW ?DATA ENDSMOV CX,0 ; CX做計(jì)數(shù)器做計(jì)數(shù)器MOV BX, ADDR ; BX中存放數(shù)字的地址中存放數(shù)字的地址MOV AX,BX ; AX 中存放二進(jìn)制數(shù)中存放二進(jìn)制數(shù)REPEAT: TEST AX, FFFFH JZ EXIT;如果如果AX=0則結(jié)束則結(jié)束 JNS SHIIFT;SF=0則看下一位則看下一位 INC CX ;SF=1 計(jì)數(shù)器加計(jì)數(shù)器加1 SHIFT: SHL AX,1 JMP REPEAT

12、 附加段中,有一個(gè)首地址為附加段中,有一個(gè)首地址為LIST的未的未經(jīng)排序的字?jǐn)?shù)組,數(shù)組的第一個(gè)字中,存放經(jīng)排序的字?jǐn)?shù)組,數(shù)組的第一個(gè)字中,存放著數(shù)組的長度,首地址已經(jīng)存入著數(shù)組的長度,首地址已經(jīng)存入DI寄存器中,寄存器中,AX中存放著一個(gè)數(shù)。要求編程序,在數(shù)組中存放著一個(gè)數(shù)。要求編程序,在數(shù)組中查找該數(shù),如果找到刪除中查找該數(shù),如果找到刪除71820157911LISTAX=20DI6432105CX=7例:例:DEL_UL PROC NEAR CLD PUSH DI MOV CX, ES:DI;數(shù)組中元素個(gè)數(shù)送數(shù)組中元素個(gè)數(shù)送CX ADD DI,2; 指向第一個(gè)元素指向第一個(gè)元素 REPNE

13、 SCASW;串掃描;串掃描 AL-ES:DI JE DELETE ;找到數(shù)據(jù),刪除之找到數(shù)據(jù),刪除之 POP DI ;沒找到數(shù)據(jù),還原沒找到數(shù)據(jù),還原DI的值的值 JMP SHORT EXIT CX 表示還未檢查的元素的表示還未檢查的元素的個(gè)數(shù)個(gè)數(shù)DI 相匹配元素的下一個(gè)元相匹配元素的下一個(gè)元素的地址素的地址DELETE: JCXZ DEC_CNT;數(shù)組在最后一位數(shù)組在最后一位NEXT_EL: MOV BX, ES:DI MOV ES:DI-2,BX ADD DI,2 LOOP NEXT_EL;循環(huán)次數(shù)循環(huán)次數(shù)CXDEC_CNT:POP DI;修改數(shù)據(jù)個(gè)數(shù)修改數(shù)據(jù)個(gè)數(shù) DEC WORD PT

14、R ES:DIEXIT: RETDEL_UL ENDP71820157911LISTAX=20DI6432105CX=77181515791171815779117181579911718157911116123910171921HEAD61239101719212161239101719192161239101717192161239101017192161236910171921NSIEND例:在已排序的數(shù)組的適當(dāng)位置插入數(shù)據(jù)例:在已排序的數(shù)組的適當(dāng)位置插入數(shù)據(jù)MOV AX, 6MOV ARRAY_HEAD-2,FFFFH;X單元存入單元存入-1MOV SI,0COMPARE: CMP A

15、RRAY_ENDSI, AX JLE INSERT MOV BX, ARRAY_ENDSI MOV ARRAY_ENDSI+2,BX SUB SI, 2 JMP COMPARE INSERT: MOV ARRAY_ENDSI+2, AX 12369SISI+2SI-2=SI5.3.3 多重循環(huán)程序設(shè)計(jì)多重循環(huán)程序設(shè)計(jì)【例】在以【例】在以A A為首址的字存儲(chǔ)區(qū)中存放有為首址的字存儲(chǔ)區(qū)中存放有N N個(gè)有符個(gè)有符號數(shù),編寫其程序?qū)⑺鼈儼创蟮叫〉捻樞蚺帕刑枖?shù),編寫其程序?qū)⑺鼈儼创蟮叫〉捻樞蚺帕性谠贏 A存儲(chǔ)區(qū)中存儲(chǔ)區(qū)中我們采用冒泡排序算法從第一個(gè)數(shù)開始依次對我們采用冒泡排序算法從第一個(gè)數(shù)開始依次對相鄰

16、兩個(gè)數(shù)進(jìn)行比較,如次序?qū)?,則不交換兩相鄰兩個(gè)數(shù)進(jìn)行比較,如次序?qū)?,則不交換兩數(shù)位置;如次序不對數(shù)位置;如次序不對, ,則使這兩個(gè)數(shù)交換位置。則使這兩個(gè)數(shù)交換位置??梢钥闯觯谝槐樾璞容^可以看出,第一遍需比較N-1N-1次,此時(shí),次,此時(shí),最小的數(shù)已經(jīng)放到了最后;第二遍比較只需考最小的數(shù)已經(jīng)放到了最后;第二遍比較只需考慮剩下的慮剩下的N-1N-1個(gè)數(shù),即只需比較個(gè)數(shù),即只需比較N-2N-2次;次;第三遍只需比較第三遍只需比較N-3N-3次,次,整個(gè)排序過整個(gè)排序過程最多需程最多需N-1N-1遍。遍。數(shù)數(shù)108169032第一遍第一遍108169032 10 168 90 32 10 16 90

17、8 32 10 16 90 32 8 第二遍第二遍169032108第三遍第三遍903216108如下面的如下面的5 5個(gè)數(shù)即是采用冒泡排序比較的例子。個(gè)數(shù)即是采用冒泡排序比較的例子。DATASEGMENTADW 3,-5,6,7,9,2,0,-8, -9,-10,20N=(-A)/2DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOV CX,N DEC CXLOOP1:MOVDI,CX;保存外循環(huán)次數(shù)保存外循環(huán)次數(shù) MOVBX,0;?內(nèi)循環(huán)次數(shù)內(nèi)循環(huán)次數(shù)LOOP2:MOVAX,ABX CMPAX,AB

18、X+2 JGECONTINUE XCHG AX,ABX+2 MOV ABX,AX108CONTINU:ADDBX,2 DECCX; JNE LOOP2;LOOP LOOP2 MOVCX,DI LOOPLOOP1 MOVAH,4CH INT 21HCODE ENDSEND START程序運(yùn)行后,程序運(yùn)行后,A中的內(nèi)容如下:中的內(nèi)容如下:20,9,7,6,3,2,0,-5,-8,-9,-10若要對若要對N個(gè)無符號數(shù)按由大到小的順序個(gè)無符號數(shù)按由大到小的順序排列,只需將指令排列,只需將指令“JGE ”改為改為“JAE ”即可。即可。 5.4 分支程序設(shè)計(jì)分支程序設(shè)計(jì)5.4.1 用條件轉(zhuǎn)移指令實(shí)現(xiàn)程序

19、分支用條件轉(zhuǎn)移指令實(shí)現(xiàn)程序分支5.4.2 用跳轉(zhuǎn)表實(shí)現(xiàn)多路分支用跳轉(zhuǎn)表實(shí)現(xiàn)多路分支5.4.1 用條件轉(zhuǎn)移指令實(shí)現(xiàn)程序分支用條件轉(zhuǎn)移指令實(shí)現(xiàn)程序分支編寫計(jì)算下面函數(shù)值的程序:編寫計(jì)算下面函數(shù)值的程序: 1X0Y= 0X=0 -1XHIGHLOW,HIGH初始化初始化CF=0 查找不成功,查找不成功,Y CF=0退出退出N計(jì)算中間元素下標(biāo)計(jì)算中間元素下標(biāo)MID=LOW+HIGH/2AX=RMID= 勝利勝利LOW=MID+1HIGH=MID-19表示不合法輸入表示不合法輸入 CBW;AL擴(kuò)展到擴(kuò)展到AX XCHG AX, BX ; AX=0 BX=MMOV CX, 10MUL CX; XCHG A

20、X,BX; BX=0 AX=MADD BX, AX; BX=0+MJMP NEW CHAR EXIT: RETDECIBIN ENDP十進(jìn)制數(shù)十進(jìn)制數(shù):1234=(010+1) 10+2) 10+3) 10+4十六進(jìn)制:十六進(jìn)制:=(0A+1) A+2) A+3) A+4=(A+2) A+3) A+4=(CA+3)A+4 =7BA+4=04D2實(shí)際是利用計(jì)算機(jī)內(nèi)部按實(shí)際是利用計(jì)算機(jī)內(nèi)部按16進(jìn)制計(jì)算的結(jié)果。進(jìn)制計(jì)算的結(jié)果。(0 A+D1)A+D2)A+D3) A+D4CRLF PROC NEAR MOV DL,0DH MOV AH,02H INT 21H ;輸出回車符輸出回車符 MOV DL,

21、0AH MOV AH,02H INT 21H;輸出換行符;輸出換行符 RETCRLF ENDP 回車換行子程序回車換行子程序BINIHEX PROC NEAR MOV CH,4ROTATE:MOV CL,4 ROL BX,4 MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH JL PRINTIT ADD AL,07HPRINTIT: MOV DL,AL MOV AH,02H INT 21H DEC CH JNZ ROTATERETBINIHEX ENDP2.同一個(gè)代碼段中可以通過變量傳參同一個(gè)代碼段中可以通過變量傳參DATA SEGMENT ARY DW 1

22、00 DUP(?) COUNT DW 100SUM DW ?DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS: CODE ,DS:DATASATART: PUSH DS XOR AX,AX PUSH AX MOV AX, DATA MOV DS, AX CALL NEAR PTR PROADD :;:;prntsum RETMAIN ENDPPROADD PROC NEAR PUSH AX PUSH CX PUSH SI LEA SI, ARY MOV CX, COUNT XOR AX,AXNEXT: ADD AX,SI ADD SI,2 LOOP NE

23、XTMOV SUM ,AXPOP SIPOP CXPOP AXRETPROADD ENDPCODE ENDS END START5.7 高級匯編語言技術(shù)高級匯編語言技術(shù)5.7.1 宏指令宏指令5.7.2 宏指令的使用過程宏指令的使用過程5.7.3 宏操作符宏操作符5.7.4 局部符號偽指令局部符號偽指令LOCAL5.7.5 宏庫的使用宏庫的使用5.7.6 重復(fù)匯編重復(fù)匯編5.7.7 條件匯編條件匯編5.7.1 宏指令宏指令在匯編語言程序設(shè)計(jì)過程中,可以將具在匯編語言程序設(shè)計(jì)過程中,可以將具有一定功能,需多次重復(fù)使用,且比較有一定功能,需多次重復(fù)使用,且比較短的程序段定義成一條宏指令。短的程序段

24、定義成一條宏指令。使用宏指令語句可以減少程序書寫錯(cuò)誤,使用宏指令語句可以減少程序書寫錯(cuò)誤,縮短源程序長度,使源程序編寫像高級縮短源程序長度,使源程序編寫像高級語言一樣清晰、簡潔。特別是使用宏庫語言一樣清晰、簡潔。特別是使用宏庫后,可以提高編程效率。后,可以提高編程效率。5.7.2 宏指令的使用過程宏指令的使用過程1宏定義宏定義2宏調(diào)用宏調(diào)用3宏擴(kuò)展宏擴(kuò)展1宏定義宏定義(1帶參宏定義帶參宏定義宏指令名宏指令名 MACRO 形參形參1,形參,形參2, .宏體宏體 ENDM(2無參宏定義無參宏定義宏指令名宏指令名 MACRO . 宏體宏體 ENDM注:宏指令名即宏的名稱,第一個(gè)字符必須是字注:宏指令

25、名即宏的名稱,第一個(gè)字符必須是字母,其后可以是字母、數(shù)字、下劃線母,其后可以是字母、數(shù)字、下劃線例子:定義一個(gè)宏,完成輸出緩例子:定義一個(gè)宏,完成輸出緩沖區(qū)字符串的功能沖區(qū)字符串的功能print MACRO bufoffset lea dx,bufoffset mov ah,09 int 21h ENDM無參數(shù)宏無參數(shù)宏INITSR MACROMOV AX,DATA1MOV DS,AXMOV AX,DATA2MOV ES,AX ENDM2宏調(diào)用宏調(diào)用格式:格式:宏指令名宏指令名 實(shí)參實(shí)參1,實(shí)參,實(shí)參2,例:對上面的宏定義的三種調(diào)用形式為:例:對上面的宏定義的三種調(diào)用形式為:PRINTBUF1

26、 ;宏必須先定義再使用,通常;宏必須先定義再使用,通常 ;將宏寫在所有代碼之前;將宏寫在所有代碼之前PRINTBUF2PRINTBUF33宏擴(kuò)展宏擴(kuò)展+ LEA DX,BUF1+ MOV AH,9+ INT 21H+ LEA DX, BUF2+ MOV AH,9+ INT 21H + LEADX,BUF3+ MOVAH,9+ INT 21H例如:上面三次宏調(diào)用,其展開的形式為:例如:上面三次宏調(diào)用,其展開的形式為: 在對源程序匯編時(shí),匯編程序在對源程序匯編時(shí),匯編程序?qū)γ總€(gè)宏調(diào)用進(jìn)行展開,列表對每個(gè)宏調(diào)用進(jìn)行展開,列表文件會(huì)在宏展開指令前用文件會(huì)在宏展開指令前用“+”號指示。在宏展開時(shí),用實(shí)際

27、號指示。在宏展開時(shí),用實(shí)際參數(shù)取代形式參數(shù)。不要求形參數(shù)取代形式參數(shù)。不要求形參實(shí)參個(gè)數(shù)相等。實(shí)參多,則參實(shí)參個(gè)數(shù)相等。實(shí)參多,則多余實(shí)參不予考慮;若形參多,多余實(shí)參不予考慮;若形參多,則多余形參做則多余形參做“空處置??仗幹谩?shí)參取代形參時(shí),必須符合匯實(shí)參取代形參時(shí),必須符合匯編指令格式,否則會(huì)提示錯(cuò)誤。編指令格式,否則會(huì)提示錯(cuò)誤。宏的特點(diǎn)宏的特點(diǎn)宏調(diào)用時(shí)可以用實(shí)參代替形參,避免了子程宏調(diào)用時(shí)可以用實(shí)參代替形參,避免了子程序引傳遞參數(shù)帶來的麻煩。序引傳遞參數(shù)帶來的麻煩。參數(shù)可以是常數(shù)、寄存器、存儲(chǔ)單元等,甚參數(shù)可以是常數(shù)、寄存器、存儲(chǔ)單元等,甚至可以是指令的操作碼或操作碼的一部分至可以是指令

28、的操作碼或操作碼的一部分工作方式與子程序不同:工作方式與子程序不同:子程序占有自身大小的空間,執(zhí)行時(shí)由主程子程序占有自身大小的空間,執(zhí)行時(shí)由主程序調(diào)用;序調(diào)用;宏則在匯編期間展開,調(diào)用一次展開一次,宏則在匯編期間展開,調(diào)用一次展開一次,因此所占空間也隨著調(diào)用次數(shù)而增大因此所占空間也隨著調(diào)用次數(shù)而增大總結(jié)子程序與宏的異同點(diǎn)總結(jié)子程序與宏的異同點(diǎn)5.7.3 宏定義中的參數(shù)宏定義中的參數(shù)1.可以無參數(shù)可以無參數(shù) 例例P2492.可以是操作碼可以是操作碼 、操作數(shù)等、操作數(shù)等例:在程序中定義大小及初值不同的堆棧段。例:在程序中定義大小及初值不同的堆棧段。宏定義如下:宏定義如下:DSTACKMACRO

29、ASTACKSEGMENT STACKDBA dup (?)STACKENDSENDM宏定義:宏定義: FOO MACRO P1,P2,P3 MOV AX,P1 P2 P3 ENDM宏調(diào)用:宏調(diào)用: FOO bx,mul,bx; FOO bx, add, 4宏展開:宏展開:mov ax,bx mul bxmov ax,bxadd 4FOO BL3.參數(shù)可以是操作碼或操作數(shù)的一部分,必參數(shù)可以是操作碼或操作數(shù)的一部分,必須在宏定義體中用須在宏定義體中用&作為分隔符作為分隔符&作為形參前綴,把其前后兩個(gè)符號合并形作為形參前綴,把其前后兩個(gè)符號合并形成一個(gè)符號,這個(gè)符號可以是操作碼操

30、作成一個(gè)符號,這個(gè)符號可以是操作碼操作數(shù)或是一個(gè)字符串?dāng)?shù)或是一個(gè)字符串FO MACRO CON, P1 J&CON STR&P1 ENDMMSG MACRO LAB,NUM,XYZ LAB&NUM DB HELLO, MR&XYZ ENDMFO E, 3展開:展開:JE STR3MSG BUF,1,RIGHT展開:展開:BUF1 DB “HELLO MR RIGHT”4.%操作符操作符匯編程序?qū)R編程序?qū)?后面的表達(dá)式轉(zhuǎn)換成當(dāng)前基數(shù)后面的表達(dá)式轉(zhuǎn)換成當(dāng)前基數(shù)下的數(shù)。宏調(diào)用時(shí)使用下的數(shù)。宏調(diào)用時(shí)使用msg macro count,string msg&co

31、unt db string endmerrmsg macro text cntr=cntr+1;程序中定義的常量初值程序中定義的常量初值 msg %cntr,text ;在一個(gè)宏定義體中調(diào)在一個(gè)宏定義體中調(diào) ;用另一個(gè)已定義的宏用另一個(gè)已定義的宏 endmDATA1MACRO A, B, C, D DW A, B, CDBD DUP0)ENDM如果宏調(diào)用為:如果宏調(diào)用為:X=10Y=20DATA1%X+2, 5,%X+Y, %Y-5DATA1X+2, 5, X+Y, Y-5則相應(yīng)的宏擴(kuò)展為:則相應(yīng)的宏擴(kuò)展為:+ DW12, 5, 30+ DB 15 DUP0)+ DWX+2, 5, X+Y+

32、DB Y-5 DUP (0)5.7.4 局部符號偽指令局部符號偽指令LOCAL當(dāng)宏中使用了標(biāo)號,當(dāng)宏中使用了標(biāo)號,在多次宏調(diào)用后就會(huì)出現(xiàn)多個(gè)在多次宏調(diào)用后就會(huì)出現(xiàn)多個(gè)重復(fù)標(biāo)號,這是不允許的。重復(fù)標(biāo)號,這是不允許的。Local可以解決此問題。可以解決此問題。格式:格式:Local 標(biāo)號列表標(biāo)號列表;宏定義中出現(xiàn)的標(biāo)號;宏定義中出現(xiàn)的標(biāo)號注:必須是宏定義體的第一句。注:必須是宏定義體的第一句。SUM MACROX,Y LOCALL MOVCX,X MOV BX,Y MOVAX,0L: ADD AX,BX INCBX LOOP L ENDM 兩次調(diào)用宏指令如下:兩次調(diào)用宏指令如下:SUM100,1S

33、UM50,1則宏擴(kuò)展形式為:則宏擴(kuò)展形式為:MOVCX,100MOVBX,1MOVAX,0?0000:ADD AX,BXINCBXLOOP ?0000MOVCX,50MOVBX,10MOVAX,0?0001:ADD AX,BX INCBXLOOP ?00015.7.5 宏庫的使用宏庫的使用引入宏庫的語句格式:引入宏庫的語句格式:INCLUDE 庫文件名庫文件名;include mymacro.lib宏庫文件的建立:將包含宏的宏庫文件的建立:將包含宏的文件存成文件存成.lib類型的文件類型的文件即可。即可。假設(shè)已建立一名為假設(shè)已建立一名為MACRO.LIB的宏庫,其內(nèi)容如下:的宏庫,其內(nèi)容如下:

34、INPUTMACROALEADX,AMOVAH,10;10號系統(tǒng)功能調(diào)用號系統(tǒng)功能調(diào)用INT21HENDMPRINTMACROALEADX,AMOVAH,9;9號系統(tǒng)功能調(diào)用號系統(tǒng)功能調(diào)用INT21HENDMRETURNMACRO MOVAH,2MOVDL,0AHINT21HMOVDL,0DH;回車換行;回車換行INT21HENDMOUT2MACROAMOVDL,AMOVAH,2 ;2號系統(tǒng)功能調(diào)用號系統(tǒng)功能調(diào)用INT21HENDMSTACK0 MACRO ASTACKSEGMENTSTACKDBASTACKENDSENDM現(xiàn)要從鍵盤輸入一串字符到系統(tǒng)緩沖區(qū),現(xiàn)要從鍵盤輸入一串字符到系統(tǒng)緩沖區(qū)

35、,然后將字符按相反順序打印,然后將字符按相反順序打印,采用調(diào)用宏庫的辦法,其程序采用調(diào)用宏庫的辦法,其程序如下:如下:INCLUDEMACRO.LIBSTACK0200DUP (0) ;定義堆棧;定義堆棧段段DATASEGMENTINF01DBINPUT STRING:INF02DBOUTPUT STRING:BUFADB81DB?DB80 DUP0)BUFBDB 81 DUP0)DATAENDSCODESEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXRETURN;輸出回車換行;輸出回車換行PRINT INFO1 ;輸出字符變量;輸出字符變量INFO1代表的代表的字符串字符串INPUT BUFA;鍵盤輸入字符中到緩沖區(qū);鍵盤輸入字符中到緩沖區(qū);LEASI,BUFA+1MOVCH,0MOVCL,SIADDSI,CXLEADI,BUFBNEXT:MOV AL,SIMOVDI,ALDECSIINCDILOOPNEXTMOVBYTE PTR DI,RETURN ;輸出回車換行;輸出回車換行PRINTINF02 ;輸出的字符串變量;輸出的字符串變量INF02代表代表PRINTBUFB ;反向輸出輸入字符串;反向輸出輸入字符串MOVAH,5CHINT21HCODEENDSENDSTART5.7.6

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論