综合汇编程序设计资料.docx
《综合汇编程序设计资料.docx》由会员分享,可在线阅读,更多相关《综合汇编程序设计资料.docx(17页珍藏版)》请在冰豆网上搜索。
综合汇编程序设计资料
深圳大学实验报告
课程名称:
微机原理及应用实验
实验名称:
综合汇编程序设计
学院:
物理科学与技术学院
专业:
2012级应用物理
指导教师:
报告人:
学号:
实验时间:
2014年12月3日
实验报告提交时间:
2014年12月17日
一、实验目的
(1)综合运用所学的微机汇编语言程序设计的知识。
(2)进一步巩固在PC上建立、汇编、链接、调试和运行汇编语言程序的过程与方法。
二、实验要求
1.以1-2人为一组,自拟设计题目。
要求如下
(1)务必用到汇编程序设计中的分支、循环、子程序调用、宏和DOS功能调用;
(2)务必有合适的人机交互功能(如键盘输入、屏幕输出等);
(3)务必提前提交设计报告书(写明程序功能、总体设计思路与设计方案及分工等)。
如模拟计算器设计:
用键盘输入,可进行五位十进制以内的加减法、2位十进制以内的乘除运算。
再如电子钟或秒表,在屏幕显示时间,支持时间校准或设置记时起点、停止计时等功能等等。
三、实验内容
1.设计任务书
(1)程序功能:
输入不超过100个学生的成绩,按照分数高低分成A、B、C、D、F五个等级,依次对应的分数为90~100、80~89、70~79、60~69、0~59,屏幕分别输出5个等级的学生人数。
总体设计思路:
(2)调用DOS键盘输入功能获得不超过100个学生的成绩,每输入一个成绩就要回车换行,故要写一个回车换行的宏和一个输入子程序。
再判断一位学生的成绩处于哪个等级,进入相应的分支累加计数,使用循环结构对所有输入的成绩进行判断。
接着调用DOS屏幕输出功能输出每个等级的学生人数及总人数,因为要分成六次输出,故将输出写成子程序。
(3)设计方案及分工:
小组成员:
赖树文(负责主程序部分),林成业(负责宏,子程序和报告)
设计方案:
如简略流程图所示(注:
宏和子程序没有在流程图中标出)
是
是
否
否
是
是
是
否
否
是
2.汇编代码源文件及注释
CRLFMMACRO;空格宏程序
MOVAH,02
MOVDL,20H;调用DOS空格功能
INT21H
ENDM
CRLFM1MACRO;回车换行宏程序
MOVAH,02
MOVDL,0DH;调用DOS回车功能
INT21H
MOVAH,02
MOVDL,0AH;调用DOS换行功能
INT21H
ENDM
DATASEGMENT;定义数据段
TIPDB'pleaseinputgrades(lessthan100numbers),oneinput,oneenter,inputYorytoendinput',0DH,0AH,'$';开头提示
TIPNDB'total:
','$';输出提示
TIPADB'A:
','$';输出提示
TIPBDB'B:
','$';输出提示
TIPCDB'C:
','$';输出提示
TIPDDB'D:
','$';输出提示
TIPFDB'F:
','$';输出提示
N=101
STRDB4,0,3DUP(30H),0DH
DAT1DB3DUP(30H)
DAT2DB3DUP(30H)
GRADBNDUP(0)
NUMDB-1
NUMADB0
NUMBDB0
NUMCDB0
NUMDDB0
NUMFDB0
PYLDW0
DATAENDS
STACKSEGMENT;定义堆栈段
DB100DUP(0)
STACK_TOPDB0
STACKENDS
CODESEGMENT;代码段
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA;设置数据段、堆栈段
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVSP,OFFSETSTACK_TOP
;输出提示
LEADX,TIP
CALLOUTTIP
CRLFM
;调用输入子程序获得成绩
L1:
LEADX,STR
LEASI,STR
LEADI,DAT1
CALLINPUT
CRLFM
INCNUM;记录输入总个数
;判断是否输入Y和y来结束成绩输入
LEADI,STR
MOVAL,[DI+2]
CMPAL,'Y'
JEJUDGE
CMPAL,'y'
JEJUDGE
;将输入的数转化为十进制多位数存入GRA
LEADI,DAT1
MOVCL,[DI]
SUBCL,30H;将ASCALL码转化为数字
INCDI
MOVAL,[DI]
SUBAL,30H;将ASCALL码转化为数字
MOVBL,10
MULBL
ADDCL,AL
INCDI
MOVAL,[DI]
SUBAL,30H;将ASCALL码转化为数字
MOVBL,100
MULBL
ADDCL,AL
LEADI,GRA
ADDDI,PYL
MOV[DI],CL
INCPYL
JMPL1;不输入Y和y就继续从键盘读取数据
;用循环和分支结构判断等级
JUDGE:
CRLFM1
LEADI,GRA
MOVCL,NUM
MOVCH,0
L3:
MOVAL,[DI]
CMPAL,89
JADJA
CMPAL,79
JADJB
CMPAL,69
JADJC
CMPAL,59
JADJD
JMPDJF
DJA:
INCNUMA
JMPOVER
DJB:
INCNUMB
JMPOVER
DJC:
INCNUMC
JMPOVER
DJD:
INCNUMD
JMPOVER
DJF:
INCNUMF
OVER:
INCDI
LOOPL3
;输出结果
LEADX,TIPN
CALLOUTTIP
LEADI,DAT2
MOVAL,NUM
CALLTTOUT
LEADX,TIPA
CALLOUTTIP
LEADI,DAT2
MOVAL,NUMA
CALLTTOUT
LEADX,TIPB
CALLOUTTIP
LEADI,DAT2
MOVAL,NUMB
CALLTTOUT
LEADX,TIPC
CALLOUTTIP
LEADI,DAT2
MOVAL,NUMC
CALLTTOUT
LEADX,TIPD
CALLOUTTIP
LEADI,DAT2
MOVAL,NUMD
CALLTTOUT
LEADX,TIPF
CALLOUTTIP
LEADI,DAT2
MOVAL,NUMF
CALLTTOUT
MOVAH,4CH;返回DOS
INT21H
;输入子程序
INPUTPROCNEAR
MOVAH,0AH;调用DOS键盘输入功能
INT21H
MOVCL,[SI+1];获取指针地址,设置循环次数
MOVCH,0
MOVBX,CX
;由低到高位读入数字
L2:
MOVAL,[SI+BX+1]
MOV[DI],AL
DECSI
INCDI
LOOPL2
RET;返回主程序
INPUTENDP
;输出子程序
OUTTIPPROCNEAR
MOVAH,09H
INT21H
RET;返回主程序
OUTTIPENDP
OUTNUMPROCNEAR
LOUT:
MOVAH,02H
MOVDL,[SI]
INT21H
DECSI
LOOPLOUT
RET;返回主程序
OUTNUMENDP
TTOUTPROCNEAR
MOVAH,0
MOVBL,10
MOVCX,0
L4:
DIVBL
ADDAH,30H
MOV[DI],AH
MOVAH,0
INCDI
INCCX
CMPAL,0
JAL4
LEASI,DAT2
ADDSI,CX
DECSI
CALLOUTNUM
CRLFM1
RET
TTOUTENDP
CODEENDS;代码段结束
ENDSTART
四、实验结果
1.编译、连接生成可执行文件,调试该可执行文件。
2.输入数据获得结果
五、实验总结与体会
本次实验中,运用了汇编程序设计中的分支、循环、子程序调用、宏和DOS功能调用,
同时使用了合适的人机交互功能(如键盘输入、屏幕输出等)。
实现了“输入不超过100个学生的成绩,按照分数高低分成A、B、C、D、F五个等级,依次对应的分数为90~100、80~89、70~79、60~69、0~59,屏幕分别输出5个等级的学生人数。
”的功能。
实验过程中,我们先写好设计任务书,并按照任务是的要求和流程图分工编好程序,并一起将各部分程序结合起来,经调试修改最终实现预定功能。
我们强化了对汇编程序设计中分支、循环、子程序调用、宏和DOS功能调用的使用方法的理解,并学会用寄存器和指针在各部分程序之间传递数据。
由于编写各部分程序时有个别寄存器和指针没有区分清楚,以及个别子程序没有嵌套在合适的位置,使得最初调试时没有实现预定的结果,我们在多次梳理编写出的程序之后,找到以上的问题并顺利解决这些问题。