
汇编课程设计.docx
10页汇编语言课程设计 实验报告一、课程设计目的《汇编语言程序设计》是计算机专业一门重要的核心课程,也是一门实践性很强的课程, 而课程设计则是其中一个重要的应用实践环节本次课程设计的目的是提高分析问题、解决问题的能力以及实际动手能力,进一步加深 对汇编语言程序设计基本理论的理解,熟练掌握汇编语言程序上机调试的方法技巧、结构化 程序设计技术及高级汇编语言技术,能编写较复杂的应用程序,为学习后继课程打下扎实的 基础二、实验环境编译机器:IBM兼容PC操作系统: Windows XP -SP2 中文版编译工具: MASM 5.0三、课程设计内容1、编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示:— 278 + 32=— 132——12 =11*— 32=—1234/—18=要求程序能接收键入的算式,在接收到‘='号时,计算并以有符号十进制数的形式显 示结果,然后允许用户继续键入算式如果键入算式后再键入‘.',则显示结果并结束整个 程序‘/'为整除) 程序设计框图:程序源代码:DATA SEGMENTL6: MOV AH,4CHOUT3: POP DXSIG DB OOHINT 21HADD DL,30HNUM1 DW 0MAINT2:MOV AH,2NUM2 DW 0CMP SIG,'+'INT 21HX DB 10JNZ S1CMP BP,SPDATA ENDSMOV AX,NUM1JNZ OUT3CODE SEGMENTMOV BX,NUM2MOV DL,OAHMAIN PROC FARADD AX,BXMOV AH,2ASSUME CS:CODE,DS:DATAJMP MAINT4INT 21HSTART:S1: CMP SIG,'-'MOV DL,ODHMOV AX,DATAJNZ S2MOV AH,2MOV DS,AXMOV AX,NUM1INT 21HMAINT5: MOV CX,0SUB AX,NUM2JMP MAINT5MOV DX,0JMP MAINT4MOV AX,0S2: CMP SIG,'*'MAIN ENDPMOV BX,0JNZ S3BIN PROC NEARMAINT1: MOV AH,1MOV AX,NUM1PUSH DXINT 21HMOV DX,0MOV BX,0MAINT3: CMP AL,30HIMUL NUM2INC CXJL L1JMP MAINT4SUB AL,30HCMP AL,3DHS3: MOV AX,NUM1CBWJZ MAINT2MOV BX,NUM2XCHG AX,BXCALL BINIDIV BLMOV DX,10CMP DX,1CBWMUL DXJNZ L5MAINT4:XCHG AX,BXNEG BXMOV BP,SPADD BX,AXMOV DX,0TEST AX,8000HBINT1: MOV AH,1L5: CMP CX,1JZ OUT2INT 21HJZ L3MOV BX,AXCMP AL,30HMOV NUM2,BXMOV DL,'-'JL EXITJMP MAINT3MOV AH,2CMP AL,3DHL3: MOV NUM1,BXINT 21HJZ EXITJMP MAINT3MOV AX,BXSUB AL,30HLI: CMP AL,2EHNEG AXCBWJZ L6OUT2: DIV XXCHG AX,BXCMP CX,1MOV BL,AHMOV DX,10JNZ L2MOV BH,0MUL DXMOV SIG,ALPUSH BXXCHG AX,BXMOV CX,2MOV AH,0ADD BX,AXJMP MAINT1CMP AL,0JMP BINT1L2: CMP AL,2DHJNZ OUT2EXIT: POP DXJNZ MAINT1RETMOV DX,1BIN ENDPJMP MAINT1CODE ENDSEND START2、已知一个由英语单词组成的字符串已按字典序排好,每个单词以空格符为结束,该 串的首二字节为16 位无符号二进制数,用以说明串的长度。
试编程能从键盘上输入单词(以 空格字符为结束),若字符串中没有该单词,则将该单词插入该串适当的位置,使其仍保持 字典序,并修改串长度,显示单词在串中位置及串长度;若字符串中有该单词,则显示字符 串中所有包含该单词的单词,及其在字符串中的位置程序设计框图:start:MOVMOVLEAMOVMOVINTGET_WORD:程序代码:SEGMENT; DICTIONARY 字典字符串,首两个字节为 16 位无符号二进制数,说明字符串长度DICTIONARYDB00,16H,"add an book dad egg "DB100H DUP(20H) ; 空的缓冲区MSG_INTRODB"Input the Word to Search : ","$"MSG_NOTFOUNDDB"Not Found, Now Insert it . ",0AH,0DH,"$"MSG_NEWDICTDB0AH,0DH,"New Dictionary : ","$"MSG_FOUNDDB0AH,0DH,"Found Word in Dictionary : ","$"MSG_POSITIONDB0AH,0DH,"Position : ","$"MSG_DICTLENGTHDB0AH,0DH,"New Dictionary Length : ","$"MSG_NEWLINEDB0AH,0DH,"$"BUFFERDB10H DUP(20H) ; BUFFER 用于保存需要查询的单词。
WORD_LENGTHDB0HCHAR_SPACEEQU20H ; 默认的单词间隔为空格ENDSSEGMENTASSUME CS:CODE,DS:DATADATADATACODEAX,DATADS,AXBX,BUFFER;把buffer有效地址送BXDX,OFFSET MSG_INTRO ; 把偏移地址送 DX 通用寄存器AH,09H ; 调用 9 号中断,输出 MSG_INTRO 21H; 获取用户输入的需要查找的单词字符串MOVAH,01HINT21HCMPAL,0DH; 输入以回车结束JEINPUT_FINISH; 如果是回车,跳转输入结束MOV[BX],ALINCBX;BX 加 1, 下一步修改字符长度INCJMPWORD_LENGTHGET_WORDINPUT_FINISH:MOVDX,OFFSET MSG_NEWLINE ;把偏移地址送DX通用寄存器MOVAH,09HINT21HSUBBX,WORD PTR WORD_LENGTHMOVCX,00HMOVSI,02HSEARCH:MOVDL,[BX]; 把输入的字符放到 DLCMPDL,DICTIONARY[SI];比较[BX]和 DICTIONARY[SI]内容是否匹配。
JEMATCH; 结果匹配JNLUNMATCH_NEXT; 需要查找下一个单词JLUNMATCH_INSERT; 找到了输入单词的插入位置,将要插入这个单词MATCH:MOVDL,DICTIONARY[SI+1]CMPDL,CHAR_SPACE;如果DICTIONARY下一位字符为空格,查找成功JNENOFOUNDJMPFOUNDNOFOUND:INCBX ;匹配了 1 位字符,继续比较下一位INCSIINCCX ;匹配计数器增加一位JMPSEARCHUNMATCH_NEXT:;如果当前字典中的单词不匹配,BUFFER回到首地址,DICTIONARY[SI]到下一个单词SUB BX,CX ; 将 BX 恢复初始位置MOV CX,0H ; 匹配计数器 CX 清零 找到下一个单词的起始位置TO_NEW_WORD:MOV DH,DICTIONARY[0]MOV DL,DICTIONARY[1]INC DXCMP DX,SIJE INSERT_LASTMOV DL,DICTIONARY[SI]INC SICMP DL,CHAR_SPACEJNE TO_NEW_WORDJMP SEARCH ; 新的匹配查找。
已经到了字典字符串的最后UNMATCH_INSERT:; 字典中的下一个单词比输入查询的单词"小",将在这个单词前面插入新单词将DICTIONARY[SI-CX]后面的单词向后移动WORD_LENGTH字节,为新的单词空出 最后修改串的长度MOVAX,SISUBAX,CXSUBBX,CXMOVDH,DICTIONARY[0]; 获得串长度MOVDL,DICTIONARY[1]MOVSI,DX; 从最后一个字符开始,向后移动字典字符串RIGHTMOVE:DECSIMOVDL,DICTIONARY[SI]ADDSI,WORD PTR WORD_LENGTHINCSIMOVDICTIONARY[SI],DLSUBSI,WORD PTR WORD_LENGTHDECSICMPSI,AXJNERIGHT_MOVEMOV SI,AXMOV CX,WORD PTR WORD_LENGTH; 在新的位置插入新单词INSERT:MOV DL,[BX]MOV DICTIONARY[SI],DLINC BXINC SILOOP INSERT; 在新添加的单词后面补充一个空格MOV DICTIONARY[SI],CHAR_SPACE; 修改字符串长度。
MOV DH,DICTIONARY[0]MOV DL,DICTIONARY[1]ADD DX,WORD PTR WORD_LENGTHMOV DICTIONARY[0],DHMOV DICTIONARY[1],DLSHOW_NEWINSERT:; 显示插入新单词的位置和新的字符串MOVDX,OFFSET MSG_NEWLINEMOVAH,09HINT21HMOVDX,OFFSET MSG_NOTFOUNDMOVAH,09。
