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

下載本文檔

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

文檔簡介

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

(4)調用框

(5)指向線(6)連接框

5.2順序程序設計下面舉例說明順序程序的設計。【例】試編寫一程序計算以下表達式的值。w=(v-(x*y+z-540))/x

式中x、y、z、v均為有符號字數(shù)據(jù)。設x,y,z,v的值存放在字變量X、Y、Z、V中,結果存放在雙字變量W之中,程序的流程圖如圖5.1所示。DATA SEGMENTX DW 200Y DW 100Z DW 3000V DW 10000W DW 2DUP(?)DATA ENDSCODE SEGMENT ASSUMEDS:DATA,CS:CODEMIANPROCFARSTART: MOV AX,DATA MOV DS,AX

;DATA→AX MOV AX,X IMUL Y ;(X)*(Y)→DX:AX MOV CX,AX MOV BX,DX ;(DX:AX)→(BX:CX) MOV AX,Z CWD ;(Z)符號擴展CWD ;(V)符號擴展SUB AX,CXSBB DX,BX;(DX:AX)-(BX:CX)→(DX:AX)DIV X ;(DX:AX)/X

ADD CX,AXADC BX,DX;(BX:CX)+(DX:AX)→(BX:CX)SUB CX,540SBB BX,0;(BX:CX)-550→(BX:CX)MOV AX,V【例】已知某班學生的英語成績按學號(從1/0開始)從小到大的順序排列在TAB表中,要查的學生的學號放在變量NO中,查表結果放在變量ENGLISH中。編寫程序如下:STACK SEGMENTSTACKDB 200DUP(0)STACK ENDSDATA SEGMENTTAB DB80,85,86,71,79,96 DB83,56,32,66,78,85NO DB10ENGLISTDB?DATA ENDSCODE SEGMENTASSUMEDS:DATA,SS:STACK,CS:CODEMAINPROCFARBEGIN:MOV AX,DATA MOV DS,AX LEA BX,TAB MOV AL,NO 80858510--TABNOENGLIST5.3循環(huán)程序設計5.3.1循環(huán)程序的結構5.3.2單重循環(huán)程序設計5.3.3多重循環(huán)程序設計5.3.1循環(huán)程序的結構1.初始化部分2.循環(huán)體部分3.循環(huán)控制部分LOOP指令條件轉移指令循環(huán)常見結構如圖所示?!纠?/p>

試編一程序,把BX寄存器內(nèi)的二進制數(shù)用十六進制的形式在屏幕上顯示出來1.四位一組轉換成十六進制11010101B=D5H2.在屏幕上顯示時,要使用ASCII碼要顯示D5必須轉成44H

35H3.分離十六進制的每一位,先輸出最高位4.使用DOS功能調用02功能要輸入的字符的ASCII碼存入DL中,功能號送AH中MOVDL,’S’↙MOVAH,02↙INT21H010100000110001111010011010100110000001101103D353036?‘5’

‘0’

‘6’44H

‘D’‘D’

’5’

’0’

’6’PROGNAMESEGMENTMAINPROCFARASSUMECS:PROGNAMESTART:PUSHDSSUBAX,AX;AX=0PUSHAXMOVCH,4;循環(huán)次數(shù)ROTATE:MOVCL,4;BX=D506HROLBX,CL;BX=506DHDECCH;JNZROTATE;處理下四個二進制位RETMAINENDPPROGNAMEENDSENDSTART例:在ADDR單元中存放著數(shù)Y的地址,試編制一程序把Y中的1的個數(shù)存入COUNT單元中Y=0?如果Y=0則1的個數(shù)是0否則,按位判斷移位指令SF

CFY01101010100100110001101010100100110001

附加段中,有一個首地址為LIST的未經(jīng)排序的字數(shù)組,數(shù)組的第一個字中,存放著數(shù)組的長度,首地址已經(jīng)存入DI寄存器中,AX中存放著一個數(shù)。要求編程序,在數(shù)組中查找該數(shù),如果找到刪除71820157911LISTAX=20DI6432105CX=7例:DEL_ULPROCNEARCLDPUSHDIMOVCX,ES:[DI];數(shù)組中元素個數(shù)送CXADDDI,2;指向第一個元素

REPNESCASW;串掃描AL-ES:[DI]JEDELETE;找到數(shù)據(jù),刪除之

POPDI;沒找到數(shù)據(jù),還原DI的值

JMPSHORTEXITCX表示還未檢查的元素的個數(shù)DI相匹配元素的下一個元素的地址DELETE:JCXZDEC_CNT;數(shù)組在最后一位NEXT_EL:MOVBX,ES:[DI]MOVES:[DI-2],BXADDDI,2LOOPNEXT_EL;循環(huán)次數(shù)CXDEC_CNT:POPDI;修改數(shù)據(jù)個數(shù)DECWORDPTRES:[DI]EXIT:RETDEL_ULENDP71820157911LISTAX=20DI6432105CX=77181515791171815779117181579911718157911116123910171921HEAD61239101719212161239101719192161239101717192161239101017192161236910171921NSIEND例:在已排序的數(shù)組的適當位置插入數(shù)據(jù)MOVAX,6MOVARRAY_HEAD-2,FFFFH;X單元存入-1MOVSI,0COMPARE:CMPARRAY_END[SI],AXJLEINSERTMOVBX,ARRAY_END[SI]MOVARRAY_END[SI+2],BX

SUBSI,2JMPCOMPAREINSERT:MOVARRAY_END[SI+2],AX

12369SISI+2SI-2=SI5.3.3多重循環(huán)程序設計【例】在以A為首址的字存儲區(qū)中存放有N個有符號數(shù),編寫其程序將它們按大到小的順序排列在A存儲區(qū)中 我們采用冒泡排序算法從第一個數(shù)開始依次對相鄰兩個數(shù)進行比較,如次序對,則不交換兩數(shù)位置;如次序不對,則使這兩個數(shù)交換位置??梢钥闯?,第一遍需比較(N-1)次,此時,最小的數(shù)已經(jīng)放到了最后;第二遍比較只需考慮剩下的(N-1)個數(shù),即只需比較(N-2)次;第三遍只需比較(N-3)次,……整個排序過程最多需(N-1)遍。數(shù) 10 8 16 90 32第一遍 10 8 16 90 3210 16 8903210 169083210 1690328

第二遍 16 90 32 10 8第三遍 90 32 16 10 8如下面的5個數(shù)即是采用冒泡排序比較的例子。DATA SEGMENTA DW3,-5,6,7,9,2,0,-8,-9,-10,20N=($-A)/2DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AX

MOV CX,NDEC CXLOOP1:MOV DI,CX;保存外循環(huán)次數(shù)

MOV BX,0;?內(nèi)循環(huán)次數(shù)LOOP2:MOV AX,A[BX]CMP AX,A[BX+2]JGE CONTINUEXCHGAX,A[BX+2]MOV A[BX],AX108CONTINU:ADD BX,2

DEC CX; JNELOOP2;LOOPLOOP2 MOV CX,DI LOOP LOOP1 MOV AH,4CH INT 21HCODE ENDS END START

程序運行后,A中的內(nèi)容如下:

20,9,7,6,3,2,0,-5,-8,-9,-10

若要對N個無符號數(shù)按由大到小的順序排列,只需將指令“JGE”改為“JAE”即可。5.4分支程序設計5.4.1用條件轉移指令實現(xiàn)程序分支5.4.2用跳轉表實現(xiàn)多路分支5.4.1用條件轉移指令實現(xiàn)程序分支編寫計算下面函數(shù)值的程序:

1 X>0Y=0 X=0-1 X<0設輸入數(shù)據(jù)為X、輸出數(shù)據(jù)Y,且皆為字節(jié)變量。程序如下:DATA SEGMENTX DB-10Y DB?DATA ENDSCODE SEGMENT ASSUMEDS:DATA,CS:CODESTART: MOV AX,DATAMOV DS,AX CMP X,0 ;與0進行比較

JGE A1 ;X≥0轉A1

MOV Y,-1 ;X<0時,-1→Y JMP EXITA1:JG A2 ;X>0轉A2 MOV Y,0 ;X=0時,0→Y JMP EXITA2:MOV Y,1 ;X>0,1→YEXIT:MOV AH,4CH INT 21HCODEENDS END START折半查找附加段中,有一個按從小到大排序的無符號數(shù)數(shù)組,首地址存放在DI寄存器中,數(shù)組中的第一個單元存放數(shù)組長度。在AX中有一個無符號數(shù),要求在數(shù)組中查找AX,如果找到,使CF=0,并在SI中給出該元素在數(shù)組中的偏移地址,如未找到,則使CF=1小大MIDMID+1MID-1LOWHIGHLOW>HIGHLOW,HIGH初始化CF=0

查找不成功,YCF=0退出N計算中間元素下標MID=[LOW+HIGH]/2AX=R[MID]=成功LOW=MID+1HIGH=MID-1><CMPAX,ES:[DI+2];與最小數(shù)比較大小JACHK_LAST;大于最小數(shù)LEASI,ES:[DI+2];JEEXIT;等于最小數(shù),查找成功STC;小于最小數(shù),查找失敗JMPEXITCHK_LAST:MOVSI,ES:[DI];與最大數(shù)比較

SHLSI,1ADDSI,DI;DI+SI*2CMPAX,ES:[SI]JBSEARCH;大于最小數(shù),小于最大數(shù)JEEXIT;等于最大數(shù),查找成功STC;大于最大數(shù),查找失敗JMPEXITSEARCH:MOVLOW_IDX,1;初始化LOW_IDXMOVBX,ES:[DI]MOVHIGH_IDX,BXMOVBX,DIMID:MOVCX,LOW_IDXMOVDX,HIGH_IDXCMPCX,DX;LOWHIGH比較JANO_MATCHADDCX,DXSHRCX,1;(LOW+HIGH)/2MOVSI,CX;SI存放中間數(shù)的下標MIDSHLSI,1;SI*2中間元素相對首地址位移量COMPARE:CMPAX,ES:[BX+SI]JEEXIT;等于中間數(shù)查找成功

JAHIGHER;大于中間數(shù)DECCX;小于中間數(shù)MOVHIGH_IDX,CX;MID-1=HIGHJMPMIDHIGHER:INCCX;MID+1=LOWMOVLOW_IDX,CXJMPMIDNO_MATCH:STCEXIT:POPDSRET5.4.2用跳轉表實現(xiàn)多路分支【例】設某程序有8路分支,試根據(jù)給定的N值(1~8),將程序的執(zhí)行轉移到其中的一路分支。

DATA SEGMENTTAB DWP1,P2,P3,P4,P5,P6,P7,P8N DB5DATA ENDSCODE SEGMENT ASSUMEDS:DATA,CS:CODEMAINPROCFARSTART: MOVAX,DATAMOVDS,AX ┆MOVAL,N;AL=5DEL ALADD AL,AL;P5在TAB的位移量MOVBL,AL;AL=4*2MOVBH,0;JMPTAB[BX];寄存器相對尋址P1的EAP2的EAP3的EAP4的EAP5的EAP6的EAP7的EAP8的EATAB一個字P1: …… ┆ JMP EXITP2: …… ┆ JMP EXITP2: …… ┆ JMP EXITP3: …… ┆

JMP EXIT ┆P8: …… ┆EXIT: MOV AH,4CH INT 21HMAINENDPCODE ENDS END START

上述程序中的無條件轉移指令的轉移地址采用的是變址尋址。同理,轉移地址也可以用寄存器間接尋址或基址加變址尋址MOVBX,OFFSETTABADDBX,(5-1)*2JMP[BX]寄存器間接尋址MOVBX,OFFSETTABMOVSI,(5-1)*2JMP[BX][SI]基址變址尋址DOS功能調用DOS為用戶提供的常用的功能子程序調用方式根據(jù)要求給出參數(shù)把子功能號給AH使用INT21H常用功能調用1字符輸入,2字符顯示,9字符串顯示

A接收字符串MOVAH,20HCLDMOVCX,132LEADI,PRINT_LLINEREPSTOSBMOVAH,’—’CLDMOVCX,9LEADI,STUDENT_ADDRREPNESCASBMOVAH,’—’STDMOVCX,9LEADI,STUDENT_ADDRADDDI,8REPNZSCASBMOVAH,’*’CLDLEADI,STUDENT_NAMEMOVCX,30REPECMPSBJZYJMPEXIT

Y:MOVAH,20HSTDMOVCX,30REPSTOSBEXIT:RETLEASI,STUDENT_NAMELEADI,PRINT_LINEMOVCX,30CLDREPMOVSBMOVSI,OFFSETSTUDENT_ADDRADDSI,8LEADI,PRINT_LINE+131MOVCX,9REPMOVSB5.5子程序設計5.5.1子程序的概念5.5.2子程序的定義5.5.3子程序設計方法5.5.5子程序應用舉例5.5.5子程序的嵌套與遞歸調用5.5.1子程序的概念

在程序設計中,我們會發(fā)現(xiàn)一些多次無規(guī)律重復的程序段或語句序列。解決此類問題一個行之有效的方法就是將它們設計成可供反復調用的獨立的子程序結構,以便在需要時調用。在匯編語言中,子程序又稱過程。 調用子程序的程序稱為主調程序或主程序。5.5.2子程序的定義子程序的定義是由過程定義偽指令PROC和ENDP來完成的。其格式如下:過程名PROCNEAR/FAR

┆過程名ENDP其中PROC表示過程定義開始,ENDP表示過程定義結束。過程名是過程入口地址的符號表示。一般過程名同標號一樣,具有三種屬性,即段屬性、偏移地址屬性以及類型屬性。用戶對過程屬性的確定原則1.調用程序和過程在用一個代碼段中,則使用NEAR屬性2.調用程序和過程不在同一代碼段中,則使用FAR屬性調用程序和過程在同一代碼段CODESEGMENTMAINPROCFARSTART::CALLSUBR1:RETMAINENDPSUBR1PROCNEAR:RETSUBR1ENDPCODEENDSENDSTART同一個代碼段的另一種格式MAINPROCFAR:

CALLSUBR1:

RETSUBR1PROCNEAR:RETSUBR1ENDPMAINENDP調用程序和子程序不在同一個代碼段內(nèi)CODE1SEGMENT:SUB1PROCFAR:RETSUB1ENDPCODE1ENDSCODE2SEGMENTsub2procfar:

CALLSUB1:sub2endpCODE2ENDS子程序的調用和返回CALL指令段內(nèi)直接近調用CALLPROC1;子程序名段內(nèi)間接近調用CALLDST;

段間直接遠調用CALLPROC2;子程序名段間間接遠調用CALLDST;作用:從主程序轉向子程序并保存返回地址,即call指令下面一條指令直接給出子程序名操作:PUSH(IP);CALL指令的下一條指令

IP←IP+位移量;即子程序的偏移地址DST可以使用寄存器尋址或存儲器尋址操作:PUSH(IP);CALL指令的下一條指令

IP←(EA);根據(jù)尋址方式確定一個存儲單元,取出里面的內(nèi)容CALLWORDPTR[BX]直接給出子程序的名稱;不在同一個代碼段操作:PUSH(CS);CALL指令的下一條指令

PUSH(IP)IP←子程序的偏移地址

CS←子程序的段地址DST可以是任何一種存儲器尋址方式操作:PUSH(CS)PUSH(IP)CALLDWORD[BX]IP←(EA)CS←(EA+2)返回指令RET指令段內(nèi)近返回RET操作:POPIP段內(nèi)帶立即數(shù)近返回RETEXP段間遠返回RET操作:POPCS,POPIP段間帶立即數(shù)遠返回RETEXP作用:返回主程序,繼續(xù)執(zhí)行call指令下面的指令EXP:存入棧的數(shù)據(jù)個數(shù)操作:POPIPSP←SP+EXP*2操作:POPCSPOPIPSP←SP+EXP*2注意:使用子程序時,一定要注意堆棧段中的內(nèi)容,否則,就不能夠正確地返回主程序。一定要保持進棧出棧的次數(shù)一致5.5.3子程序設計方法1.信息的保護與恢復2.主程序與子程序參數(shù)傳遞方式1.信息的保護與恢復例如:若子程序PROG中改變了寄存器AX,BX,CX,DX的值,則可采用如下方法保護和恢復現(xiàn)場。PROG PROCNEAR PUSH AX PUSH BX PUSH CX ;保護現(xiàn)場

PUSH DX ┆ ┆POP DX POP CX POP BX ;恢復現(xiàn)場

POP AX RET ;返回斷點處PROC ENDP假如POP指令和push指令不匹配會怎樣?(DX)(CX)(BX)(AX)(IP)CALL指令執(zhí)行的進棧信息保存Ret指令出棧IP出棧POP DX POP CX POP BX

POP AXRet指令出棧2.主程序與子程序參數(shù)傳遞方式(1)通過寄存器傳參(2)約定單元法,通過變量(同段)(3)通過地址表傳參數(shù)(4)通過堆棧傳參數(shù)5.5.5子程序應用舉例通過寄存器傳參數(shù)例P199十進制到十六進制數(shù)轉換程序。程序要求從鍵盤取得一個十進制數(shù),然后把該數(shù)以十六進制在屏幕上顯示從鍵盤接收十進制數(shù),并且轉換成二進制數(shù)BX顯示回車換行二進制轉換成16進制并顯示BX中的數(shù)DOS功能調用01號子功能,接收字符,-30H或-37H,轉成二進制保存在BX中DOS功能調用02號子功能,顯示兩個特殊的字符,0D0A四位一組,變成十六進制,02號功能,+30H或+37DECIHEXSEGMENTASSUMECS:DECIHEXMAINPROCFAR

REPEAT:CALLDECIBINCALLCRLFCALLBINIHEXCALLCRLF

JMPREPEATMAINENDP十進制轉換二進制:除2法或者

(((0×A+D1)×A+D2)×A+D3)×10+D4DECIBINPROCNEARMOVBX,0NEWCHAR:MOVAH,01INT21H;AL存放ASCII碼30H~39H

SUBAL,30H;JLEXITCMPAL,9DJGEXIT;>9表示不合法輸入

CBW;AL擴展到AXXCHGAX,BX;AX=0BX=MMOVCX,10MULCX;XCHGAX,BX;BX=0AX=MADDBX,AX;BX=0+MJMPNEWCHAREXIT:RETDECIBINENDP十進制數(shù):1234=(((0×10+1)×10+2)×10+3)×10+4十六進制:=(((0×A+1)×A+2)×A+3)×A+4=((A+2)×A+3)×A+4=(C×A+3)×A+4=7B×A+4=04D2實際是利用計算機內(nèi)部按16進制計算的結果。(((0×A+D1)×A+D2)×A+D3)×A+D4CRLFPROCNEARMOVDL,0DHMOVAH,02HINT21H;輸出回車符

MOVDL,0AHMOVAH,02HINT21H;輸出換行符

RETCRLFENDP

回車換行子程序BINIHEXPROCNEARMOVCH,4ROTATE:MOVCL,4ROLBX,4MOVAL,BLANDAL,0FHADDAL,30HCMPAL,3AHJLPRINTITADDAL,07HPRINTIT:MOVDL,ALMOVAH,02HINT21HDECCHJNZROTATERETBINIHEXENDP2.同一個代碼段中可以通過變量傳參DATASEGMENTARYDW100DUP(?)COUNTDW100SUMDW?DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASATART:PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXCALLNEARPTRPROADD

:;prntsumRETMAINENDPPROADDPROCNEARPUSHAXPUSHCXPUSHSILEASI,ARYMOVCX,COUNTXORAX,AXNEXT:ADDAX,[SI]ADDSI,2LOOPNEXTMOVSUM,AXPOPSIPOPCXPOPAXRETPROADDENDPCODEENDSENDSTART5.7高級匯編語言技術5.7.1宏指令5.7.2宏指令的使用過程5.7.3宏操作符5.7.4局部符號偽指令LOCAL5.7.5宏庫的使用5.7.6重復匯編5.7.7條件匯編5.7.1宏指令

在匯編語言程序設計過程中,可以將具有一定功能,需多次重復使用,且比較短的程序段定義成一條宏指令。 使用宏指令語句可以減少程序書寫錯誤,縮短源程序長度,使源程序編寫像高級語言一樣清晰、簡潔。特別是使用宏庫后,可以提高編程效率。5.7.2宏指令的使用過程1.宏定義2.宏調用3.宏擴展1.宏定義(1)帶參宏定義宏指令名MACRO

形參1,形參2,……

........宏體

ENDM(2)無參宏定義宏指令名MACRO.............宏體ENDM注:宏指令名即宏的名稱,第一個字符必須是字母,其后可以是字母、數(shù)字、下劃線例子:定義一個宏,完成輸出緩沖區(qū)字符串的功能print

MACRO

bufoffsetleadx,bufoffsetmovah,09int21h

ENDM無參數(shù)宏INITSR

MACROMOVAX,DATA1MOVDS,AXMOVAX,DATA2MOVES,AXENDM2.宏調用格式:宏指令名[實參1,實參2,……]例:對上面的宏定義的三種調用形式為: ┆PRINT BUF1 ┆;宏必須先定義再使用,通常

;將宏寫在所有代碼之前PRINT BUF2 ┆PRINT BUF3 ┆3.宏擴展+LEADX,BUF1+MOVAH,9+INT 21H ┆+LEADX,BUF2+MOVAH,9+INT21H┆+LEA DX,BUF3+MOV AH,9+INT 21H例如:上面三次宏調用,其展開的形式為:在對源程序匯編時,匯編程序對每個宏調用進行展開,列表文件會在宏展開指令前用“+”號指示。在宏展開時,用實際參數(shù)取代形式參數(shù)。不要求形參實參個數(shù)相等。實參多,則多余實參不予考慮;若形參多,則多余形參做“空”處理。實參取代形參時,必須符合匯編指令格式,否則會提示錯誤。宏的特點宏調用時可以用實參代替形參,避免了子程序引傳遞參數(shù)帶來的麻煩。參數(shù)可以是常數(shù)、寄存器、存儲單元等,甚至可以是指令的操作碼或操作碼的一部分工作方式與子程序不同:子程序占有自身大小的空間,執(zhí)行時由主程序調用;宏則在匯編期間展開,調用一次展開一次,因此所占空間也隨著調用次數(shù)而增大總結子程序與宏的異同點5.7.3宏定義中的參數(shù)1.可以無參數(shù)例P2492.可以是操作碼、操作數(shù)等例:在程序中定義大小及初值不同的堆棧段。宏定義如下:DSTACK MACROA STACK SEGMENTSTACK DB Adup(?)STACK ENDS ENDM宏定義:FOOMACROP1,P2,P3MOVAX,P1P2P3ENDM宏調用:FOObx,mul,bx;FOObx,add,4宏展開:movax,bxmulbxmovax,bxadd4FOOBL3.參數(shù)可以是操作碼或操作數(shù)的一部分,必須在宏定義體中用&作為分隔符&作為形參前綴,把其前后兩個符號合并形成一個符號,這個符號可以是操作碼操作數(shù)或是一個字符串FOMACROCON,P1J&CONSTR&P1ENDMMSGMACROLAB,NUM,XYZLAB&NUMDB’HELLO,MR&XYZ’ENDMFOE,3展開:JESTR3MSGBUF,1,RIGHT展開:BUF1DB“HELLOMRRIGHT”4.%操作符匯編程序將%后面的表達式轉換成當前基數(shù)下的數(shù)。宏調用時使用msgmacrocount,stringmsg&countdbstringendmerrmsgmacrotextcntr=cntr+1;程序中定義的常量初值msg%cntr,text;在一個宏定義體中調 ;用另一個已定義的宏endmDATA1 MACRO A,B,C,D DW A,B,C DB DDUP(0)

ENDM如果宏調用為:X=10Y=20DATA1 %X+2,5,%X+Y,%Y-5DATA1 X+2,5,X+Y,Y-5則相應的宏擴展為:+ DW 12,5,30+ DB 15DUP(0)+ DW X+2,5,X+Y+ DB Y-5DUP(0)5.7.4局部符號偽指令LOCAL當宏中使用了標號,在多次宏調用后就會出現(xiàn)多個重復標號,這是不允許的。Local可以解決此問題。格式:Local標號列表;宏定義中出現(xiàn)的標號注:必須是宏定義體的第一句。SUMMACRO X,Y

LOCAL LMOV CX,XMOVBX,YMOV AX,0L:

ADD AX,BXINC BXLOOP LENDM

兩次調用宏指令如下: ┆SUM 100,1 ┆SUM 50,1 ┆則宏擴展形式為: ┆MOV CX,100MOV BX,1MOV AX,0??0000: ADD AX,BX INC BX LOOP??0000 ┆ MOV CX,50 MOV BX,10 MOV AX,0??0001: ADD AX,BX INC BX LOOP??0001 ┆5.7.5宏庫的使用引入宏庫的語句格式:INCLUDE庫文件名;includemymacro.lib宏庫文件的建立:將包含宏的文件存成.lib類型的文件即可。假設已建立一名為MACRO.LIB的宏庫,其內(nèi)容如下:INPUT MACRO A LEA DX,A MOV AH,10 ;10號系統(tǒng)功能調用

INT 21H ENDMPRINT MACRO A LEA DX,A MOV AH,9 ;9號系統(tǒng)功能調用

INT 21H ENDMRETURN MACRO MOV AH,2 MOV DL,0AH INT 21H MOV DL,0DH ;回車換行

INT 21H ENDMOUT2 MACRO A MOV DL,A MOV AH,2 ;2號系統(tǒng)功能調用

INT 21H ENDMSTACK0 MACRO ASTACK SEGMENT STACK DB ASTACK ENDS ENDM現(xiàn)要從鍵盤輸入一串字符到系統(tǒng)緩

溫馨提示

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

評論

0/150

提交評論