子程序結(jié)構(gòu)課件_第1頁
子程序結(jié)構(gòu)課件_第2頁
子程序結(jié)構(gòu)課件_第3頁
子程序結(jié)構(gòu)課件_第4頁
子程序結(jié)構(gòu)課件_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第六章子程序結(jié)構(gòu)§6.1子程序的設(shè)計(jì)方法§6.2嵌套與遞歸子程序§6.3子程序舉例§6.4DOS系統(tǒng)功能調(diào)用第六章子程序結(jié)構(gòu)§6.1子程序的設(shè)計(jì)方法§6.1子程序的設(shè)計(jì)方法一、子程序指令二、子程序的調(diào)用與返回三、現(xiàn)場(chǎng)的保護(hù)與恢復(fù)四、子程序參數(shù)的傳遞§6.1子程序的設(shè)計(jì)方法一、子程序指令一、子程序指令子程序是完成特定功能的一段程序當(dāng)主程序(調(diào)用程序)需要執(zhí)行這個(gè)功能時(shí),采用CALL調(diào)用指令轉(zhuǎn)移到該子程序的起始處執(zhí)行當(dāng)運(yùn)行完子程序功能后,采用RET返回指令回到主程序繼續(xù)執(zhí)行一、子程序指令子程序是完成特定功能的一段程序一、子程序指令—調(diào)用指令CALL指令分成4種類型(類似JMP)CALLlabel ;段內(nèi)調(diào)用、直接尋址CALLr16/m16 ;段內(nèi)調(diào)用、間接尋址CALLfarptrlabel ;段間調(diào)用、直接尋址CALLfarptrmem ;段間調(diào)用、間接尋址CALL指令需要保存返回地址:段內(nèi)調(diào)用——偏移地址IP入棧SP←SP-2,SS:[SP]←IP段間調(diào)用——偏移地址IP和段地址CS入棧SP←SP-2,SS:[SP]←CSSP←SP-2,SS:[SP]←IP一、子程序指令—調(diào)用指令CALL指令分成4種類型(類似JMP一、子程序指令—返回指令根據(jù)段內(nèi)和段間、有無參數(shù),分成4種類型RET ;無參數(shù)段內(nèi)返回RETi16 ;有參數(shù)段內(nèi)返回RET ;無參數(shù)段間返回RETi16 ;有參數(shù)段間返回需要彈出CALL指令壓入堆棧的返回地址段內(nèi)返回——偏移地址IP出棧IP←SS:[SP],SP←SP+2段間返回——偏移地址IP和段地址CS出棧IP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2一、子程序指令—返回指令根據(jù)段內(nèi)和段間、有無參數(shù),分成4種類一、子程序指令—返回指令RET的參數(shù) RETi16 ;有參數(shù)返回RET指令可以帶有一個(gè)立即數(shù)i16,則堆棧指針SP將增加,即SP←SP+i16這個(gè)特點(diǎn)使得程序可以方便地廢除若干執(zhí)行CALL指令以前入棧的參數(shù)一、子程序指令—返回指令RET的參數(shù) RETi16 ;二、子程序的調(diào)用與返回CALLlabel主程序RET子程序回到CALL指令后的指令處

——返回地址二、子程序的調(diào)用與返回主程序子程序回到CALL指令后的指令處二、子程序的調(diào)用與返回

—書寫形式(同一代碼段內(nèi))二、子程序的調(diào)用與返回

—書寫形式(同一代碼段內(nèi))二、子程序的調(diào)用與返回

—書寫形式(不同代碼段)二、子程序的調(diào)用與返回

—書寫形式(不同代碼段)三、現(xiàn)場(chǎng)的保護(hù)與恢復(fù)現(xiàn)場(chǎng):主程序轉(zhuǎn)向子程序之前,其所使用的一些資源的狀態(tài)(如標(biāo)志位、R/M等)子程序與主程序分別編制,通常會(huì)導(dǎo)致使用的資源發(fā)生沖突而影響主程序在調(diào)用子程序之后的正確執(zhí)行方法:利用堆棧在主程序中進(jìn)行在子程序中進(jìn)行三、現(xiàn)場(chǎng)的保護(hù)與恢復(fù)現(xiàn)場(chǎng):主程序轉(zhuǎn)向子程序之前,其所使用的一三、現(xiàn)場(chǎng)的保護(hù)與恢復(fù)

—在主程序中進(jìn)行……PUSHBXPUSHAXCALLSUB1POPAXPOPBX……注意:

進(jìn)棧/出棧的順序保護(hù)與恢復(fù)的對(duì)象: 主程序用到的存有數(shù)據(jù)、中間結(jié)果且在CALL指令后還要用到的R/M三、現(xiàn)場(chǎng)的保護(hù)與恢復(fù)

—在主程序中進(jìn)行……注意:保三、現(xiàn)場(chǎng)的保護(hù)與恢復(fù)

—在子程序中進(jìn)行SUB1 PROC PUSHBX PUSHAX …… POPAX POPBX RETSUB1ENDP注意:

進(jìn)棧/出棧的順序保護(hù)與恢復(fù)的對(duì)象: 子程序用到的R/M三、現(xiàn)場(chǎng)的保護(hù)與恢復(fù)

—在子程序中進(jìn)行SUB1 四、子程序參數(shù)的傳遞入口參數(shù)(輸入?yún)?shù)):主程序提供給子程序出口參數(shù)(輸出參數(shù)):子程序返回給主程序參數(shù)的形式:①數(shù)據(jù)本身(傳值)②數(shù)據(jù)的地址(傳址)傳遞的方法:①寄存器②變量③堆棧四、子程序參數(shù)的傳遞入口參數(shù)(輸入?yún)?shù)):主程序提供給子程序例:將兩個(gè)給定的二進(jìn)制數(shù)轉(zhuǎn)換成為二進(jìn)制數(shù)的ASCII碼形式并加以顯示對(duì)兩個(gè)數(shù)進(jìn)行轉(zhuǎn)換、顯示的工作是相同的,沒有必要重復(fù)編寫,以子程序的形式來完成顯示子程序需被告知:被顯示內(nèi)容的起始位置被顯示內(nèi)容的長(zhǎng)度被轉(zhuǎn)換的數(shù)及其長(zhǎng)度存放結(jié)果的起始位置轉(zhuǎn)換子程序需被告知:例:將兩個(gè)給定的二進(jìn)制數(shù)轉(zhuǎn)換成為二進(jìn)制數(shù)的ASCII碼形式例:將兩個(gè)給定的二進(jìn)制數(shù)轉(zhuǎn)換成為二進(jìn)制數(shù)的ASCII碼形式并加以顯示(6-1-1.asm)方法一:用寄存器傳遞參數(shù)顯示子程序:DI:被顯示內(nèi)容的起始位置指針CX:被顯示內(nèi)容的長(zhǎng)度BX:被轉(zhuǎn)換的數(shù)CX:被轉(zhuǎn)換數(shù)的長(zhǎng)度DI:存放結(jié)果的起始位置指針轉(zhuǎn)換子程序:例:將兩個(gè)給定的二進(jìn)制數(shù)轉(zhuǎn)換成為二進(jìn)制數(shù)的ASCII碼形式并

;轉(zhuǎn)換子程序BINASC PROCREP1: ROLBX,1 MOVDL,BL ANDDL,01H ADDDL,30H ;屏蔽除最低位外的其他位

MOV[DI],DL INCDI LOOPREP1 RETBINASC ENDPBLBHDLDI ;轉(zhuǎn)換子程序BLBHDLDI;顯示子程序DISP PROCREP2: MOVAH,2 MOVDL,[DI] INT21H INCDI LOOPREP2 MOVDL,0AH ;設(shè)置顯示后的光標(biāo)位置

MOVAH,2 INT21H MOVDL,0DH MOVAH,2 INT21H RETDISP ENDP;顯示子程序DSEG SEGMENTPARA'DATA' BIN1 DB35HBIN2 DW0AB48HASCBUF DB20HDUP(?)DSEG ENDSCSEG SEGMENTPARA'CODE' ASSUMECS:CSEG,DS:DSEG,SS:SSEGMAIN PROCFAR MOVAX,DSEG MOVDS,AX

MOVBH,BIN1 MOVCX,8 LEADI,ASCBUF PUSHDI PUSHCX CALLBINASC POPCX POPDI PUSHDI CALLDISP POPDI ADDDI,10H MOVBX,BIN2 MOVCX,16 PUSHDI PUSHCX CALLBINASC POPCX POPDI CALLDISP

MOVAX,4C00H INT21H;轉(zhuǎn)換子程序BINASC PROCREP1: ROLBX,1 MOVDL,BL ANDDL,01H ADDDL,30H ;屏蔽除最低位外的其他位

MOV[DI],DL INCDI LOOPREP1 RETBINASC ENDP;顯示子程序DISP PROCREP2: MOVAH,2 MOVDL,[DI] INT21H INCDI LOOPREP2 MOVDL,0AH ;設(shè)置顯示后的光標(biāo)位置

MOVAH,2 INT21H MOVDL,0DH MOVAH,2 INT21H RETDISP ENDPMAIN ENDP CSEG ENDS ENDMAIN ;setentrypointDSEG SEGMENTPARA'DATA' ;轉(zhuǎn)換子例:將兩個(gè)給定的二進(jìn)制數(shù)轉(zhuǎn)換成為二進(jìn)制數(shù)的ASCII碼形式并加以顯示(6-1-2.asm)方法二:用堆棧傳遞參數(shù)例:將兩個(gè)給定的二進(jìn)制數(shù)轉(zhuǎn)換成為二進(jìn)制數(shù)的ASCII碼形式并方法二之主程序段 MOVAH,BIN1 ;要轉(zhuǎn)換的數(shù)進(jìn)棧 PUSHAX LEADI,ASCBUF ;地址指針 PUSHDI MOVAX,8 ;長(zhǎng)度 PUSHAX CALLBINASC ;調(diào)用轉(zhuǎn)換子程序

MOVAX,BIN2 PUSHAX ADDDI,10H PUSHDI MOVAX,16 PUSHAX CALLBINASC方法二之主程序段;轉(zhuǎn)換并顯示子程序BINASC PROC PUSHDI PUSHAX PUSHBX PUSHCX PUSHDX PUSHBP MOVBP,SP MOVBX,[BP+18] MOVDI,[BP+16] MOVCX,[BP+14]REP1: ROLBX,1 MOVDL,BL ANDDL,01H;屏蔽除最低位外的其他位 ADDDL,30H

MOV[DI],DL MOVAH,6 INT21H INCDI LOOPREP1

MOVAH,6 MOVDL,0AH INT21H MOVAH,6 MOVDL,0DH INT21H

POPBP POPDX POPCX POPBX POPAX POPDI

RET6BINASC ENDP;轉(zhuǎn)換并顯示子程序 BP=SPBX地址IP長(zhǎng)度進(jìn)入子程序時(shí)的SPAXDIBIN1CXDXBPBP+14BP+16BP+18方法二之堆棧BP=SPBX地址IP長(zhǎng)度進(jìn)入子程序時(shí)的SPAXDIBIN1§6.2嵌套與遞歸子程序嵌套:子程序調(diào)用其他子程序,嵌套層數(shù)取決于堆棧的大小32K(基本不受限制)遞歸:子程序調(diào)用自己,該情況要合理設(shè)置出口參數(shù),否則會(huì)造成程序死鎖§6.2嵌套與遞歸子程序嵌套:子程序調(diào)用其他子程序,嵌套層§6.3子程序舉例§6.3子程序舉例例6.3十進(jìn)制到十六進(jìn)制數(shù)的轉(zhuǎn)換

(從鍵盤取得一個(gè)十進(jìn)制數(shù),然后把該數(shù)以十六進(jìn)制的形式在屏幕上顯示出來)例6.3十進(jìn)制到十六進(jìn)制數(shù)的轉(zhuǎn)換

(從鍵盤取得一個(gè)十進(jìn)制例6.3十進(jìn)制到十六進(jìn)制數(shù)的轉(zhuǎn)換(6-3-1.DOC)轉(zhuǎn)換方法:‘1234’((((0*10+1)*10)+2)*10+3)*10+4從最高位開始:累加和*10+本位的權(quán)值十六進(jìn)制數(shù)顯示的實(shí)現(xiàn)BHH4BHL4BLH4BLL44BHH4BHL4BLH4BLL4BHH4AL從最高位開始例6.3十進(jìn)制到十六進(jìn)制數(shù)的轉(zhuǎn)換(6-3-1.DOC)轉(zhuǎn);例6-3,十進(jìn)制到十六進(jìn)制數(shù)的轉(zhuǎn)換SSEG SEGMENTPARASTACK'STACK' DW100HDUP(0)SSEG ENDSDSEG SEGMENTPARA'DATA' DSEG ENDSCSEG SEGMENTPARA'CODE’ ASSUMECS:CSEG,DS:DSEG,SS:SSEGMAIN PROCFAR MOVAX,DSEG ;MAKENECCESSARYINITALIZALITION MOVDS,AXREPEAT: CALLDECIBIN CALLCRLF CALLBINIHEX CALLCRLF JMPREPEAT MOVAH,0AH INT21H

MOVAX,4C00H ;RETURNDOS INT21HMAIN ENDP ;例6-3,十進(jìn)制到十六進(jìn)制數(shù)的轉(zhuǎn)換;從鍵盤獲得十進(jìn)制數(shù)并將其轉(zhuǎn)換成十六進(jìn)制數(shù)置于BX中DECIBIN PROC MOVBX,0NEWCHAR: MOVAH,1 INT21H SUBAL,30H JLEXIT ;非十進(jìn)制數(shù)則退出

CMPAL,9 JGEXIT CBW XCHGAX,BX ;將原有的數(shù)*10后加新輸入的數(shù)

MOVCX,10 MULCX XCHGAX,BX ADDBX,AX JMPNEWCHAREXIT: RETDECIBIN ENDP;從鍵盤獲得十進(jìn)制數(shù)并將其轉(zhuǎn)換成十六進(jìn)制數(shù)置于BX中;將BX中的十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的ASCII碼顯示在屏幕上BINIHEX PROC MOVCH,4 ;共四位十六進(jìn)制數(shù)ROTATE: MOVCL,4 ROLBX,CL MOVAL,BL ;從最高位開始,將其移位至BX,AL的低4位

ANDAL,0FH ADDAL,30H CMPAL,3AH JLPRINTIT ADDAL,7 ;如為A-F的處理PRINTIT: MOVDL,AL MOVAH,2 INT21H DECCH JNZROTATE RETBINIHEX ENDPCRLF PROC MOVDL,0AH MOVAH,2 INT21H MOVDL,0DH MOVAH,2 INT21H RETCRLF ENDPCSEG ENDS ENDMAIN;SETENTRYPOINT;將BX中的十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的ASCII碼顯示在屏幕上C例6.8把以ASCII碼形式表示的十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)(6-8-2.asm,6-8-1.asm增強(qiáng)型編程)程序限制:轉(zhuǎn)換后的二進(jìn)制數(shù)不超過16位轉(zhuǎn)換方法:‘12345’5*1 =

5 5*01H =5H4*10 =40 4*0AH =28H3*100 =300 3*64H =12CH2*1000 =2000 2*3E8H =7D0H1*10000 =10000 1*2710H =2710H求和 =12345 求和 =3039H從最低位開始例6.8把以ASCII碼形式表示的十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)增強(qiáng)功能的過程定義偽操作格式:PROCNAME PROC[ATTRIBUTESFIELD][USESREGISTERLIST][,PARAMETERFIELD] ……PROCNAME ENDPATTRIBUTESFIELD: DISTANCE LANGUAGETYPE VISIBILITY PROLOGUE增強(qiáng)功能的過程定義偽操作格式:增強(qiáng)功能的過程定義偽操作增強(qiáng)功能的過程定義偽操作例6.8

.MODELSMALL .STACK64 .DATAASCVAL DB'12345'BINVAL DW? .CODEMAIN PROCFAR MOVAX,@DATA MOVDS,AX LEABX,ASCVAL PUSHBX LEABX,BINVAL PUSHBX CALLCONVASCBIN

MOVBX,BINVAL CALLBINIHEX

MOVAX,4C00H INT21HMAIN ENDP例6.8 .MODELSMALLCONVASCBIN PROCPASCALUSESAXBXCXSIDI,PAR1:WORD,PAR2:WORD LOCALASCLEN:WORD,MULFACT:WORD MOVBX,10 MOVSI,PAR1 MOVDI,PAR2 SUBDI,SI MOVASCLEN,DI MOVCX,DI ADDSI,CX DECSI MOVMULFACT,1 MOVDI,PAR2 MOVWORDPTR[DI],0 NEXT: MOVAL,[SI] ANDAX,000FH MULMULFACT ADD[DI],AX MOVAX,MULFACT MULBX MOVMULFACT,AX DECSI LOOPNEXT RETCONVASCBIN ENDPCONVASCBIN PROCPASCALUSESAX BINIHEX PROC MOVCH,4 ROTATE: MOVCL,4 ROLBX,CL MOVAL,BL ANDAL,0FH ADDAL,30H CMPAL,3AH JLPRINTIT ADDAL,7 PRINTIT: MOVDL,AL MOVAH,2 INT21H DECCH JNZROTATE RET BINIHEXENDP ENDMAIN ;SETENTRYPOINT BINIHEX PROC子程序結(jié)構(gòu)課件例:6.9十六進(jìn)制到十進(jìn)制數(shù)的轉(zhuǎn)換把從鍵盤輸入的0-FFFF的十六進(jìn)制正數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)并在屏幕上顯示出來Hexibin:鍵盤輸入十六進(jìn)制數(shù)其數(shù)值在BX中crlf:回車換行Binidec:十六進(jìn)制到十進(jìn)制轉(zhuǎn)換并顯示例:6.9十六進(jìn)制到十進(jìn)制數(shù)的轉(zhuǎn)換把從鍵盤輸入的0-FF例6.9DISP EQU2HKEY_IN EQU1HDOSCALLEQU21HSSEG SEGMENTPARASTACK'STACK' DW100HDUP(0)SSEG ENDSCSEG SEGMENTPARA'CODE' ASSUMECS:CSEG,SS:SSEGMAIN PROCFAR MOVCL,4 CALLHEXIBIN ;調(diào)用十六進(jìn)制數(shù)輸入子程序 CALLCRLF

CALLBINIDEC ;調(diào)用十六進(jìn)制到十進(jìn)制轉(zhuǎn)換子程序 CALLCRLF JMPMAIN MOVAX,4C00H INT21HMAIN ENDP 例6.9DISP EQU2H例6.9

;十六進(jìn)制輸入并轉(zhuǎn)換為十六進(jìn)制數(shù)值子程序,十六進(jìn)制數(shù)值在BX中 HEXIBIN PROC MOVBX,0NEWCHAR: MOVAH,KEY_IN INTDOSCALL SUBAL,30H JLEXIT ;非十六進(jìn)制數(shù)值輸入則結(jié)束輸入 CMPAL,10 JLADD_TO SUBAL,27H CMPAL,10H JGEEXIT ADD_TO: SHLBX,CL

;新輸入的數(shù)值(在AL的低四位上)加入到BX的低四位中 MOVAH,0 ADDBX,AX JMPNEWCHAR EXIT: RET HEXIBIN ENDP例6.9 ;十六進(jìn)制輸入并轉(zhuǎn)換為十六進(jìn)制數(shù)值子程序,十六進(jìn)制例6.9 ;十六進(jìn)制到十進(jìn)制轉(zhuǎn)換并顯示子程序 ;被除數(shù)是BX,除數(shù)分別是10000,1000,100,10,1,; ;商是十進(jìn)制;數(shù),余數(shù)作為下次的被除數(shù) BINIDEC PROC MOVCX,10000D CALLDEC_DIV MOVCX,1000D CALLDEC_DIV MOVCX,100D CALLDEC_DIV MOVCX,10D CALLDEC_DIV MOVCX,1 CALLDEC_DIV RET BINIDEC ENDP DEC_DIV PROC MOVAX,BX MOVDX,0 DIVCX MOVBX,DX MOVDL,AL ADDDL,30H MOVAH,DISP INTDOSCALL RET DEC_DIV ENDP例6.9 ;十六進(jìn)制到十進(jìn)制轉(zhuǎn)換并顯示子程序 DEC_DIV例6.9CRLF PROC MOVDL,0AH MOVAH,DISP INTDOSCALL MOVDL,0DH MOVAH,DISP INTDOSCALL RETCRLF ENDP

CSEG ENDS ENDMAIN例6.9CRLF PROC例6.10一個(gè)簡(jiǎn)單的信息檢索系統(tǒng)數(shù)據(jù)區(qū)里有10個(gè)不同的信息,編號(hào)為0-9,每個(gè)信息包括30個(gè)字符。編制程序從鍵盤接收0-9之間的編號(hào),然后在屏幕上顯示相應(yīng)編號(hào)的信息內(nèi)容。(6-10.asm,6-10.doc)例6.10一個(gè)簡(jiǎn)單的信息檢索系統(tǒng)數(shù)據(jù)區(qū)里有10個(gè)不同的信息SSEG SEGMENTPARASTACK'stack' DW100HDUP(0)SSEG ENDSDSEG SEGMENTPARA'Data' THIRTY DB?MESG0 DB'Thisismessage0-------------'MESG1 DB'Thisismessage1-------------'MESG2 DB'Thisismessage2-------------'MESG3 DB'Thisismessage3-------------'MESG4 DB'Thisismessage4-------------'MESG5 DB'Thisismessage5-------------'MESG6 DB'Thisismessage6-------------'MESG7 DB'Thisismessage7-------------'MESG8 DB'Thisismessage8-------------'MESG9 DB'Thisismessage9-------------'LEN EQUMESG1-MESG0ERRMSG DB'error!!!invilidparameter!!'DSEG ENDS例6.10:1/3SSEG SEGMENTPARASTACK'stacCSEG SEGMENTPARA'CODE' ASSUMECS:CSEG,DS:DSEG,SS:SSEGMAIN PROCFAR MOVAX,DSEG MOVDS,AX MOVTHIRTY,LENBEGIN: MOVAH,1 INT21H SUBAL,'0’ JCERROR CMPAL,9 JAERROR

PUSHAX MOVDL,0AH CALLDISPCHAR MOVDL,0DH CALLDISPCHAR POPAX

MOVBX,OFFSETMESG0 MULTHIRTY ADDBX,AX CALLDISP JMPBEGIN

ERROR: MOVBX,OFFSETERRMSG CALLDISP

MOVAX,4C00H INT21H例6.10:2/3CSEG SEGMENTPARA'CODE' 例6. DISP PROC MOVCX,30 DISP1: MOVDL,[BX] CALLDISPCHAR INCBX LOOPDISP1 MOVDL,0AH CALLDISPCHAR MOVDL,0DH CALLDISPCHAR RET DISP ENDPDISPCHAR PROC MOVAH,2 INT21H RETDISPCHAR ENDP

MAIN ENDP CSEG ENDS ENDMAIN ;SETENTRYPOINT例6.10:3/3 DISP PROC例6.10:3/3例6.11人名排序程序。從鍵盤鍵入最多30個(gè)人名,當(dāng)所有人名都進(jìn)入后,按字母上升的次序?qū)⑷嗣判?,并在屏幕上顯示已排序后的人名(6-11)例6.11人名排序程序。從鍵盤鍵入最多30個(gè)人名,當(dāng)所有人

b10read:輸入子程序(所占空間固定,但要將多出部分清為空格)D10stor:將本次輸入存儲(chǔ)到表中(DI中是在表中起始地址的指針,同時(shí)計(jì)存儲(chǔ)到表中的名字的個(gè)數(shù))g10sort:排序(冒泡排序)H10xch:交換表中相鄰項(xiàng)的順序K10disp:顯示已排序的名字表Q10clr:清屏Q20curs:設(shè)置光標(biāo)位置b10read:輸入子程序(所占空間固定,但要將多出部分清 DSEG SEGMENTPARA'DATA' NAMEPAR LABELBYTEMAXLEN DB21NAMELEN DB?NAMEFLD DB21DUP(?) CRLF DB13,10,'$'ENDADDR DW? MESG1 DB'NAME?','$'NAMECTR DB0NAMETAB DB30DUP(20DUP(''))NAMESAV DB20DUP(?),13,10,'$'SWAPPED DB0 DSEG ENDS CSEG SEGMENTPARA'CODE' ASSUMECS:CSEG,DS:DSEG MAIN PROCFAR MOVAX,DSEG MOVDS,AX MOVES,AX例6.11:1/6 DSEG SEGMENTPARA'DATA' 例6. CLD LEADI,NAMETAB ;表首址作為目的串的首址

CALLQ10CLR CALLQ20CURS A20LOOP: CALLB10READ ;調(diào)輸入子程序

CMPNAMELEN,0 JZA30 CALLD10STOR ;存儲(chǔ)

JMPA20LOOP A30: CALLQ10CLR CALLQ20CURS CMPNAMECTR,1 JBEA40 CALLG10SORT A40: CMPNAMECTR,0 JBEEXIT CALLK10DISP EXIT: MOVAX,4C00H INT21H MAIN ENDP例6.11:2/6 CLD例6.11:2/6

;名字輸入子程序B10READ PROC MOVAH,9 LEADX,MESG1 INT21H MOVAH,0AH LEADX,NAMEPAR INT21H MOVAH,9 LEADX,CRLF INT21H MOVBH,0 ;緩存區(qū)的空余部分填空格 MOVBL,NAMELEN

MOVCX,21 SUBCX,BX B20: MOVNAMEFLD[BX],20H INCBX LOOPB20 RETB10READ ENDP

;名字存儲(chǔ)子程序D10STOR PROC

;名字個(gè)數(shù)計(jì)數(shù)器加1 INCNAMECTR CLD LEASI,NAMEFLD MOVCX,10 REPMOVSW RETD10STOR ENDP例6.11:3/6 ;名字輸入子程序 ;名字存儲(chǔ)子程序例6.11:3;排序子程序G10SORT PROC SUBDI,40 MOVENDADDR,DI G20: MOVSWAPPED,0 ;交換標(biāo)志清0 LEASI,NAMETAB G30: MOVCX,20 MOVDI,SI ADDDI,20 MOVAX,DI MOVBX,SI REPECMPSB JBEG40 CALLH10XCH ;調(diào)用交換順序子程序 G40: MOVSI,AX CMPSI,ENDADDR JBEG30 CMPSWAPPED,0 JNZG20 RETG10SORT ENDP例6.11:4/6;排序子程序例6.11:4/6

;交換表的內(nèi)容 H10XCH PROC MOVCX,10 LEADI,NAMESAV MOVSI,BX REPMOVSW MOVCX,10 MOVDI,BX REPMOVSW

MOVCX,10 LEASI,NAMESAV REPMOVSW

MOVSWAPPED,1 RET H10XCH ENDP

;顯示已排序的名字表 K10DISP PROC LEASI,NAMETAB K20: LEADI,NAMESAV MOVCX,10 REPMOVSW MOVAH,9 LEADX,NAMESAV INT21H DECNAMECTR JNZK20 RET K10DISP ENDP例6.11:5/6 ;交換表的內(nèi)容 ;顯示已排序的名字表例6.11:5/6

;清屏子程序 Q10CLR PROC MOVAX,0600H MOVBH,61H SUBCX,CX MOVDX,184FH INT10H RET Q10CLR ENDP

;設(shè)置光標(biāo)位置子程序Q20CURS PROC MOVAH,2 SUBBH,BH SUBDX,DX INT10H RETQ20CURS ENDP CSEG ENDS ENDMAIN ;SETENTRYPOINT例6.11:6/6 ;清屏子程序例6.11:6/6§6.4DOS系統(tǒng)功能調(diào)用裸機(jī)ROM-BIOSDOS功能調(diào)用匯編語言程序§6.4DOS系統(tǒng)功能調(diào)用裸機(jī)ROM-BIOSDOS功能系統(tǒng)功能調(diào)用21H號(hào)中斷是DOS提供給用戶的用于調(diào)用系統(tǒng)功能的中斷,它有近百個(gè)功能供用戶選擇使用,主要包括設(shè)備管理、目錄管理和文件管理三個(gè)方面的功能ROM-BIOS也以中斷服務(wù)程序的形式,向程序員提供系統(tǒng)的基本輸入輸出程序匯編語言程序設(shè)計(jì)需要采用系統(tǒng)的各種功能程序充分利用操作系統(tǒng)提供的資源是程序設(shè)計(jì)的一個(gè)重要方面,需要掌握系統(tǒng)功能調(diào)用21H號(hào)中斷是DOS提供給用戶的用于調(diào)用系統(tǒng)功能功能調(diào)用的格式通常按照如下4個(gè)步驟進(jìn)行:在AH寄存器中設(shè)置系統(tǒng)功能調(diào)用號(hào)在指定寄存器中設(shè)置入口參數(shù)執(zhí)行指令I(lǐng)NT21H(或ROM-BIOS的中斷向量號(hào))

實(shí)現(xiàn)中斷服務(wù)程序的功能調(diào)用根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況功能調(diào)用的格式通常按照如下4個(gè)步驟進(jìn)行:字符輸出的功能調(diào)用DOS功能調(diào)用INT21H功能號(hào):AH=02H入口參數(shù):DL=字符的ASCII碼功能:在顯示器當(dāng)前光標(biāo)位置顯示給定的字符,光標(biāo)右移一個(gè)字符位置。如按Ctrl-Break或Ctrl-C則退出

;在當(dāng)前

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論