汇编简单计算器设计课设.doc_第1页
汇编简单计算器设计课设.doc_第2页
汇编简单计算器设计课设.doc_第3页
汇编简单计算器设计课设.doc_第4页
汇编简单计算器设计课设.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中 北 大 学课程设计任务书10/11学年第 二 学期学 院:信息与通信工程学院专 业:自动化学 生 姓 名:张欣宇学 号:0805054116课程设计题目:简单计算器设计 起 迄 日 期:2011年6 月20日2011年6月24日课程设计地点:中北大学指 导 教 师:张艳兵、张秀艳系主任:王忠庆下达任务书日期: 2011 年 6 月 19日课 程 设 计 任 务 书1设计目的:用汇编语言编程设计一个简单的计算器,实现两个运算数的键盘输入和加减乘除运算,并显示运算结果。通过设计,掌握键盘输入、屏幕显示和算术运算指令的应用,进一步提高综合运用知识的能力。2设计内容和要求(包括原始数据、技术参数、条件、设计要求等):(1) 要求键盘输入2位十进制数,进行加减乘除运算,并在屏幕上显示出运算结果。(2) 选择方案,画出流程图。(3) 编写汇编语言源程序,并调试。(4) 写出设计说明书。3. 设计工作任务及工作量的要求(1) 查阅资料,确定设计方案对任意给定的正确四则运算表达式,能按照括号、加减乘除计算的优先级,正确计算其结果值并输出。且能计算的正确数据范围为16位无符号数,即结果只能在065535之间,否则错误。(2) 画出程序流程图(3) 编写并调试汇编语言源程序 (4)撰写课程设计说明书(5)心得体会4主要参考文献:1 汇编语言清华大学出版社 王爽编 2ibm-pc汇编语言程序设计清华大学出版社5.设计成果形式及要求:课程设计说明书1份 程序流程图1份 程序清单1份6工作计划及进度:起 迄 日 期工 作 内 容11年6月20日 6月21 日6月 21日 6月22日6月22日 6月23 日6月 23日 6月24日6 月24日 查阅资料,确定设计方案画出流程图编写并调试程序撰写课程设计说明书课程设计答辩系主任审查意见: 签字: 年 月 日中北大学汇编原理课程设计说明书学生姓名: 张欣宇学 号:0805054116学 院:信息与通信工程学院专 业:自动化题 目: 键盘和显示器设计 指导老师张艳兵职称讲师 2011 年6 月24日设计目的:用汇编语言编程设计一个简单的计算器,实现两个运算数的键盘输入和加减乘除运算,并显示运算结果。通过设计,掌握键盘输入、屏幕显示和算术运算指令的应用,进一步提高综合运用知识的能力。设计要求:(1) 要求键盘输入2位十进制数,进行加减乘除运算,并在屏幕上显示出运算结果。(2) 选择方案,画出流程图。编写汇编语言源程序,并调试、写出设计说明书。设计过程:在dos下进入masm的目录,用masm程序将编辑好的asm文件编译输出目标文件obj文件,用link程序把obj文件连接生成exe文件后,直接运行该可执行文件进入该程序的界面,提示输入正确的表达式,以等号结束,程序给出正确的结果。输入的表达式中只能含有加减乘除及数字括号,最后以等号结束,如果输入其它字符,程序会给出相应的提示信息此程序计算的结果范围最大为65535,所以当输入的数值计算结果超出范围时,结果溢出,给出的结果不正确。程序中可连续输入表示计算,按esc键退出,返回dos。程序无需查错功能,所输入的都是正确的四则运算表达式,并且表达式中运算分量均为无正负号整数,运算符为+、-、*、/,表达式以字符=结束。根据要求,首先需要从dos界面输入用户的四则混合表达式,其中包括括号(或),数字,运算符+,-,*,/。因为用户从键盘输入的是ascii码,因些需要做相应的转换。例如将字符串123转化为十进制的值123。其次,需要对(,),+,-,*,/的优先级进行判断。(3)子程序流程:子过程详细说明 1、 compare子函数 用于判断键盘输入的符号是否合法,若合法,则在屏幕上显示,否则报错2、 mult子函数 用于对输入的数字进行乘10累加操作,以便将连续输入的数字字符串转换为相对应的数值3、trans子函数 核心算法,将输入的中缀表达式转换为后缀表达式4、value子函数 核心算法,将后缀表达式结合堆栈结构进行表达式求值5、divi子函数 辅助子过程,通过除以10以及进一步处理将某数值转换为相应的ascii字符串 按照个十百位6、 print子过程 配合divi子过程,将表达式求值结果输出到屏幕上用到中断向量表 如图所示程序:stack segment para stack dw 256 dup(0) stack ends data segment stri db 50 dup(0) exp db 30 dup(0) track db 30 dup(0) instr db 100 dup(0) msg0 db input :,0dh,0ah,$ msg1 db 0dh,0ah,wrong,$ msg2 db 0dh,0ah,( and ) does not match,$ msg3 db 0dh,0ah,div by zero error,$ msg4 db 0dh,0ah,fushu,$ msg5 db 0dh,0ah,any key to continue,esc to exit,$ data ends code segment assume cs:code,ss:stack,ds:data start: mov ax,stack mov ss,ax mov ax,data mov ds,ax mov dx,offset msg0 mov ah,9 int 21h xor ax,ax ;read mov bx,offset instr mov dl,20h jmp l2 compare proc near cmp al,0dh jz l2 mov dl,al mov ah,2 int 21h ret compare endp l2: mov ah,8 int 21h call compare cmp al,3dh ;end with = jz l2_over mov ah,39h cmp ah,al ;del the wrong data ( 9 ) jnb conti mov ah,2 mov dl,8 int 21h mov dl,20h int 21h mov dl,8 int 21h jmp l2 conti: cmp al,28h ;( jz l2_yes cmp al,29h jz l2_yes ;) cmp al,2ah ;* jz l2_yes cmp al,2bh ; + jz l2_yes cmp al,2dh ; - jz l2_yes cmp al,2fh ; / jz l2_yes ; back function - cmp al,08h jnz no_8 l2_next: push dx mov dl,20h mov ah,2 int 21h mov dl,8 mov ah,2 int 21h cmp bx,offset instr jz l2 dec bx mov al,0 mov bx,al pop dx jmp l2 ; no_8: mov ah,2fh cmp ah,al ;del the wrong data ( 0 ) jb l2_yes mov ah,2 mov dl,8 int 21h mov dl,20h int 21h mov dl,8 int 21h jmp l2 l2_yes: mov dh,dl mov dl,al cmp dl,20h jnz l2_no20 cmp dh,20h jz l2 l2_no20: mov bx,al inc bx jmp l2 l2_over: mov ah,3dh mov bx,ah;check input mov si,offset instr mov ah,30h mov ch,0 ;record ( ) mov cl,0 l3: mov al,si inc si cmp al,3dh jz l3_over cmp al,2ah jnb may_wrong cmp al,29h jz l3_29 inc ch jmp l3_right l3_29: inc cl jmp l3_right may_wrong: cmp al,30h jnb l3_right cmp al,28h jz l3_right cmp ah,29h jz l3_right ;cmp ah,28h ;jz l3_right cmp ah,30h jnb l3_right mov dx,offset msg1 mov ah,9 int 21h jmp over3 l3_right: mov ah,al jmp l3 l3_over: cmp ch,cl jz input_wright mov dx,offset msg2 mov ah,9 int 21h jmp over3 ; ;chech over input_wright: mov bx,offset stri mov si,offset instr ;read read: ;mov ah,1 ;int 21h mov al,si ;reserve the data by decimaltest inc si mov ah,28h ;( cmp ah,al jz in_stri mov ah,29h ;) cmp ah,al jz in_stri mov ah,2ah ;* cmp ah,al jz in_stri mov ah,2bh ;+ cmp ah,al jz in_stri mov ah,2dh ;- cmp ah,al jz in_stri mov ah,2fh ;/ cmp ah,al jz in_stri mov ah,2fh ;delete the wrong input cmp ah,al jnb read mov ah,3dh ;= cmp ah,al jz in_stri mov ah,39h ;delete the wrong input cmp ah,al jb read call near ptr mult jmp read ; the end of reserve ; in_stri: mov ah,0 cmp ah,bx jz no_bx ;inc bx inc bx no_bx: mov bx,al mov ah,3dh cmp ah,al jnz no_over sub al,25 ;transplant = to $ mov bx,al jmp over no_over: jmp read mult proc near ;mult data*10,add up push dx push cx push ax mov ah,0 cmp bx,ah jz no_inc_bx mov ah,30h cmp bx,ah jnb no_inc_bx inc bx no_inc_bx: mov dx,0 mov cx,10 mov ah,bx cmp ah,30h jb no_sub sub ah,30h no_sub: mov bx,ah next: add dx,bx loop next sub al,30h ;tras to decimal add dl,al mov bx,dl mov ah,bx add ah,30h mov bx,ah pop ax pop cx pop dx ret mult endp ; ;end of read over: call near ptr trans ;the outlet of the program over1: call near ptr value ;jmp instead of ret in procedure trans over2: call near ptr print over3: mov ah,9 mov dx,offset msg5 int 21h mov ah,8 int 21h cmp al,1bh jz over4 mov cx,210 mov bx,offset stri mov al,0 over_loop: mov bx,al inc bx loop over_loop mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h jmp start over4: mov ah,4ch int 21h ; ;trans trans proc near ; push ax push bx push cx push dx push si push di xor cx,cx mov bx,offset stri mov si,offset exp mov di,offset track trans_while: mov al,bx inc bx mov ah,24h ;$ cmp ah,al jz trans_over ;end with = mov ah,2fh ;judge l digital cmp ah,al jnb no_digital mov si,al inc si jmp trans_while no_digital: mov ah,28h ;judge l ( cmp ah,al jnz no_9 mov di,al ;push al inc di jmp trans_while no_9: mov ah,29h ;judge l ) cmp ah,al jnz no_0 pop_while: dec di mov al,di ; pop al mov ah,28h cmp ah,al jz over_pop_while mov si,al inc si jmp pop_while over_pop_while: ;mov al,dl jmp trans_while no_0: mov ah,2bh cmp ah,al jz or1_yes mov ah,2dh cmp ah,al ;if al is + or - jnz no_or1 or1_yes: cmp di,offset track ;jmp if stack is blank jz stack_blank dec di ;pop al mov cl,di mov ah,28h cmp ah,cl jz over_or1_yes mov si,cl inc si jmp or1_yes over_or1_yes: mov di,cl inc di ;reserve the ) stack_blank: mov di,al ;push al inc di jmp trans_while no_or1: mov ah,2ah cmp ah,al jz or2_yes mov ah,2fh cmp ah,al jnz no_or2 ;if al is * or / or2_yes: dec di ;push dl mov cl,di mov ah,2ah cmp ah,cl jz or2_yes_or mov ah,2fh cmp ah,cl jnz or2_over or2_yes_or: mov si,cl inc si jmp or2_yes or2_over: mov di,cl inc di ;push al mov di,al inc di no_or2: ;mov al,bx ;inc bx ; jmp trans_while trans_over: cmp di,offset track jz pop_over dec di mov al,di mov si,al inc si jmp trans_over pop_over: mov al,24h ;end with = mov si,al pop di pop si pop dx pop cx pop bx pop ax jmp over1 trans endp ; end of trans ;start value value proc near ;get the value push ax push bx push cx push dx push si mov bx,offset exp mov si,offset track xor ax,ax value_while: mov al,bx inc bx mov ah,24h cmp ah,al jz value_over mov ah,2fh ;judge l digital cmp ah,al jnb value_no_digital sub al,30h mov si,al inc si jmp value_while value_no_digital: mov ah,2bh ;+ cmp ah,al jnz no_add dec si mov dl,si dec si mov dh,si add dh,dl mov si,dh inc si jmp value_while no_add: mov ah,2dh ;- cmp ah,al jnz value_no_sub dec si mov dl,si dec si mov dh,si cmp dh,dl jnb sub_right mov dx,offset msg4 mov ah,9 int 21h jmp over3 sub_right: sub dh,dl mov si,dh inc si jmp value_while value_no_sub: mov ah,2ah ;* cmp ah,al jnz no_mul dec si mov dh,si dec si mov al,si mul dh mov si,al inc si jmp value_while no_mul: mov ah,2fh ;/ cmp ah,al jnz no_div dec si mov dh,si dec si mov al,si xor ah,ah cmp dh,0 jnz div_right mov dx,offset msg3 mov ah,9 int 21h jmp over3 div_right: di

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论