微机原理课程设报告.docx
- 文档编号:26830824
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:21
- 大小:151.56KB
微机原理课程设报告.docx
《微机原理课程设报告.docx》由会员分享,可在线阅读,更多相关《微机原理课程设报告.docx(21页珍藏版)》请在冰豆网上搜索。
微机原理课程设报告
微机原理课程设计
设计报告
一、设计目的
1、对微机原理课程中所学的理论知识进行进一步巩固和加深。
2、学会查阅相关手册与资料,培养独立分析与解决问题的能力。
3、学会使用屏幕编辑程序—MASM对汇编程序的编写,调试和运行。
4、了解对系统中DOS和BIOS的使用,弄懂汇编程序的上机过程以及如何运用DEBUG软件进行汇编程序的调试。
二、设计内容
本次为期一周的课程设计,主要编写调试了5个程序,题目如下:
1、字符串匹配设计
为掌握提示信息的设置方法及读取键入信息的方法。
编写程序实现两个字符串比较。
如
相同,则显示“MATCH”,否则,则显示“NOMATCH”。
2、从键盘上输出数据并显示
为掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII码的原理。
编写程序,将键盘接收到的四位十六进制数据转换为等值的二进制数,再显示在终端上。
3、字符和数据的显示设计
为掌握字符和数据的显示方法,编写程序,先显示信息:
INPUTSTRING,THEENDFLAGIS$,再接收字符。
如为0-9,则计数器加1,并显示数据;如为非数字,则直接显示,但不计数
4、学生成绩名次表设计
为进一步熟悉排序方法。
编写程序,将0-100之间的30个成绩存入首址为1000H的存储区中。
1000H+i表示学号为i的学生成绩。
编写程序使得在2000H开始的区域排除名次表。
2000H+i为学号i的学生的名次。
三、具体设计
程序设计一:
字符串匹配设计
为掌握提示信息的设置方法及读取键入信息的方法。
编写程序实现两个字符串比较。
如相同,则显示“MATCH”,否则,则显示“NOMATCH”。
流程图
程序
datasegment
dat1db'inputstring1:
','$';$保持当前地址
dat2db'inputstring2:
','$'
dat3db'MATCH!
',0ah,0dh,'$';0DH为回车ASCII码,0AH为换行ASCII码
dat4db'NOTMATCH!
',0ah,0dh,'$'
string1db50;最长长度
db?
;实际长度
db50dup(?
);存储空间
string2db50
db?
db50dup(?
)
dataends
codesegment
assumecs:
code,ds:
data,es:
data
start:
movax,data;数据段设置
movds,ax
moves,ax
movah,09h;字符串显示,显示dat1,显示DS:
DX
movdx,offsetdat1
int21h
movah,0ah;字符串缓冲输入,接收输入字符串
movdx,offsetstring1
int21h
MOVDL,0AH;输出换行
MOVAH,02H
INT21H
movah,09h
movdx,offsetdat2;显示DAT2
int21h
movah,0ah
movdx,offsetstring2
int21h
MOVDL,0AH;输出换行
MOVAH,02H
INT21H
leasi,string1;比较
leadi,string2
addsi,2;串1首字符[SI+2]
adddi,2;串2首字符[DI+2]
cld;df=0
movcx,50
repzcmpsb;CX≠0或ZF=1时重复,DS:
SI和ES:
DI所指的两个字节相同则继续比较,如果比较相等,ZF=1,则继续比较下一个字节,DI和SI分别加1(DF=0时),CX-1
jzmatch
nmatch:
movah,09h
movdx,offsetdat4;输出不匹配
int21h
jmpnext
match:
movah,09h
movdx,offsetdat3;输出匹配
int21h
next:
movah,4ch
int21h
codeends
endstarT
小结
在设计过程中,我把程序分成了宏定义显示回车,数据段定义,初始化,开始比较,匹配时再比较,不匹配时SI指向串1首字符,DI指向新字符重新开始比较等模块。
且运用指令REPZCMPSB进行字符串比较处理,设计的过程中要注意很多细节,如初始化时调用INT21H的0A号功能接收字符串,要注意缓冲区的第一个字节存放最大字符数,第二个字节存放实际字符数。
本次设计让我对DOS功能条用与字符串指令有了更深的了解与认识。
程序设计二:
从键盘上输出数据并显示
为掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII码的原理。
编写程序,将键盘接收到的四位十六进制数据转换为等值的二进制数,再显示在终端上。
流程图:
程序
datasegment
string1db'Pleaseinputanumber(suchas:
1234):
',13,10,'$'
bufferlabelbyte;定义一个buffer,接受字符串,LABEL定义变量类型
MAXdb5;在MAX中存入最多接受长度(以回车结束,包括回车),若超过长度,响铃提示,不再接受
acldb?
;acl中存入实际输入的字符串长度,以回车结束,包括回车.
buferdb5dup(?
);实际接受的字符串存在以bufer开始的地址中.
string2db'Theresultis:
',13,10,'$'
dataends
stackareasegment
db20dup(?
)
stackareaends
codesegment
mainprocfar
assumecs:
code,ds:
data,ss:
stackarea
start:
movax,data;输出string1
movds,ax
leadx,string1
movah,09H;输出DS:
DX的字符串
int21H;输出第一行字,回车(13)换行(10)
leadx,buffer
movah,0ah;字符串缓冲输入
int21h
movdl,0ah;输入换行,以免输入数据被string2覆盖
movah,02h
int21h;输出string2
leadx,string2
movah,09H
int21H;输出第二行字
movsi,0
loop1:
movcx,04h
movbl,bufer[si]
moval,bl
incsi
cmpal,40h;判断字符是否属于0-9对应的字符串为30~39H
jbnext;低于则转移
subal,27h;A~E转换到对应的10~15
next:
subal,30h;将ASCII码的值转换成对应的十六进制数
movbl,al
dplay:
movah,02h;开始显示一个字符,字符在DL里(0、1)
movdl,'0'
testal,00001000b;test指令:
结果不送到目的寄存器的与操作,用于判断高字节是否为0,>7?
jzzero
movdl,'1';第四位等于1输出1(>7)
zero:
int21h;第四位等于0输出0(<8)
moval,bl
shlal,1
movbl,al;BL内容循环左移一位
loopdplay;用循环显示一个字符,共循环四次,CX=0截止
movdl,20h;显示空格(20H)
movah,02h
int21h;显示空格结束
cmpsi,04
jneloop1;一共四个数
movdl,'b';单位”B”
movah,02h
int21h
movah,4ch;结束
int21h
ret
mainendp
codeends
endstart
小结
此次设计功能是实现十六进制转换为二进制,分为初始化,接受键入值,计数值16赋给CX,BX内容循环左移一位,屏蔽DL高七位,DL加30H,变为二进制对应的ASCII码,显示,CX减一,继续循环,返回DOS。
此次的核心执行是将BX内容循环左移1位,再进行比较,最后输出结果。
这次设计让我更深入认识了循环指令和移位指令,让我受益匪浅。
程序设计三、字符和数据的显示设计
为掌握字符和数据的显示方法,编写程序,先显示信息:
INPUTSTRING,THEENDFLAGIS$,再接收字符。
如为0-9,则计数器加1,并显示数据;如为非数字,则直接显示,但不计数。
流程图:
程序
DATASSEGMENT
DATA1DB40DUP(?
)
DISPP1DB'INPUTSTRING,THEENDFLAGIS$',0DH,0AH,'$'
DISPP2DB0DH,0AH,'$'
DISPP3DB'THEINPUTSTRINGIS','$';此处输入数据段代码
DATASENDS
STACKSSEGMENT;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,00H
MOVCL,0
MOVBX,OFFSETDATA1
LEADX,DISPP1
MOVAH,9
INT21H;输出DISSP1
L1:
MOVAH,1
INT21H;带回显的键盘输出,检测ctrl+break
CMPAL,03H;ETX-正文结束,跳到L4
JZL4
CMPAL,0DH;回车键跳转L3
JZL3
MOV[BX+SI],AL
INCSI
CMPAL,30H;高于’0’跳转KK
JNBKK
JMPL1
KK:
CMPAL,39H;低于’9’跳转L2
JNAL2
JMPL1
L2:
INCCL;是数字0~9则CX加一
JMPL1
L3:
LEADX,DISPP2
MOVAH,9
INT21H;输出DISSP2,回车换行
LEADX,DISPP3
MOVAH,9
INT21H;输出DISSP3
ADDCL,30H
MOV[BX+SI+1],CL;输出CL(字符形式)
MOVAL,0AH
MOV[BX+SI+2],AL;输出换行
MOVAL,'$'
MOV[BX+SI+3],AL
MOVDX,BX
MOVAH,9
INT21H;此处输入代码段代码
L4:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
小结
此次设计为字符和数据显示设计,将其分为初始化,计数器清零,显示提示信息,INT21H的01H功能接受键入字符,判断字符,进行循环,显示结果,调用DISP显示计数结果,返回DOS。
此次设计用到了INT21H的01H功能,是带回显的键盘输入,程序的核心为检测字符并循环操作。
通过本次设计,让我更深入了解了DOS功能调用与祖父数据显示功能的具体设计,是我受益颇深。
程序设计四:
学生成绩名次表设计
为进一步熟悉排序方法。
编写程序,将0-100之间的30个成绩存入首址为1000H的存储区中。
1000H+i表示学号为i的学生成绩。
编写程序使得在2000H开始的区域排除名次表。
2000H+i为学号i的学生的名次。
流程图:
成绩名次表主程序流程图SCAN子程序流程图
程序:
CRLFMACRO;宏定义,回车换行
MOVAH,02H
MOVDL,0DH
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
ENDM
DATASEGMENT
STUNUMEQU30;学生数
MESS1DB'Pleaseinput30score:
',0DH,0AH,'$';提示信息
ERRORDB'Inputerror,tryagain',0DH,0AH,'$';报错信息
MESS2DB'Theorderis:
',0DH,0AH,'$'
EMARKDB?
;报错标志
ORG1000H;存放成绩地址
SCOREDB30DUP(?
);成绩表
ORG2000H;存放名次地址
SEQUDB30DUP(?
);名次表
DATAENDS
STACKSEGMENT;堆栈段定义
STADW32DUP(?
)
TOPDW?
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVSP,TOP
MOVAH,09H;显示提示信息
MOVDX,OFFSETMESS1
INT21H
MOVSI,OFFSETSCORE;成绩表首址
MOVCX,STUNUM;30人
MOVEMARK,0;报错标志清0
UUU:
CALLGETNUM;调用子函数读取成绩
CMPEMARK,01H;判断是否出错
JESTART;出错则重新开始
MOV[SI],DL;没出错则存入成绩
INCSI;指向下一个成绩单元地址
LOOPUUU;判断30个成绩是否读取完
MOVCX,STUNUM
MOVDI,OFFSETSEQU;名次表首址
VVV:
CALLSCAN;调用扫描子程序
MOVAL,STUNUM;学生总数
SUBAL,CL;计算名次
INCAL
MOVBX,DX;学号
PUSHAX;将名次转换成压缩BCD码方便显示
PUSHBX
PUSHCX
XORAH,AH;AH清零
MOVBH,0AH
DIVBH;被除数是AX
MOVCL,4
SHLAL,CL;AL左移四位
ADDAL,AH
MOVDH,AL
POPCX
POPBX
POPAX
MOV[DI+BX],DH;存入名次
LOOPVVV;判断是否存完
MOVAH,09H;显示名次提示信息
LEADX,MESS2
INT21H
MOVCX,STUNUM
MOVSI,OFFSETSEQU
WWW:
MOVAL,[SI]
CALLDISPI;调用子函数显示名次
PUSHDX
PUSHAX
MOVAH,02;显示空格
MOVDL,20H
INT21H
POPAX
POPDX
INCSI;指向名次表的下一个地址
LOOPWWW;判断是否输出所有名次
MOVAH,4CH;返回DOS
INT21H
SCANPROCNEAR;扫面子函数,每调用一遍,找出成绩表
;中最高成绩,记录其学号,并将此成绩
;清0
PUSHCX
MOVCX,STUNUM
MOVAL,00H
MOVBX,OFFSETSCORE
MOVSI,BX
CCC:
CMPAL,[SI];实现选出最高成绩
JAEJJJ;≥0则跳转
MOVAL,[SI];最高成绩存入AL
MOVDX,SI
SUBDX,BX
JJJ:
INCSI
LOOPCCC
ADDBX,DX
MOVBYTEPTR[BX],00H;成绩清零
POPCX
RET
SCANENDP
DISPIPROCNEAR;显示子程序
PUSHCX
MOVBL,AL;显示高4位
MOVDL,BL
MOVCL,04
ROLDL,CL
ANDDL,0FH
CALLDISPL
MOVDL,BL;显示低4位
ANDDL,0FH
CALLDISPL
POPCX
RET
DISPIENDP
DISPLPROCNEAR;将名次转换成对应的ASCII码值并显示
ADDDL,30H
MOVAH,02H
INT21H
RET
DISPLENDP
GETNUMPROCNEAR;读取成绩子函数
PUSHCX
XORDX,DX;清0,用于存放成绩
GGG:
MOVAH,01H
INT21H;键盘字符输入
CMPAL,0DH
JZRRR;如果是回车则结束
SUBAL,30H
JBERR;小于0则报错
CMPAL,09H
JBEGETS;如果在0—9之间则存成绩至DX
JMPERR;否则报错
GETS:
MOVCL,04
SHLDX,CL;将DX中已有数值左移四位
XORAH,AH
ADDDX,AX;紧接着将数据存在DX中低四位
JMPGGG;跳转继续读取数据
ERR:
MOVAH,09H;显示报错信息
MOVDX,OFFSETERROR
INT21H
MOVEMARK,01H;报错标志置1
RRR:
PUSHDX
CRLF;回车换行
POPDX
POPCX
RET
GETNUMENDP
CODEENDS
ENDSTART
小结
本次设计的是学生成绩名次表,首先将其分为主程序和子程序,主程序分为初始化,显示输出,SI指向成绩表首址,调程序度学生成绩送[SI]中,CX为0判断循环,DI指向名次表首址,调子程序扫描成绩表,计算名次,填入DX学号对应名次表单元,返回DOS。
子程序则分为CX入栈保存,AL中放最低成绩00H,BX,SI指向成绩表首址,AL≥[SI]?
,指向下一个单元,CX减一判断循环,将成绩最高者清零,CX出栈,返回。
这次循环用了子程序调用CALL指令,其核心在于调用子程序进行循环计算名次。
这次设计让我对调用指令及程序间的应用有了更深入的了解和认识,相信在今后的学习中会应用到。
四、心得体会
为期一周的微机课程设计让我学到了很多,感触也很多。
这门课程,需要我们深入的去思考,去学习查资料,我在这一周的时间里收获也是很大的,对汇编语言由略知皮毛到能运用它独立做一些小程序。
这种技能都是课堂上学不到的,但对未来却有很大的帮助。
当我面对一个难题,从一筹莫展到逐渐清晰明朗,调试调试再调试,而后最终完成任务。
只有亲身经历过,才能感受其中的艰辛与快乐。
更重要的是我们对汇编有了更进一步的理解。
有了实际应用的体会,知识更加的融会贯通了。
不管是从知识上还是从思维方式上,我们都得到了很大的进步,得到了充分的锻炼。
第一天的任务便是熟悉编程环境,掌握编程的步骤,学习怎样正确运用DOS的各个功能调用,以及初步开始设计编程,刚开始得到题目的时候,都不明白应该怎么切入核心,于是开始上网或是翻阅相关的书籍,最后才能把程序完整写下来,但是要将它变成自己的东西就需呀再花一定的功夫,通过书本查阅以及老师细致耐心的指导,终于可以将程序完整的编程出来,心中涌现极大的成就感,对微机的相关程序设计也产生了浓厚的兴趣。
课程设计结束后,我总有种意犹未尽的感觉,感觉学的知识还是不足,汇编语言的博大精深,我还是无法很清楚的把握,但我相信本次课程设计会给我带来更大的学习动力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 课程 报告