微接口课程设计报.docx
- 文档编号:29541197
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:16
- 大小:69.34KB
微接口课程设计报.docx
《微接口课程设计报.docx》由会员分享,可在线阅读,更多相关《微接口课程设计报.docx(16页珍藏版)》请在冰豆网上搜索。
微接口课程设计报
微机接口系统设计课程设计
报告
课程设计:
数字计算器的汇编语言实现
数字计算器的汇编语言实现
姓名:
学号:
班级:
自动化081
成绩:
指导教师:
罗松江
时间:
第4周
二O一一年制
一、课程设计的目的
本课程设计是一次程序设计方法及技能的基本训练,通过实际程序的开发及调试,巩固课堂上学到的关于程序设计的基本知识和基本方法,进一步熟悉汇编语言的结构特点和使用,达到能独立阅读、设计编写和调试具有一定规模的汇编程序的水平。
二、课程设计的任务
在设计过程中要遵循模块化、结构化的编程思路;程序必须正确运行;程序简明易懂,多标明注释,具有良好的程序书写风格;适当优化程序,提高程序的运行效率。
三、课程设计的内容
1.分析问题
根据题目要求,可以把程序的工作过程划分为运算表达式输入、计算、结果输出三部分。
因此在编写程序时可以按此把程序大致划分为三个模块。
该程序设计的关键是要根据四则运算中()、*、/、+、-、=的优先级设置符号的权值,其中(、*、/、+、-、)、=的权值分别设置为5、4、4、3、3、1、0,然后根据权值的大小进行运算。
程序使用数字标志SIGN1、括号标志SIGN2分别来判断数字是否输入完毕和括号是否配对,另外程序定义两个数据存储区域NUMB和MARK,其中NUMB用来保存输入的或运算的数值,MARK用来保存输入的符号及其对应的权值。
程序不断判断输入的符号是否是左括号‘(’,当遇到左括号是在存储区MARK保存其符号,紧跟着将‘(’的权值改为2并保存之,这是为了使程序运算括号内的表达式,当遇到右括号‘)’时括号内运算将结束。
需要注意的是程序执行完括号内表达式的运算及乘除运算后将在存储区MARK中覆盖符号(、)、*、/及紧跟着的权值,使得程序在运算整个四则运算表达式时当括号内表达式的运算及乘除运算结束后存储区MARK中只有‘+、-’运算符及紧跟着的权值,然后按照+、-运算符的左右顺序从左到右进行‘+、-’运算,当最后遇到等号‘=’时输出表达式的数值,然后再根据提示判断是否继续执行下一个四则运算表达式。
2.绘制流程图
画流程图如下所示:
开始
清屏
初始化首地址
是数字、符号还是=
输入字符
保存数值
SIGN+1
NUM_SIGN=0
设置符号权值
DI+2,NUM_SIGN=0
是否是‘(’
是否是‘)’
输出欢迎界面
SIGN=0
ERROR
=
N
是符号是数字
Y
YN
N
Y
NY
(SIGN)-1
(SI)=‘M’
(CH)>(SI)
是否是等号
是否是‘)’
SI+1
(SI)=AL
SI+1
是否是‘(’
(SI)=(CH)
(SI)=‘(’
SI-1
SI-1
(CH)=2
CL=(SI)
是何种运算
进行相应的运算
输出表达式的值
显示是否继续
输入字符
初始化首地址
Y
N
YN
Y
NNY
Y
N
Y
N
N
Y
3.编写程序
DATASSEGMENT
STRDB0AH,0DH,'PleaseinputNumber0~9orSymber+-*/(),andinput=togetresult:
$'
MSGDB0AH,0DH,'Doyouwanttocontinue?
(y/n)$'
NUM_SIGNDW0;判断数字是否输入完毕
SIGNDW0;判断括号是否配对
NUMBDW20DUP(0);保存输入的数值
MARKDB'M';保存输入的运算符
DB10DUP(0)
ERRORDB'YOURINPUTISWRONG$'
DATASENDS
DISPMACROSTR
LEADX,STR
MOVAH,9
INT21H
ENDM
CHOICEMACROASC,HAO,H;宏定义,给运算符赋权值
CMPAL,ASC
JNEOTH&HAO
MOVCH,H
JMPOTH7
ENDM
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
CALLCLEAR
MOVAX,DATAS
MOVDS,AX
LEADI,NUMB;使DI指向NUMB
LEASI,MARK;使SI指向MARK
DISPSTR
CALLCR
MOVAX,0
MOVBX,0
MOVCX,0
MOVDX,0
START1:
CALLCR
INPUT:
MOVAH,1;从键盘输入一个字符
INT21H
CMPAL,'='
JEPD;是等号,进一步判断输入括号是否配对
CMPAL,28H;小于28H
JBINPUT
CMPAL,39H;大于39H
JAINPUT
CMPAL,2FH;判断是数字还是符号,是否小于30H
JBEJUD;是符号,进行相应处理
INCWORDPTRNUM_SIGN;是数值进行相应处理;将数字标志位加1
SUBAL,30H;数值的补码转换
MOVAH,0
XCHGAX,[DI]
MOVBX,10
MULBX
XCHGAX,[DI]
ADD[DI],AX;结果作为新值存入DI
JMPINPUT
PD:
CMPWORDPTRSIGN,0;判断配对标志位
JEJUD;SIGN=0进入符号处理
JMPBC
JUD:
CMPWORDPTRNUM_SIGN,0;判断NUM_SIGN是否为0,
JEFUH
ADDDI,2
MOVWORDPTRNUM_SIGN,0;将数字标志位复0
FUH:
CALLADVANCE;设定优先级,采用动态确定法
CMPCH,5;判断输入的符号是否是左括号
JNEPY;不是则判断输入的是否是右括号
INCWORDPTRSIGN;是左括号,括号标志位加1
PY:
CMPCH,1;判断输入的是否是右括号
JNEAGAIN
DECWORDPTRSIGN;是右括号,括号标志位减1
AGAIN:
CMPBYTEPTR[SI],'M';判断运算符存储区是否为空
JESAVE
CMPCH,[SI];[SI]的内容为前一个符号或其权值
JASAVE;高于转入判断是否是=
CMPBYTEPTR[SI],'('
JNEYIDO
DECSI
JMPINPUT
YIDO:
DECSI
MOVCL,[SI]
CALLMATCH;判断是什么运算符并进行相应的计算
JMPAGAIN
SAVE:
CMPCH,0;判断是否是等号
JEOUTPUT
CMPCH,1
JEINPUT;“)”不保存,输入下一个数
INCSI
MOV[SI],AL;保存符号
INCSI
CMPCH,5;判断是否是左括号
JNEGO_ON
MOVCH,2;改变“(”的权值
GO_ON:
MOV[SI],CH;紧跟着保存符号的权值
JMPINPUT
BC:
LEADX,ERROR
MOVAH,9
INT21H
JMPJ_SHU
MATCHPROCNEAR;子程序,进行相应的运算
PUSHAX
XORAX,AX;清零,使CF=0
XORBX,BX
CMPCL,2AH;乘法运算
JNENEXT1
SUBDI,2
XCHGBX,[DI]
SUBDI,2
XCHGAX,[DI]
IMULBX
MOV[DI],AX
ADDDI,2
JMPFINISH
NEXT1:
CMPCL,2FH;除法运算
JNENEXT2
SUBDI,2
XCHGBX,[DI]
SUBDI,2
XCHGAX,[DI]
CWD
IDIVBX
MOV[DI],AX
ADDDI,2
JMPFINISH
NEXT2:
CMPCL,2BH;加法运算
JNENEXT3
SUBDI,2
XCHGBX,[DI]
SUBDI,2
ADD[DI],BX
ADDDI,2
JMPFINISH
NEXT3:
CMPCL,2DH;减法运算
JNEFINISH
SUBDI,2
XCHGBX,[DI]
SUBDI,2
SUB[DI],BX
ADDDI,2
FINISH:
POPAX
RET
MATCHENDP
ADVANCEPROC
CHOICE28H,1,5;(
OTH1:
CHOICE29H,2,1;)
OTH2:
CHOICE2AH,3,4;*
OTH3:
CHOICE2FH,4,4;/
OTH4:
CHOICE2BH,5,3;+
OTH5:
CHOICE2DH,6,3;-
OTH6:
CHOICE3DH,7,0;=
OTH7:
RET
ADVANCEENDP
CLEARPROCNEAR;清屏
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAX,0600H
MOVBH,0FH
MOVCX,0
MOVDX,184FH
INT10H
POPAX
POPBX
POPCX
POPDX
RET
CLEARENDP
CRPROCNEAR;回车换行
PUSHAX
PUSHDX
MOVAH,2
MOVDL,0DH
INT21H
MOVAH,2
MOVDL,0AH
INT21H
POPDX
POPAX
RET
CRENDP
OUTPUT:
;输出运算结果
SUBDI,2
CMPWORDPTR[DI],0;两个有符号的数比较,
JGEW1;正数则转移
NEGWORDPTR[DI];对结果求补
MOVDL,'-'
MOVAH,2
INT21H
W1:
MOVBX,10000;采用最高位除法
MOVCX,5
MOVSI,0
W2:
MOVAX,[DI]
CWD
DIVBX
MOV[DI],DX
CMPAL,0
JNEW3
CMPSI,0
JNEW3
CMPCX,1
JEW3
JMPW4
W3:
MOVDL,AL
ADDDL,30H
MOVAH,2
INT21H
MOVSI,1
W4:
MOVAX,BX;指数减1
MOVDX,0
MOVBX,10
DIVBX
MOVBX,AX
LOOPW2
CALLCR
DISPMSG
MOVAH,1
INT21H
CMPAL,'n'
JEJ_SHU
CMPAL,'N'
JEJ_SHU
MOVWORDPTR[DI+2],0
CALLCR
LEADI,NUMB
LEASI,MARK
JMPSTART1
J_SHU:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
4.检查和调试
经过多次调试终于调试成功,程序运行如下图所示:
四、心得体会
经过一个学期的学习,我也慢慢摸出了汇编学习的规律。
首先,学习这门语言时如果能联系上以前学过的其他高级语言的知识,则会起到良好的效果。
例如C语言程序的运行逻辑结构有顺序(按语句依次执行)、分支结构(IF...THEN...ELSE...),循环结构(FOR...NEXT)三种结构,也通过C语言了解并掌握了什么是子程序,什么是调用。
事实上,汇编语言中有关程序结构,子程序等等的知识都是跟C语言十分相似的,只是在编程时用到的语言不同:
汇编语言完全面向机器,需要指明数据在寄存器、内存中的流向。
第二,学习汇编语言,首要问题是学习80X86指令系统。
如果能将指令系统中的各个助记符、格式等都能完全掌握并灵活运用,大部分工作就已经完成了。
指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。
如果不熟悉汇编指令的功能及其有关规定,那肯定不能灵活使用汇编语言。
指令的种类十分繁杂,但其格式却是统一的。
指令格式如下:
指令助记符[操作数1[,操作数2]][;注释]
其中方括号中的内容为可选项。
指令助记符决定了指令的功能,对应一条二进制编码的机器指令。
指令的操作数个数由该指令确定,可以没有操作数,也可以有一个或多个操作数,大多数指令要显示写出来,还有些操作数是隐含的。
现在简单总结汇编语言指令的分类:
1、数据传送指令;2、标志位操作指令;3、算术运算指令;4、逻辑运算指令;5、移位运算指令;6、位操作指令;7、比较运算指令;8、循环指令;9、转移指令;10、条件设置字节指令;11、字符串操作指令;12、BCD码运算调整指令;13、处理器指令。
汇编语言的寻址方式有直接寻址,寄存器寻址,基址变址寻址,相对基址变址寻址等等,掌握这些都是编写汇编程序很重要的环节。
用汇编语言编写四则运算体会:
编写计算简单的不带括号的没有优先级的+、-或*、/、运算程序还是不太难的,因为没有优先级程序只要根据表达式运算符的顺序从左到右进行运算,最后输出结果。
而该课程设计要求设计能进行带括号的+、-或*、/、混合运算的四则运算程序,难度明显加大了,这样程序设计时要用设定权值的办法来设置符号的优先级,使得程序运行时可根据权值大小进行运算,因此程序编写的难点也就在对优先级的判断上。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 接口 课程设计