汇编语言课程设计论文计算平台长度程序加减乘除四则运算.doc
攀枝花学院学生课程设计(论文)题 目: 计算平台长度程序 加减乘除四则运算 学生姓名: 学 号: 所在院(系): 计算机 专 业: 软件工程 班 级: 指 导 教 师: 职称: 2010年12月30日攀枝花学院教务处制攀枝花学院本科学生课程设计任务书题目算术运算程序1、课程设计的目的通过本课程设计教学所要达到的目的是:1、培养学生理论联系实际的设计思想,提高学生综合运用汇编语言课程的理论知分析问题、解决问题的能力。2、通过查找、运用设计资料,完成工程设计所必备的基本训练。3、使同学们更深入的了解计算机系统内部的有关知识,为以后的学习和系统开发奠定良好的基础。2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)1. 判断闰年程序设计内容:判断某年是否为闰年。要求:年份从键盘输入,通过运行计算后,输出相应信息。设计思路:利用DOS21H中断类型的10号键盘功能调用,将从键盘接收的年份数值型字符串按字节存入缓冲区。,将字符串中的每个字节转换为对应的十进制数值(利用09这10个数的ASCII码值比其本身大30H的关系),通过判断某年是否为闰年的表达式,判断输出是否为闰年的信息。2产生随机数并运算的程序设计内容:编程实现产生两个随机数,并能对产生的随机数进行加法和减法运算。设计思路:利用BIOS功能调用的时钟中断调用(1AH中调用),读取时钟计数器的值,利用随时变化的时间计数产生随机数并进行加法或减法的运算。然后将产生的随机数和运算结果转换为相应的十六进制数表示的ASCII码字符,并将其显示在屏幕上。3计算平台长度程序设计内容:已知一个有序数组a ,其中有n个元素(n为整数),a中相同的元素全部集中在一起,形成一个个“平台”。用汇编语言编程,求出a中最大平台的长度。要求:程序运行时将提示输入设计思路:定义6个变量a、b、a0、b0、a1、b1,其中a、b、a0、b0存放从键盘输入的元素,a、b为中间变量,a0始终存放最大平台的元素;a1、b1存放数组相同元素的个数,a1中始终存放着最大平台的长度。总的思路:用回车键来结束键盘的输入。将从键盘输入的第一个元素存入a、a0中,給a1赋1,接收从键盘输入的第二个元素,存入b中,判断两个元素是否相同,若相同,则a1加1,否则将第二个元素存于b0中,给b1赋1。接收从键盘输入的第三个元素,与前一元素比较,若相同,则b1加1,否则,比较前两次的数组元素长度a1和b1,若a1小于b1,则将b0的值赋给a0,b1的值赋给a1。再接收下一元素,重复上述过程,直到输入回车符为止。4.加减乘除四则计算设计内容:设计一个能实现加、减、乘、除、取余的程序。要求:该程序接受从键盘输入的十六进制数,执行相应得计算后,计算结果以十六进制数输出。设计思路:将键盘输入的表达式预存入一缓冲区中,然后从该缓冲区的第一个字符开始读取判断,当读取到一个有效的表达式时,对表达式进行相应的运算后,输出用十六进制数表示的运算结果;当表达式无效时,输出表达式“ERROR(错误)”的信息或者是有效表达式“JS<Expression>”的提示信息。3、主要参考文献1汇编语言程序设计,吴向军等,高等教育出版社,20022IBM-PC汇编语言及程序设计(第2版), 沈美明等,清华大学出版社,20013IBM-PC汇编语言及程序设计实验教程,沈美明等,清华大学出版社 ,20014汇编语言程序设计, 钱晓捷等,电子工业出版社,20005汇编语言程序设计, 张志明等,重庆大学出版社,19974、课程设计工作进度计划时间(天)内容安排1分析设计准备3编程调试阶段1 编写课程设计报告指导教师(签字)日期年 月 日教研室意见:年 月 日学生(签字): 接受任务时间: 年 月 日课程设计(论文)指导教师成绩评定表题目名称计算平台长度与加减乘除四则运算评分项目分值得分评价内涵工作表现20%01学习态度6遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。02科学实践、调研7通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。03课题工作量7按期圆满完成规定的任务,工作量饱满。能力水平35%04综合运用知识的能力10能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。05应用文献的能力5能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。06设计(实验)能力,方案的设计能力5能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。07计算及计算机应用能力5具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。08对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)10具有较强的数据收集、分析、处理、综合的能力。成果质量45%09插图(或图纸)质量、篇幅、设计(论文)规范化程度5符合本专业相关规范或规定要求;规范化符合本文件第五条要求。10设计说明书(论文)质量30综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。11创新10对前人工作有改进或突破,或有独特见解。成绩指导教师评语指导教师签名: 年月日摘 要通过本学期学习汇编语言,掌握一定的变程技能,汇编语言也是计算机应用中重要的语言之一。本课程设计编写计算平台长度程序和加减法四则运算两个程序。程序一功能完成输入数字计算其最大平台长度,并且输出计算结果。程序二功能从键盘接收输入数字完成加减乘除取余的四则运算。将课本上的子程序调用和宏定义等有关知识和实际应用有机的结合起来,提高分析和解决实际问题的能力;通过对通讯录汇编语言程序代码的阅读、修改、设计,理解和掌握复杂的汇编语言应用程序的编程,从而提高自身实践编程能力。关键词:汇编语言程序 DOS功能调用 Debug调试1课程设计题目描述和要求 1.1.1计算平台长度程序设计内容:已知一个有序数组a ,其中有n个元素(n为整数),a中相同的元素全部集中在一起,形成一个个“平台”。用汇编语言编程,求出a中最大平台的长度。要求:程序运行时将提示输入。1.1.2.加减乘除四则计算设计内容:设计一个能实现加、减、乘、除、取余的程序。要求:该程序接受从键盘输入的十六进制数,执行相应得计算后,计算结果以十六进制数输出1.2 问题提出及功能要求计算平台长度:如何判断数据有效性?如何接收输入数据的?怎样比较数据平台长度?是否需要中间变量?输入输出数据存储问题等。加减乘除四则计算:怎样解决数据有效性问题?如何数据接收存储问题?计算结果表达及输入时式子表达方式等问题功能要求:对计算平台长度的程序,要求程序开头提示输入有效数组a,输入后即运算a中最大平台长度。对四则运算程序,要求从键盘输入计算式子后执行相应的计算,然后将计算结果输送到屏幕显示,当式子输入有误时提示“error”。1.3 运行环境由于本课程主要是学习16位汇编编程,通过masm5.0编译的程序,在系统为32位XP、dos,或64位Win7环境下无法运行,虚拟机安装32位XP。环境下进行编译,和运行masm5.0编译环境,和编译完成的程序。1.4 本课题涉及的知识点寄存器的使用通用寄存器、段寄存器、专用寄存器;掌握16/32位微机内存管理模式。各种寻址方式立即数寻址方式、寄存器寻址方式、直接寻址方式等荀子方式。标识符和表达式标识符、简单内存变量定义、调整偏移量伪指令、表达式等。微机cpu指令系统汇编指令格式、指令系统等。程序基本结构源程序的基本组成、程序基本结构、段的基本属性等。输入与输出和中断,条件转移指令,指令的汇编格式及功能等。2算法设计2.1计算平台长度程序:设计思路:定义6个变量a、b、a0、b0、a1、b1,其中a、b、a0、b0存放从键盘输入的元素,a、b为中间变量,a0始终存放最大平台的元素;a1、b1存放数组相同元素的个数,a1中始终存放着最大平台的长度。总的思路:用回车键来结束键盘的输入。将从键盘输入的第一个元素存入a、a0中,給a1赋1,接收从键盘输入的第二个元素,存入b中,判断两个元素是否相同,若相同,则a1加1,否则将第二个元素存于b与前一元素比较,若相同,则b1加1,否0中,给b1赋1。接收从键盘输入的第三个元素,则,比较前两次的数组元素长度a1和b1,若a1小于b1,则将b0的值赋给a0,b1的值赋给a1。再接收下一元素,重复上述过程,直到输入回车符为止。22 程序流程图如下:开始显示提示信息回车换行a 键盘输入元元素是回车符?输入最大平台长度a1 输入最大平台元素a0 结束a a1 a0 a1 a1 1a 键盘输入元素是否回车符?号b a1b1 a1a与b是否相同b0 a1b1 a1a1 键盘输入元素与前一个b0相同? b 1<a1?b1 b1+1a a+1a0 b0 a1 b1 b a1b 1 b a1b a1 a 中是回车否?图:1-13.代码设计data segmentobf db '* welcome you !*',0dh,0ah db ' input data:','$'a0 db ?a1 db ?b0 db ?b1 db ?a db ?b db ?data endsstack segment stack db 200 dup(0) stack endscode segment assume cs:code, ds:data,ss:stackmain:mov ax, data mov ds, ax mov ah, 9;显示提示信息 lea dx, obf int 21h inc dx mov dl, 13;回车换行 mov ah, 2 int 21h mov dl,10 int 21h mov ah,1;接收键盘输入,;若为回车键,则转移到lab1 int 21h;否则将字符输入a中 cmp al, 13 jz lab1 mov a0, al mov a, al mov a1, 1x1: mov ah, 1;接收键盘输入,若为回车键,则转移到lab1 int 21h;否则将字符与前一字符比较 cmp al, 13;若不同,则将其存入b0.b1中若相同 jz lab1;a1累加1 mov b, al mov bl, b cmp bl, a jnz x2 add a1, 1 jmp x1x2: mov b0, bl mov b1, 1x3: mov ah, 1 ;接收键盘输入,若为回车键,则转移到lab1输出a1 int 21h;a0,再将其前一个字符相比较;若不相同,则转移到x4 mov a, al;若相同则b1累加 cmp bl,a jnz x4 add b1,1 jmp x3x4: mov cl, b1 cmp cl, a1;比较a1与b1,若b1大;则把b1送入a1,b0送入a0 jb y1;否则转移到y1 mov cl, b0 mov a0, cl mov cl, b1 mov a1,cl y1: cmp al, 13;若输入为回车符;则转移到lab1,否则返回x3,继续 jz lab1 mov b0, al mov b1, 1 mov b, al mov bl, b jmp x3lab1: mov ah, 2;输入a1.a0,返回dos程序 mov dl,13 int 21h mov dl,10 int 21h cmp a1,10 jb z1 mov ah,0 mov al, a1 mov bl, 10 div bl add ax, 3030h mov bx, ax mov ah, 2 mov dl, bl int 21h mov dl, bh int 21h jmp z2z1: add a1, 30h mov dl, a1 int 21h sub a1,30hz2: mov ah,2 mov dl, 13 int 21h mov dl, 10 int 21h mov cx, 0 mov cl, a1 mov ah, 2m: mov dl,a0 int 21h loop m mov ah, 4ch int 21hcode ends end main调试与运行: 步骤:源代码的编写、汇编出现错误 图1-2打开LST文件debu调试图1-3调试成功后 图1-4运行程序后,屏幕上出现* welcome you !* input data:此时输入数据111122333,结果为: 4 1111图1-5出现的问题:如果输入的数字平台长度都一样,像111122223333。程序将只显示最后一个一个平台长度 图1-6结果分析:数组a ,其中有n个元素,a中相同的元素全部集中在一起,形成一个个“平台”。汇编语言编程求出a中最大平台的长度,并输出。二、加减乘除四则运算:设计内容:设计一个能实现加、减、乘、除、取余的程序。该程序接受从键盘输入的十六进制数,执行相应得计算后,计算结果以十六进制数输出。设计思路:将键盘输入的表达式预存入一缓冲区中,然后从该缓冲区的第一个字符开始读取判断,当读取到一个有效的表达式时,对表达式进行相应的运算后,输出用十六进制数表示的运算结果;当表达式无效时,输出表达式“ERROR(错误)”的信息或者是有效表达式“JS<Expression>”的提示信息。程序流程图如下开始从键盘接收字符表达,放入内存AL 从内存取第一个字符空格符/制表符?是否是回车符?符?Call uvicCall uvjgCall crlfCall szysCall xujgCall bcjg显示提示信息mess3结束AL 从内存取第一字符显示键入正确表达式提示信息messl输出结果输入回车换行符四则运算数制处理预置结果保存结果 图2-1B_P EQU BYTE PTRW_P EQU WORD PTRD_P EQU DWORD PTRCODE SEGMENTASSUME CS:CODE,DS:CODE ORG 100H;主程序开始NEWSTAR: JMP STAR EVENNUM1 DW 0,0NUM2 DW 0,0NUM3 DW 0,0JGV4 DW 0,0YSF LABEL WORDYSF1 DB 0YSF2 DB 0JUV DB 0UV DB 0;使DS:SI指向第一有效字符OVERS LABEL NEAR CLD PUSH AXOVERS1: LODSB CMP AL,' ' JZ OVERS1 CMP AL,9 JZ OVERS1 DEC SI CMP AL,13 POP AX RET;输出一个制表符TAB LABEL NEAR MOV AL,9 JMP SHORT DISP;输出一个回车换行符CRLF LABEL NEAR MOV AL,13 CALL DISP MOV AL,10;显示一个字符DISP LABEL NEAR PUSH AX PUSH DX MOV AH,2 MOV DL,AL INT 21H POP DX POP AX RET;检查是否为运算符ISYSF LABEL NEAR CLD LODSB CALL ISJJ JZ ISYSF1 CALL ISII JZ ISYSF1 DEC SIISYSF1: RET;检查是否是加减运算ISJJ LABEL NEAR CMP AL,'+' JZ ISYSF1 CMP AL,'-' RET;检查是否为乘除运算ISII LABEL NEAR CMP AL,'*' JZ ISYSF1 CMP AL,'/' JZ ISYSF1 CMP AL,'' RET;数据输出;CX=10 十进制;CX=16 十六进制DOUT LABEL NEAR PUSH AX PUSH BX PUSH DX PUSH BP XOR BP,BPDOUT1: INC BP PUSH AX MOV AX,DX XOR DX,DX DIV CX MOV BX,AX POP AX DIV CX PUSH DX MOV DX,BX OR BX,AX JNZ DOUT1DOUT2: POP AX ADD AL,'0' CMP AL,'9' JBE DOUT3 ADD AL,'A'-'9'-1DOUT3: CALL DISP DEC BP JNZ DOUT2 POP BP POP DX POP BX POP AX RET;输入数据在DX:AX中返回;CX=0 数据为10进制;CX#0 数据为16进制DATE LABEL NEAR PUSH BX PUSH BP PUSH DI XOR AX,AX XOR DX,DXDATE1: MOV DI,AX LODSB CMP AL,'0' JB DATE7 CMP AL,'9' JA DATE6DATE2: AND AX,0FH SHL DI,1 RCL DX,1 MOV BX,DI MOV BP,DX SHL DI,1 RCL DX,1 SHL DI,1 RCL DX,1 JCXZ DATE3 SHL DI,1 RCL DX,1 Jmp short DATE4DATE3: ADD DI,BX ADC DX,BPDATE4: ADD AX,DI ADC DX,0 JMP DATE1DATE5: ADD AL,9 JMP DATE2DATE6: JCXZ DATE7 CMP AL,'A' JB DATE7 CMP AL,'F' JBE DATE5 CMP AL,'a' JB DATE7 CMP AL,'f' JBE DATE5DATE7: MOV AX,DI DEC SI OR DI,DX POP DI POP BP POP BX RET;数据1与数据2根据YSF1进行加减运算JSJJ LABEL NEAR MOV AX,NUM2 MOV DX,NUM2+2 CMP YSF1,'+' JZ JSJJ1 SUB NUM1,AX SBB NUM1+2,DX JMP SHORT JSJJ2JSJJ1: ADD NUM1,AX ADC NUM1+2,DXJSJJ2: RET;数据1与数据2根据YSF1进行乘除运算JSII1 LABEL NEAR MOV BX,OFFSET NUM1 JMP SHORT JSII2_1;数据2与数据3根据YSF2进行乘除运算JSII2 LABEL NEAR MOV BX,OFFSET NUM2JSII2_1: DB 66H MOV AX,BX DB 66H MOV CX,BX+4 CMP YSF2,'*' JNZ JSII2_2 DB 66H IMUL CX JMP SHORT JSII2_3JSII2_2: DB 66H CWD DB 66H IDIV CX CMP YSF2,'/' JZ JSII2_3 DB 66H XCHG DX,AXJSII2_3: DB 66H MOV BX,AX RET;显示结果XUJG LABEL NEAR MOV AX,JGV4 MOV DX,JGV4+2 MOV CX,10 CMP UV,10 JZ XUJG0 MOV CX,16XUJG0: TEST DX,8000H JZ XUJG1 CMP UV,10 JZ XUJG2 CALL DOUTXUJG2: NOT AX NOT DX ADD AX,1 ADC DX,0 PUSH AX CMP UV,10 JZ XUJG3 MOV AL,' ' CALL DISP MOV AL,'(' CALL DISPXUJG3: MOV AL,'-' CALL DISP POP AX CMP UV,10 JZ XUJG1 CALL DOUT MOV AL,')' CALL DISP RETXUJG1: CALL DOUT RET;计算结果放入DX:AX中JSJG LABEL NEAR CALL JSJJ MOV AX,NUM1 MOV DX,NUM1+2 RET;从DS:SI处取一个数据LOADATE LABEL NEAR LODSB CMP AL,'(' JZ LOADATE1 DEC SI PUSH CX XOR CX,CX CMP UV,10 JZ LOADATE0 INC CX ;取16进制数LOADATE0: CALL DATE ;取数据放入DX:AX中 POP CX RETLOADATE1: PUSH NUM1 ;保存数据1数据2及运算符 PUSH NUM1+2 PUSH NUM2 PUSH NUM2+2 PUSH YSF INC JUV MOV JGV4,0 ;结果值清零 MOV JGV4+2,0;进行四则运算SZYS LABEL NEAR CALL ISYSF ;首字符是运算符? JZ SZYS2 CALL LOADATE ;不是,取数并保存 MOV NUM1,AX MOV NUM1+2,DXSZYS1: XOR AX,AX ;数据2清零 MOV NUM2,AX MOV NUM2+2,AX CALL ISYSF ;下个是运算符? JZ SZYS3 JNZ SZYS6SZYS2: PUSH AX MOV AX,JGV4 ;将结果作为数据1 MOV NUM1,AX MOV AX,JGV4+2 MOV NUM1+2,AX POP AXSZYS3: MOV YSF1,AL MOV YSF2,AL CALL ISJJ ;是加减运算转 JZ SZYS4 CALL LOADATE ;取数据2 MOV NUM2,AX MOV NUM2+2,DX CALL JSII1 ;数据1与数据2根据YSF1进行乘除运算 JMP SZYS1 ; 结果保存在数据1中SZYS4: CALL LOADATE ;取数据2并保存 MOV NUM2,AX MOV NUM2+2,DXSZYS4_1: CALL ISYSF JNZ SZYS6 CALL ISJJ ;运算符2是加减运算? JNZ SZYS5 ;不是转 PUSH AX CALL JSJJ ;数据1与数据2根据YSF1进行加减运算 POP AX ; 结果保存在数据1中 MOV YSF1,AL ;保存新的运算符 JMP SZYS4SZYS5: MOV YSF2,AL ;保存运算符2 CALL LOADATE ;取数据3 MOV NUM3,AX MOV NUM3+2,DX CALL JSII2 ;数据2与数据3根据YSF2进行乘除运算 JMP SZYS4_1 ;结果保存在数据2中SZYS6: MOV CL,AL CMP AL,13 JNZ SZYS9SZYS7: CALL JSJG CMP JUV,0 JZ SZYS8 DEC JUV POP YSF POP NUM2+2 POP NUM2 POP NUM1+2 POP NUM1 RETSZYS8: CMP CL,')' JZ SZYS10 MOV JGV4,AX MOV JGV4+2,DX JNZ SZYS12SZYS9: CMP AL,')' JNZ SZYS11 INC SI JMP SZYS7SZYS10: MOV NUM1,AX MOV NUM1+2,DX JMP SZYS1SZYS11: STC RETSZYS12: CLC RET;数制处理UVIL LABEL NEAR PUSH SIUVIL1: LODSB CMP AL,' ' JZ UVIL2 CMP AL,9 JZ UVIL2 CMP AL,13 JZ UVIL4 JNZ UVIL1UVIL2: MOV BX,SI CALL OVERS JZ UVIL3 LODSW CALL OVERS POP SI JNZ SZYS11 CMP AX,'01' JNZ SZYS11 PUSH SI MOV UV,10UVIL3: MOV AL,13 MOV BX-1,ALUVIL4: POP SI CLC RET;预置结果YVJG LABEL NEAR MOV AH,52H INT 21H MOV AX,ES:BX-2 MOV DS,AX MOV AX,DS:0CH MOV CS:JGV4,AX MOV AX,DS:0EH MOV CS: