还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
微机系统与接口实验电子与信息学院电类联合班何俊实验二将码表示的十进制数转换ASCII为二进制数
1.将ASCII码表示的十进制数转换为二进制数DATA SEGMENTORG3500HNUM1DB5DUPOORG3510HNUM2DD5DUPODATA ENDSSTACK SEGMENT STACKSTACKDB100DUPOSTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,OFFSET NUM1MOV SI,AXMOV AX,OFFSET NUM2MOV DI,AXMOV CX,5MOV AX,0MOV BH,0CHANGE:MOVBLJSI]SUB BL,30HMOV DX,10MULDXADD AX,BX
2、接收用户输入的可显示字符串(以回车结束),程序将其中码值最大的字符显示1ASCII出来、接收用户输入若干无符号位数(以空格或者逗号为分隔符,以回车结束),程序将28其中最大的数显示出来用户按任一键,重做,按键,返回主菜单ESC按键完成排序(二选一)
3、接收用户输入的可显示字符串,以回车结束程序按码值大小由大到小排序并输1ASCII出显示、接收用户输入若干个有符号位数(以空格逗号为分隔符,以回车结束)程序将其28中最大的数显示出来用户按任一键,重做,按键,返回主菜单ESC按键显示时间4首先提示用户对时,即用户输入时,分,秒(以空格或者冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为XX(时)XX(分):xx(秒),最好定点显示用户按任一键,重新对时,按键,返回主菜单ESC按键,结束程序运行,返回系统提示符5DATA SEGMENTORG0000H;BUFFER POOLBUFFDB100DBO()DB100DUP ODATA ENDSSTACKSEGMENT()STT DB100DUP OTOPEQU LENGTHSTTSTACK ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK;MAIN PROCESSSTART:MAIN PROCFARFIRST:MOV AX,DATAMOV DS,AXMOV SI,OFFSET BUFFMOV AX,STACKMOV SS,AXMOV SP,OFFSET TOPCHOICE:」MOV AHINT21HCMP AL;5JE EXITCMP AL;1JE FUNCTIONlCMP AL;2JE FUNCTION2CMP AL,3JE FUNCTIONSCMP AL,4JE FUNCTION4CHANGE_LINE:MOV DL,0AHMOV AH,2INT21H;ERROR INPUT,CHOOSE AGAIN.JMP FIRSTFUNCTIONl:MOV DL,0AHMOV AH,2INT21HCALL FlJMP CHANGE_LINEFUNCTION2:MOV DL,0AHMOV AH27INT21HCALL F2JMP CHANGE_LINEFUNCTIONS:MOV DL,OAHMOV AH,2INT21HCALL F3JMP CHANGE_LINEFUNCTI0N4:MOV DL,OAHMOV AH,2INT21HCALL F4JMP CHANGE_LINEEXIT:MOV AH,4CHINT21HRETMAIN ENDP;SUBPROCESS1Fl PROC NEAR;GET STRINGMOV SI,OFFSET BUFFMOV DX,SIMOV AH,0AHINT21HCALL CHANGE_LINE;GET THESIZE OFSTRINGINC SIMOV CL,[SI]MOVCH,0INC SI;CHANGE THELETTERS ANDPRINTCHANGE:MOV DL,[SI]CMP DL,ZJBE NEXTSUBDL,2OHNEXT:MOV AH,2INT21HINCSILOOP CHANGECALLCHANGE LINE;RETURNRETFl ENDP;SUBPROCESS2F2PROC NEAR;GET STRINGMOV DX,SIMOV AH,0AHINT21HCALL CHANGE_LINE;GET THESIZE OFSTRINGINC SIMOVCL,[SI]MOVCH,0INC SI;GET THEMAX CHARMOV AL,[SI]INC SICOMPARE:CMPAL,[SI]JA NEXTMOV AL[SI]ZNEXT:INC SILOOPCOMPAREPRINT:MOV DL,ALMOV AH,2INT21HCALL CHANGE_LINE;RETURNRETF2ENDP;SUBPROCESS3F3PROC NEAR;GET STRINGMOV SI,OFFSET BUFFADDSI,2MOV DX,SIMOV AH,0AHINT21HCALL CHANGE_LINE;GET THESIZE OFSTRINGINC SIMOVCL,[SI]MOV CH,0INC SIMOV DX,SIDEC CX;BUBBLE SORTLOOP1:MOV BX,CXLOOP2:MOVAL,[SI]CMPAL,[SI+1]JA NEXTXCHGAL,[SI+1]MOV[SI],ALNEXT:INCSIDEC BXJNELOOP2MOVSLDXLOOP LOOP1;PRINTMOVCL,[SI-1]MOVCH,0PRINT:MOV DL,[SI]MOV AH,2INT21HINCSILOOP PRINTCALLCHANGE_LINE;RETURNRETF3ENDP;SUBPR0CESS4F4PROCNEAR;INPUT THETIMEINPUT:MOVDX,SIMOV BL,10;HOURMOV AH,0AHINT21TCMP BYTE PTR[SI+1],2JNE INPUTSUBBYTE PTR[SI+2],30HSUB BYTE PTR[SI+3],30HMOV AL,[SI+2]MULBLADD AL,[SI+3]MOV CH,ALCALL CHANGE_LINE;MINUTEMOV AH,0AHINT21TCMP BYTEPTR[SI+1],2JNE INPUTSUBBYTEPTR[SI+2],30HSUB BYTEPTR[SI+3],30HMOV AL,[SI+2]MULBLADD AL,[SI+3]MOVCL,ALCALL CHANGE_LINE;SECONDMOVAH,OAHINT21TCMP BYTEPTR[SI+1],2JNE INPUTSUBBYTEPTR[SI+2],30HSUB BYTEPTR[SI+3],30HMOV AL,[SI+2]MULBLADD AL,[SI+3]MOV DH,ALCALL CHANGELINE;l/100SECONDMOV DL,0;SET THETIMEMOV AH,2DHINT21H;CHECKCMP AL,00JNE INPUT;GET THETIMEMOV SI,OFFSET BUFFADD SI,2GET:MOV AH,2CHINT21HMOV[SI],CHMOV[SI+2],CLMOV[SI+4],DH;BINARY TOASCIIMOV BL,10;HOURMOV AH,0MOV AL,[SI]DIV BLADDAH,30HADD AL30HzMOV[SI],ALMOV[SI+1],AH;MINUTEMOV AH,0MOV AL,[SI+2]DIV BLADDAH,30HADD AL,30HMOV[SI+2],ALMOV[SI+3],AH;SECONDMOV AH,0MOV AL,[SI+4]DIV BLADDAH,30HADD AL,30HMOV[SI+4],ALMOV[SI+5],AH;PRINT THETIME;HOURMOV DL,[SI]MOV AH,2INT21HMOV DL,[SI+1]MOV AH,2INT21H MOVDL;:;MINUTEMOV DL,[SI+2]MOV AH,2INT21HMOV DL,[SI+3]MOV AH,2INT21H MOVDL;:;SECONDMOV DL,[SI+4]MOV AH,2INT21HMOV DL,[SI+5]MOV AH,2INT21H;CHECKTHE INPUTMOV AH,OBH INT21H CMPAL,OFFH JEGET;RESETOR EXIT」MOV AHINT21H CMPAL,1BH JEEXIT JMPINPUT;RETURNEXIT:RET F4ENDP;CHANGE LINECHANGELINE PROCNEARPUSH AXPUSHDXMOV DL,ODH MOV AH,02INT21HMOV DL,OAH MOV AH,02INT21HPOP DXPOPAXRETCHANGE_LINE ENDPCODEENDSENDSTART1twefqZ314TUEFQZ31413542ABCabc c31354ZABCdefGh hfedGCBA543ZlADDSblLOOP CHANGEEXIT:MOV WORD PTR[DI],AXMOV AH,4CHINT21HCODE ENDSENDSTART-d356O0770:350030303031320O GO00-
0000090000002.将从键盘输入的五位十进制数的ASCH码已存在3500起始的内存单元中把它转换成BCD码后,再按位分别存入350A起始的内存单元内若输入的不是十进制的ASCII码,则显示FF.DATA SEGMENTORG3500HNUM1DB5DUPO;NUM1DB12345ORG350AHNUM2DB5DUPODATA ENDSSTACKSEGMENTDB100DUPOSTACK ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,OFFSET NUM1MOVSI,AXMOV AX,OFFSET NUM2MOV DI,AXMOV CX,5CHANGE:实验心得
1、对于汇编程序,书上的内容有限,更多的内容需要自己上网查找甚至自己发现比如和的一些功能调用,书上只列出了简单常用的一部份,但和DOS BIOSDOS的强大功能不仅于此因此实验后可以更进一步了解了汇编语言BIOS
2、实验过程中,代码第一次完成就没有出错的情况是比较少见的,更多的时间会花在调试、检查和修改上其中语法错误最容易发现,因为编译不能通过,如将一个字节的存储器数据赋给了字节的寄存器,编译就会报错,只需按所学21知识修改即可而逻辑错误就难以发现,因为编译和生成文件步骤上都是没EXE有问题的,但运行时往往得不到正确的结果,这时就需要子细地逐步去调试,发现问题所在并修改之
3、实验2和实验3的代码都比较简单,都是一些比较简单的改动内存的数据后运行程序,使另一处内存得到预期结果但实验代码比较繁琐,每一点细微的差错4都可能造成整个程序输出乱码实验的子程序和子程序有一部份代码其实423是相同的,可以用另一个子程序去替代,但鉴于初学,目前仅用复制代码去完成其中实验的第个子程序仍没有正确写出瓶颈在于如何获取到键盘有无输入44的同时且获取到所需输入的按键是哪一个,以及如何定点显示我相信在我更深一步学习汇编语言之后会很好地突破这个瓶颈MOV AL,[SI]CMPAL,39H JAERROR CMPAL,30H JBERROR SUBAL,30H MOV[DI],ALADDSI,1ADD Dl,l LOOPCHANGEJMP EXITERROR:MOV BXRFFHMOV[DI],BXEXIT:MOV AH,4CH INT21HCODE ENDSEND STARTProgram terminatednormally-d35G60776:35603132333435OO0000-000001OZ0304G
3.将十六位二进制数转换为ASCII码表示的十进制数十六进制数的值域为0~65535,最大可转换为五位十进制数DATA SEGMENTORG3500HNUM1DDOORG3510HNUM2DB5DUPODATA ENDSSTACKSEGMENTDB100DUPOSTACK ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,OFFSET NUM1MOVSI,AXMOV AX,OFFSET NUM2MOV DI,AXADD Dl,5MOV CX,5MOV AX.WORDPTR[SI]MOV BX,1OCHANGE:MOVDX,0DIV BXADDDL,3OHMOV[DI],DLDEC DILOOP CHANGEEXIT:MOVAH,4CHINT21HCODE ENDSENDSTART9770:3500OC00000000000G00-
60.
4、十六进制数转换为ASCII码DATA SEGMENTORG3500HNUM1DDOORG3510HNUM2DB4DUPODATA ENDSSTACKSEGMENTDD100DUPOSTACK ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,OFFSET NUM1MOVSI,AXMOV AX,OFFSET NUM2MOV DI,AXMOV BL2ZMOV CX,4CHOICE:MOV AL,[SI]AND AL,OFHCMP AL,9JBE CHANGE_11JMP CHANGE_12CHANGE_11:ADD AL,30H」JMP NEXTCHANGE_12:ADD AL,37HNEXT_1:MOV[DI],ALADD Dl,lMOV ALJSI]AND AL,OFOHSHR AL,CLCMP AL,9JBE CHANGE_21JMPCHANGE_22CHANGE_21:ADD AL,30HJMP NEXT_2CHANGE_22:ADD AL,37HNEXT_2:MOV[DI],ALADD Dl,lADDSI,1DEC BXJNECHOICEEXIT:MOVAH,4CHINT21HCODE ENDSENDSTARTProgramterminatednormally kd35ee;0770:35003B20GO00GO OO6000-006G00000000€»60国76:3514233303Z00906096OP000008OQ00B
5、BCD码转换为二进制码DATA SEGMENTORG3500HNUM1DB8DUPOORG3510HNUM2DB4DUP0DATAENDSSTACKSEGMENTDB100DUPOSTACK ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,OFFSETNUM1MOVSI,AXMOV AX,OFFSET NUM2MOV DI,AX MOVCX,4MOV BL,10CHANGE:MOV AL,[SI]MULBL ADDSI,1ADD AL,[SI]ADDSI,1MOV[DI],AL ADD DI,2LOOPCHANGEEXIT:MOVAH4CHZINT21HCODE ENDSENDSTART-d35003770:350001GZ63M65G66768-
1.设计一数据块间的搬移程序DATA SEGMENTORG3500HMESS AGEl DBHELLO KITTYCOUNTEQU11DATA ENDSEXTRASEGMENTORG3510HMESSAGE2DB11DUPOEXTRA ENDSSTACKSEGMENTDDIOODUPOSTACK ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,OFFSET MESSAG ElMOVSI,AXMOV AX,OFFSET MESSAGE2MOV DI,AXMOV AX,DSMOV ES,AXMOV CX,COUNTCLDCOMPARE:CMP SI,DIJB NEXT1JMP NEXT2NEXT1:STDADD SI,COUNT-1ADDDI,COUNT-1REP MOVSBJMPEXITNEXT2:REP MOVSBJMPEXITEXIT:MOVAH,4CHINT21HCODE ENDSENDSTART
个人认证
优秀文档
获得点赞 0