当前位置:文档之家› 西电微机原理大作业

西电微机原理大作业

汇编语言程序设计综合实验姓名:***学号:*********** 2016年12月25日题目功能及要求题目要求编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择:(1)按数字键“1”,完成将字符串中的小写字母变换成大写字母。

用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示:<原字符串>例如:abcdgyt0092<新字符串> ABCDGYT0092按任一键重做;按Esc键返回主菜单。

(2)按数字键“2”,完成在字符串中找最大值。

用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示:<原字符串> The maximum is <最大值>.按任一键重做;按Esc键返回主菜单。

(3)按数字键“3”,完成输入数据组的排序。

用户输入一组十进制数值(小于255),然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示:<原数值串><新数值串>按任一键重做;按Esc键返回主菜单。

(4)按数字键“4”,完成时间的显示。

首先提示用户对时,即改变系统的定时器HH:MM:SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时间:HH:MM:SS。

按任一键重新对时;按Esc键返回主菜单。

(5)按数字键“5”,结束程序的运行,返回操作系统。

程序功能及分析:程序主干:(1)主程序:通过调用屏幕初始化子程序、光标位置设定子程序、清屏子程序、菜单显示子程序、命令解析子程序完成显示器初始化,设置光标位置,打印程序菜单列表以及用户输入提示信息,并等待用户从键盘输入1~5进行菜单选择。

用户输入错误会被要求重输。

子程序跳转利用数据段转移地址查找表实现。

从子服务退回时,重新开始上述操作。

(2)子服务一:将字符串中的小写字母转换成大写字母,并输出到屏幕上。

先调用字符串输出子程序输出提示信息,后调用字符串输入子程序将用户从键盘输入的字符串读到BUFFER1存储区,后逐个判断字符是否为小写字母,如果是,则通过逻辑与进行转化,完成后,将结果放置到BUFFER2,后调用字符串输出子程序完成输出。

然后输出是否重做提示信息,调用无回显的字符读入子程序,并判断退出到主程序或重做。

(3)子服务二:找出一字符串中ASCII码最大的字符并输出。

先调用字符串输出子程序输出提示信息,后调用字符串输入子程序将用户从键盘输入的字符串读到BUFFER1存储区,将AL赋初值为第一个字符,后将AL作为暂时最大值与各字符逐个比较,若小于则将其值赋给AL,否则不赋。

后将结果与提示信息生成字符串,后调用字符串输出子程序完成输出。

然后输出是否重做提示信息,调用无回显的字符读入子程序,并判断退出到主程序或重做。

(4)子服务三:读入一组十进制数,递增排序,并原格式输出。

先调用字符串输出子程序输出提示信息,后调用字符串输入子程序将用户从键盘输入的字符串读到BUFFER1存储区,后调用十进制数转二进制数子程序,将转换数据放置到BUFFER2,再利用冒泡算法对BUFFER2内的数据递增排序,再调用二进制数转十进制数子程序将BUFFER2内的二进制数转化为十进制数,放置到BUFFER3存储区内,并调用字符串格式修正子程序将不必要的前导’0’删除,再调用字符串输出子程序将BUFFER3内的数据输出。

对于非法输入(数值超过255、非法字符)会给出错误提示信息。

然后输出是否重做提示信息,调用无回显的字符读入子程序,并判断退出到主程序或重做。

(5)子服务四:完成时间的显示、修改。

调用字符串输出子程序将是否更改时间提示信息输出,并调用无等待字符读入子程序等待用户输入。

然后通过DOS功能调用读出系统时间,后调用二进制转十进制数子程序,将系统时间显示到屏幕右上方。

如果用户确认修改时间,则调用字符串读入子程序将时间放置到BUFFER1,后调用十进制数转二进制数子程序并将结果放置到BUFFER2,后通过DOS功能调用将数据送给系统,如果出错则给出出错信息。

然后输出是否重做提示信息,调用无回显的字符读入子程序,并判断退出到主程序或重做。

(6)子服务五:退出到系统。

通过DOS功能调用完成。

辅助子程序:(1)命令解析子程序:完成对用户输入选择信息的检查,合法则安排服务跳转,否则要求用户重做。

(2)菜单显示子程序:调用字符串输出子程序将菜单输出到屏幕上。

(3)屏幕初始化子程序:通过BIOS功能调用将屏幕设置成80*25字符模式。

(4)光标位置设定:通过BIOS功能调用完成设定。

(5)字符串显示子程序:通过DOS功能调用完成。

(6)清屏子程序:通过重新设置屏幕显示模式到达清屏目的。

(7)字符串读入子程序:通过DOS功能调用完成字符串输入,数据放在BUFFER1。

(8)字符读入子程序:通过DOS功能调用完成。

(9)无等待的字符读子程序:通过DOS功能调用完成。

(10)无回显的字符读入子程序:通过DOS功能调用完成。

(11)字符串结束符添加子程序:在指定存储区的字符串的最后添加回车、换行、字符串结束符。

(12)字符输出子程序:通过DOS功能调用完成。

(13)十进制数转二进制数子程序:利用加权求和公式将读入的十进制数(ASCII码字符串表示的数字)转化成二进制数并放到BUFFER存储区,其中第一个字节变量值为数据个数。

具有非法字符判定、数值超过255等判断。

(14)二进制数转十进制数子程序:利用除10取余并逆序的算法将每一个二进制数转化为十进制数(ASCII字符串),将输出放置到BUFFER3存储区。

(15)字符串前导’0’删除子程序:将十进制数(ASCII码字符串)高位的前导’0’删除。

汇编源程序STACK SEGMENT'STACK'DW 4096 DUP('C')TOP LABEL WORDSTACK ENDSDATA SEGMENTTRANSFORM DB'1.TRANSFORM', 0DH,0AH,'$'MAX DB'2.MAX',0DH,0AH,'$'SORT DB'3.SORT',0DH,0AH,'$'TIME DB'4.TIME',0DH,0AH,'$'EXIT DB'5.EXIT',0DH,0AH,'$'WAITING DB'PLEASE INPUT NUM 1-5 TO SELECT SERVICE:',0DH,0AH,'$' TIP DB'PLEASE INPUT A STRING',0DH,0AH,'$'TIPNUM DB'PLEASE INPUT A GROUP OF DECIMAL',0DH,0AH,'$'ANYKEY DB'PRESS ANY KEY TO CONTINUE',0DH,0AH,'$'MAXIMUM DB'THE MAXIMUM IS:$ 'INPUT_TIME DB'PLEASE INPUT CURRENT TIME LIKEHH:MM:SS',0DH,0AH,'$'QUESTION DB'DO YOU WANT TO SET TIME(Y/N)',0DH,0AH,'$'INPUT_ERROR DB'ERROR OR INVALID INPUT',0DH,0AH,'$'SUCCESS DB'SET TIME SUCCEED',0DH,0AH,'$'STRING DW TRANSFORM,MAX,SORT,TIME,EXIT,WAITINGSERVICE DW TRANS,FIND_MAX,SORTING,SET_TIME,EXIT_TOSYSBUFFER1 DB 512 DUP('C') ;INPUT BUFFERBUFFER2 DB 512 DUP('C') ;PROCESS WORKSPACEBUFFER3 DB 512 DUP('C') ;OUTPUT BUFFERDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV ES,AXLEA AX,TOPMOV SP,AXCALL SCREEN_INITMAIN_AGAIN:CALL CLEAR_SCREENCALL DISPLAY_MENUCALL GET_CHARCALL ORDER_PARSEJMP MAIN_AGAINMOV AH,4CHINT 21HORDER_PARSE PROC NEAR ;RETURN AL=-1 IF ERROR ELSE INVOKE SERVICE PUSH AXPUSH BXAND AL,0FHCMP AL,1JB ERROR_OVERCMP AL,5JA ERROR_OVERLEA BX,SERVICEDEC ALSHL AL ,1XOR AH,AHADD BX,AXCALL CLEAR_SCREENCALL word ptr [BX]POP BXPOP AXJMP OVER_ORDERERROR_OVER :MOV AL,0FFHOVER_ORDER:RETORDER_PARSE ENDPDISPLAY_MENU PROC NEAR ;display menu including five items PUSH DXPUSH CXPUSH SIMOV DH,0BHMOV DL,14HMOV CX,06HLEA SI,STRINGNEXT_DIS:MOV BH,0CALL CURSOR_SETPUSH DXMOV DX,[SI]ADD SI,02HCALL STRING_DISPLAYPOP DXINC DHLOOP NEXT_DISPOP SIPOP CXPOP DXRETDISPLAY_MENU ENDPSCREEN_INIT PROC NEAR ;set screen mode 80*25 character PUSH AXMOV AH,0MOV AL,02HINT 10HPOP AXRETSCREEN_INIT ENDPCURSOR_SET PROC NEAR ;set cursor BH PAGE,DH ROW,DL COLUMN PUSH AXMOV AH,02HINT 10HPOP AXRETCURSOR_SET ENDPSTRING_DISPLAY PROC NEAR ;display string DX ADDRESS PUSH AXMOV AH,09HINT 21HPOP AXRETSTRING_DISPLAY ENDPCLEAR_SCREEN PROC NEAR ;clear screenPUSH AXMOV AX,3INT 10HPOP AXRETCLEAR_SCREEN ENDPGET_CHAR_DIR PROCPUSH DXMOV AH,06HMOV DL,0FFHINT 21HPOP DXRETGET_CHAR_DIR ENDPGET_CHAR_N PROC NEAR;AL<=INPUT CHAR,NO DISPLAY MOV AH,07HINT 21HRETGET_CHAR_N ENDPGET_CHAR PROC NEAR ;AL<=IMPUT CHAR PUSH DXMOV AH,01HINT 21HPUSH AXMOV DL,0DHMOV AH,02HINT 21HMOV DL,0AHINT 21HPOP AXPOP DXRETGET_CHAR ENDPGET_STRING PROC NEAR ;DS:DX<=STRINGPUSH AXPUSH DXPUSH BXPUSH SILEA DX,BUFFER1MOV BUFFER1,0FFHMOV AH,0AHINT 21HMOV BL,BUFFER1+1XOR BH,BHLEA SI,BUFFER1[BX+2] CALL STR_ENDPOP SIPOP BXPOP DXPOP AXRETGET_STRING ENDPTRANS PROC ;PUSH AXPUSH DXPUSH CXPUSH SIPUSH DILEA DX,TIPCALL STRING_DISPLAY AGAIN_TRANS:CALL GET_STRINGLEA SI,BUFFER1+2LEA DI,BUFFER2MOV CL,BUFFER1+1XOR CH,CHJCXZ OVER_TRANS NEXT_TRANS:MOV AL, BYTE PTR [SI]CMP AL,'a'JB NOPROCESSCMP AL,'z'JA NOPROCESSAND AL,0DFH NOPROCESS:MOV BYTE PTR [DI],ALINC SIINC DILOOP NEXT_TRANS OVER_TRANS:MOV SI,DICALL STR_ENDLEA DX,BUFFER1+2CALL STRING_DISPLAYLEA DX,BUFFER2CALL STRING_DISPLAYLEA DX,ANYKEYCALL STRING_DISPLAYCALL GET_CHAR_NCMP AL,1BHJZ EXIT_TRANSJMP AGAIN_TRANSEXIT_TRANS:POP DIPOP SIPOP CXPOP DXPOP AXRETTRANS ENDPSTR_END PROC ;INSERT END FLAG SI=ADDRESS PUSH SIMOV BYTE PTR [SI],0DHINC SIMOV BYTE PTR [SI],0AHINC SIMOV BYTE PTR [SI],'$'POP SIRETSTR_END ENDPFIND_MAX PROC;FIND MAXIMUM AMOUNT A STRING PUSH AXPUSH DXPUSH CXPUSH SILEA DX,TIPCALL STRING_DISPLAYMAX_AGAIN:CALL GET_STRINGLEA SI,BUFFER1+2MOV CL,BUFFER1+1XOR CH,CHMOV AL,[SI]JCXZ FIND_MAX_OVERFIND_MAX_NEXT:INC SICMP AL,[SI]JA MAX_NOPROCESSMOV AL,[SI]MAX_NOPROCESS:LOOP FIND_MAX_NEXTFIND_MAX_OVER:LEA DX,BUFFER1+2CALL STRING_DISPLAYLEA DX,MAXIMUMCALL STRING_DISPLAYMOV DL,ALCALL CHAR_DISPLAYMOV DL,0DHCALL CHAR_DISPLAYMOV DL,0AHCALL CHAR_DISPLAYLEA DX,ANYKEYCALL STRING_DISPLAYCALL GET_CHAR_NCMP AL,1BHJNZ MAX_AGAINPOP SIPOP CXPOP DXPOP AXRETFIND_MAX ENDPCHAR_DISPLAY PROC;DISPLAY A CHARACTER DLPUSH AXMOV AH,02HINT 21HPOP AXRETCHAR_DISPLAY ENDPDEC2HEX PROC ;10 TO 16 BUFFER1->BUFFER2,CNT->BUF2,NUM->BUF2+1 PUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DILEA SI,BUFFER1+2LEA DI,BUFFER2+1XOR CH,CHMOV CL,BUFFER1+1MOV AL,0MOV BL,0AHMOV BYTE PTR BUFFER2,0JCXZ DH_OVERDEC_NEXT:MOV BH,BYTE PTR [SI]CMP BH,' 'JZ NEXT_NUMCMP BH,'0'JB ERROR_OVERFLOWCMP BH,'9'JA ERROR_OVERFLOWCMP BH,':'JZ NEXT_NUMAND BH,0FHMUL BLJC ERROR_OVERFLOWADD AL,BHJC ERROR_OVERFLOWJMP NEXT_PRONEXT_NUM:MOV [DI],ALINC DIINC BYTE PTR BUFFER2XOR AX,AXNEXT_PRO:INC SILOOP DEC_NEXTMOV [DI],ALINC BYTE PTR BUFFER2JMP DH_OVERERROR_OVERFLOW:MOV BUFFER2,0DH_OVER:POP DIPOP SIPOP DXPOP CXPOP BXPOP AXRETDEC2HEX ENDPHEX2DEC PROC ;INPUT:BUFFER2,NUM,BUFFER2+1,START;; OUTPUT:BUFFER3,STRING,STACK :OR ,3OR2 PUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIMOV BP,SPADD BP,0EHLEA DI,BUFFER3LEA SI,BUFFER2+1MOV CL,BUFFER2XOR CH,CHMOV BL,0AHJCXZ HEX_OVERHEX2DEC_OUTTER:MOV AH,0MOV AL,[SI]PUSH CXPUSH DIMOV DL,[BP+1]XOR DH,DHADD DI,DXDEC DIMOV CL,[BP+1]HEX2DEC_INNER:DIV BLOR AH,30HMOV BYTE PTR [DI],AHDEC DIXOR AH,AHLOOP HEX2DEC_INNERINC SIPOP DIPOP CXADD DI,DXMOV AH,[BP]MOV BYTE PTR [DI],AHINC DILOOP HEX2DEC_OUTTERHEX_OVER:MOV SI,DICALL STR_ENDPOP DIPOP SIPOP DXPOP CXPOP BXPOP AXRET 2HEX2DEC ENDPSTR_NUM_ADJUST PROC;INPUT:BUFFER3,REMOVE INVALID ZERO PUSH AXPUSH BXPUSH SIPUSH DILEA SI,BUFFER3LEA DI,BUFFER3XOR AL,ALL1:MOV BL,[SI]CMP BL,0DHJZ ADJUST_OVERCMP BL,' 'JZ CHAR_NEXTCMP BL,'0'JZ CHECK_FLAGMOV AL,01HJMP TRANSFERCHECK_FLAG:CMP AL,0JZ ADJUST_NEXTTRANSFER:MOV [DI],BLINC DIJMP ADJUST_NEXTCHAR_NEXT:MOV BYTE PTR [DI],' 'INC DIXOR AL,ALADJUST_NEXT:INC SIJMP L1ADJUST_OVER:MOV SI,DICALL STR_ENDPOP DIPOP SIPOP BXPOP AXRETSTR_NUM_ADJUST ENDPSORTING PROC ;SORTPUSH AXPUSH CXPUSH DXPUSH DISORT_AGAIN:LEA DX,TIPNUMCALL STRING_DISPLAYCALL GET_STRINGCALL DEC2HEXXOR CH,CHMOV CL,BUFFER2JCXZ SORT_ERRORDEC CXJCXZ SORT_COMPLETE SORT_OUTTER:LEA DI,BUFFER2+1PUSH CXSORT_INNER:MOV AL,[DI]CMP AL,[DI+1]JBE SORT_NOPROCESSXCHG AL,[DI+1]MOV [DI],ALSORT_NOPROCESS:INC DILOOP SORT_INNERPOP CXLOOP SORT_OUTTER SORT_COMPLETE:MOV AH,03HMOV AL,' 'PUSH AXCALL HEX2DECCALL STR_NUM_ADJUSTLEA DX,BUFFER1+2CALL STRING_DISPLAYLEA DX,BUFFER3CALL STRING_DISPLAYSORT_TIP:LEA DX,ANYKEYCALL STRING_DISPLAYCALL GET_CHAR_NCMP AL,1BHJNZ SORT_AGAINJZ SORT_OVERSORT_ERROR:LEA DX,INPUT_ERRORCALL STRING_DISPLAYJMP SORT_TIPSORT_OVER:POP DIPOP DXPOP CXPOP AXRETSORTING ENDPSET_TIME PROC;TIME SET SERVICE PUSH AXPUSH CXPUSH DXSETTIME_AGAIN:CALL CLEAR_SCREENLEA DX,QUESTIONCALL STRING_DISPLAYREFRESH:MOV AH,2CHINT 21HMOV BUFFER2,3MOV BUFFER2+1,CHMOV BUFFER2+2,CLMOV BUFFER2+3,DHMOV AH,02HMOV AL,':'PUSH AXCALL HEX2DECMOV AH,02HMOV BH,0MOV DH,0MOV DL,60INT 10HMOV BUFFER3+8,' 'LEA DX,BUFFER3CALL STRING_DISPLAYCALL GET_CHAR_DIRJZ REFRESHCMP AL,'Y'JNZ NOSETLEA DX,INPUT_TIMECALL STRING_DISPLAYCALL GET_STRINGCALL DEC2HEXMOV AH,2DHMOV CH,BUFFER2+1MOV CL,BUFFER2+2MOV DH,BUFFER2+3MOV DL,0INT 21HCMP AL,0HJZ SET_TIME_SUCCLEA DX,INPUT_ERRORCALL STRING_DISPLAYJMP NOSETSET_TIME_SUCC:LEA DX,SUCCESSCALL STRING_DISPLAY NOSET:LEA DX,ANYKEYCALL STRING_DISPLAYCALL GET_CHAR_NCMP AL,1BHJNZ SETTIME_AGAINPOP DXPOP CXPOP AXRETSET_TIME ENDPEXIT_TOSYS PROC MOV AH,4CH INT 21HRETEXIT_TOSYS ENDP CODE ENDSEND START运行结果主程序界面子服务一:子服务二:子服务三:(注:第二次输入非法输入,给出错误提示信息)子服务四:精品文档。

相关主题