微机课设.docx
《微机课设.docx》由会员分享,可在线阅读,更多相关《微机课设.docx(18页珍藏版)》请在冰豆网上搜索。
![微机课设.docx](https://file1.bdocx.com/fileroot1/2022-11/25/bf7f1d18-9a4e-4378-9759-0c10c4afd386/bf7f1d18-9a4e-4378-9759-0c10c4afd3861.gif)
微机课设
《微机系统与接口》课程设计任务书
一、课程设计的目的本课程设计通过系列的编程设计,来引导学生熟练地运用指令系统和汇编语言来进行程序设计,系统地掌握微机程序设计的基本要领和方法,使学生的应用知识能力、程序调试能力、程序设计能力等有一定的提高。
二、课程设计题目微机汇编语言系列程序设计1、分支和循环程序设计:
数据排序统计2、综合程序设计:
时间显示综合应用三、实验目的
1、分支和循环程序设计:
数据排序统计
(1).学习提示信息的显示及键盘输入字符的方法。
(2).掌握分支程序和循环程序的设计方法。
2、综合程序设计:
时间显示综合应用
(1).掌握子程序设计的基本方法,包括子程序的定义、调用和返回,子程序中如何保护和恢复现场,主程序与子程序之间如何传送参数。
(2).学习如何进行数据转换和计算机中日期时间的处理方法。
(3).了解在程序设计中如何用查表法来解决特殊的问题。
四、课程设计要求用微机实现三个系列程序,难度依次递增。
1、屏幕上显示提示信息“Pleaseinput10numners:
”,用户从键盘输入10个数(数的范围在0-99之间)到定义的缓冲区,对输入的这10个数从小到大排序,并统计0-59,60-79,80-99的数各有多少,最后,在屏幕上显示排序后的数(每个数之间用逗号分隔),并按一定格式来显示统计的结果。
(选做)扩大输入数字的允许范围为0-999之间。
2、编写一个程序,在屏幕上实时地显示日期和时间(例如:
2009-12-2815:
18:
25显示为3:
18:
25P.M.,Monday,December28,2009),直到任意一个键被按下才退出程序。
(选做)增加整点报时功能和倒计时功能。
五、程序流程图
1、分支和循环程序设计:
数据排序统计
2、综合程序设计:
时间显示综合应用
六、程序总设计及总框图
DATASEGMENT;定义数据段
;提示信息字符串
MESSAGEDB‘Pleaseinput10numbers:
’,0DH,0AH,‘$’
;键盘缓冲区
KB_BUFDB3;定义可接收最大字符数(包括回车键)
ACTLENDB?
;实际输入的字符数
BUFFERDB3DUP(?
);输入的字符放在此区域中
;数据及统计结果
NUMBERSDB10DUP(?
);键入的数据转换成二进制后放在此处
LE59DB0;0—59的个数
GE60DB0;60—79的个数
GE80DB0;80~99的个数
;显示结果的字符串
SORTSTRDB‘Sortednumbers:
’
SORTNUMDB10DUP(20H,20H,‘,’),0DH,0AH
MESS00DB‘0—59:
’,30H,30H,0DH,0AH
MESS60DB‘60-79:
’,30H,30H,0DH,0AH
MESS80DB‘80—99:
’,30H,30H,0DH,0AH,‘$’
DATAENDS;数据段结束
CODESEGMENT;定义代码段
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVCX,10;共读入10个数据
LEADI,NUMBERS;设置数据保存区指针
LPl:
INCDI;指向下一个数据单元
CRLF;在下一行输入
LOOPLPl;直到10个数据都输入完
2、综合程序设计:
时间显示综合应用
;显示字符的宏定义
DISPMACROCHAR
PUSHAX;保存DX和AX
PUSHDX
MOVDL,CHAR;显示字符
MOVAH,2
1NT21H
POPDX
POPAX
ENDM
DATASEGMENT;数据段开始
;星期名指针表
D_TABDWSUN,MON,TUE,WED,THU,FRI,SAT
;月份名指针表
M_TABDDWJAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DCE
;星期名字符串
SUNDB‘Sunday$’
MONDB‘Monday$’
TUEDB‘Tuesday$’
WEDDB‘Wednesday$’
THUDB‘Thursday$’
FRIDB‘Friday$’
SATDB‘Saturday$’
;月份名字符串
JANDB‘January$’
FEBDB‘February$’
MARDB‘March$’
APRDB‘April$’
MAYDB‘May$’
JUNDB‘June$’
JULDB‘July$’
AUGDB‘August$’
SEPDB‘September$’
OCTDB‘October$’
NOVDB‘November$’
DCEDB‘December$’
TMTDB‘.M.,$’
SPACE=20H;空格字符
DATAENDS;数据段结束
CODESEGMENT;代码段开始
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LLL:
CALLTIMES;显示时间
CALLDATES;显示日期
DISPODH;回车
DISPOAH;换行
MOVAH,06H
MOVDL,OFFH
INT21H;检查是否有键按下
JELLL;若没有,则循环显示
MOVAH,4CH;若有键按下则退回DOS
INT21H
;显示时间的子程序
TIMESPROCNEAR
TIMESENDP
;显示日期的子程序
DATESPROCNEAR
DATESENDP
CODEENDS;代码段结束
ENDSTART
七、源程序清单
1、分支和循环程序设计:
数据排序统计CALLDOSMACROFUNCTION
MOVAH,FUNCTION
INT21H
ENDM
CRLFMACRO
MOVDL,0DH
CALLDOS2
MOVDL,0AH
CALLDOS2
ENDM
DSEGSEGMENT;定义数据段
MESSAGEDB'Pleaseinput10numbers:
',0DH,0AH,'$';提示信息字符串
;键盘缓冲区
KB_BUFDB3;定义可接收最大字符数(包括回车键)
ACTLENDB?
;实际输入的字符数
BUFFERDB3DUP(?
);输入的字符放在此区域中
;数据及统计结果
NUMBERSDB10DUP(?
);键入的数据转换成二进制后放在此处
LE59DB0;0—59的个数
GE60DB0;60—79的个数
GE80DB0;80~99的个数
;显示结果的字符串
SORTSTRDB'Sortednumbers:
'
SORTNUMDB10DUP(20H,20H,','),0DH,0AH
MESS00DB'0--59:
',30H,30H,0DH,0AH
MESS60DB'60--79:
',30H,30H,0DH,0AH
MESS80DB'80--99:
',30H,30H,0DH,0AH,'$'
DSEGENDS;数据段结束
CSEGSEGMENT;定义代码段
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX;初始化DS
LEADX,MESSAGE
CALLDOS9
MOVCX,10;共读入10个数据
LEADI,NUMBERS;设置数据保存区指针
LP1:
MOVDX,OFFSETKB_BUF
MOVAH,0AH
INT21H;返回DOS
CRLF
LEASI,BUFFER;将内存单元BUFFER的偏移地址送SI
MOVAL,[SI]
ANDAL,0FH;将AL的高四位清0,低四位保持不变
PUSHCX;入栈
MOVCL,4
SHLAL,CL;逻辑左移4位
MOVBL,AL
POPCX;出栈
INCSI;地址指针加1
MOVAL,[SI]
ANDAL,0FH;将AL的高四位清0,低四位保持不变
ORAL,BL;将AL,BL中的内容相或,结果送到AL
MOV[DI],AL
INCDI;指向下一个数据单元
LOOPLP1;直到10个数据都输入完
LEADI,NUMBERS;设置数据保存区指针
MOVBL,9
NEXT1:
MOVSI,DI
MOVCL,BL
NEXT2:
MOVAL,[SI]
INCSI;指向下一个地址
CMPAL,[SI];比较
JCNEXT3;若不大于,则转NEXT3
MOVDL,[SI]
MOV[SI-1],DL
MOV[SI],AL
NEXT3:
DECCL;将CL内容-1
JNZNEXT2;若为0,则转NEXT2
DECBL;将BL内容-1
JNZNEXT1;若为0,则转NEXT2
LEADI,NUMBERS;DI指向NUMBERS
LEASI,SORTNUM;SI指向SORTNUM
MOVCX,10
NEXT4:
MOVAL,[DI]
MOVBL,AL;通用寄存器AL的内容送BL
ANDAL,0F0H
PUSHCX;出栈
MOVCL,4;移位次数为4次
SHRAL,CL;逻辑右移4位
ORAL,30H;将AL中的内容与30H相或,结果送AL
POPCX;出栈
MOV[SI],AL
INCSI;地址指针加1
MOVAL,BL
ANDAL,0FH
ORAL,30H;相或
MOV[SI],AL
INCSI;地址指针加1
INCSI;地址指针加1
INCDI;指向下一个数据单元
LOOPNEXT4;转向NEXT4
LEADX,SORTSTR;DX指向SORTSTR
LEADI,NUMBERS;DI指向NUMBERS
MOVCX,10
L1:
CMPBYTEPTR[DI],60;与60相比较
JGEL2;大于等于60时则转L2,否则顺序执行
INCLE59;LE59加1
JMPL4;转L4
L2:
CMPBYTEPTR[DI],80;与80相比较
JGEL3;大于等于80时则转L3,否则顺序执行
INCGE60;GE60加1
JMPL4;转L4
L3:
INCGE80;GE80加1
L4:
INCDI;DI加1
LOOPL1;转L1
MOVAH,LE59
CMPAH,10;比较
JGEL8;大于等于10时则转L3,否则顺序执行
ADDAH,30H;相加
MOVAL,20H
JMPL9;转L9
L8:
MOVAX,3031H
L9:
MOVWORDPTRMESS00+6,AX
MOVAH,GE60
CMPAH,10;比较
JGEL10;大于等于10时则转L10,否则顺序执行
ADDAH,30H;相加
MOVAL,20H
JMPL11;转L11
L10:
MOVAX,3031H
L11:
MOVWORDPTRMESS60+7,AX
MOVAH,GE80
CMPAH,10;比较
JGEL12;大于等于10时则转L12,否则顺序执行
ADDAH,30H;相加
MOVAL,20H
JMPL13;转L13
L12:
MOVAX,3031H
L13:
MOVWORDPTRMESS80+7,AX
LEADX,SORTSTR;DX指向SORTSTR
CALLDOS9
CALLDOS4CH
LEADX,SORTSTR;显示排序和统计的结果
MOVAH,9
INT21H
MOVAH,4CH;调用返回DOS功能
INT21H;返回DOS
CSEGENDS;代码段结束
ENDSTART;程序结束
2、综合程序设计:
时间显示综合应用
DISPMACROCHAR
PUSHAX;保存DX和AX
PUSHDX
MOVDL,CHAR;显示字符
MOVAH,2
INT21H
POPDX
POPAX
ENDM
DSEGSEGMENT
D_TABDWSUN,MON,TUE,WED,THU,FRI,SAT;星期名指针表(数组)
M_TABDDWJAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DCE;月份名指针表
SUNDB'Sunday$';星期名字符串
MONDB'Monday$'
TUEDB'Tuesday$'
WEDDB'Wednesday$'
THUDB'Thursday$'
FRIDB'Friday$'
SATDB'Saturday'
JANDB'January$';月份名字符串
FEBDB'February$'
MARDB'March$'
APRDB'April$'
MAYDB'May$'
JUNDB'June$'
JULDB'July$'
AUGDB'August$'
SEPDB'September$'
OCTDB'October$'
NOVDB'November$'
DCEDB'December$'
DBDDB'.M.,$'
SPACE=20H
EDB'20'
FDB'19'
DSEGENDS
CSEGSEGMENT;定义数据段
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX;初始化DS
LLL:
CALLTIMES;显示时间
CALLDATES;显示日期
DISP0DH;回车
DISP0AH;换行
MOVAH,06H;控制口
MOVDL,0FFH
INT21H;检查是否有键按下
JELLL;若没有,则循环显示
MOVAH,4CH;若有键按下则退回DOS
INT21H;返回DOS
;显示日期的子程序
DATESPROCNEAR
MOVAH,2AH;显示字符串
INT21H;返回DOS
PUSHDX;入栈
LEASI,D_TAB;SI指向星期名
MOVAH,0;使AH为0
ADDAX,AX;两数相加
ADDSI,AX;两数相加
MOVDX,[SI];将[SI]送DX
MOVAH,09H;字符串显示功能
INT21H;返回DOS
POPDX;出栈
DISPSPACE;空格
PUSHDX;入栈
MOVAL,DH;刷新
DECAL;将AL的内容减1
MOVAH,0
LEASI,M_TABD;SI指向月份名
MOVAH,0
ADDAX,AX;两数相加
ADDSI,AX;两数相加
MOVDX,[SI];将[SI]送DX
MOVAH,09H;字符串显示功能
INT21H;返回DOS
POPDX;出栈
DISPSPACE;空格
MOVAL,DL
MOVAH,0;使AH为0
AAM;乘法的ASCII调整
ORAX,3030H;将AX内容与3030H相或
DISPAH;显示AH
DISPAL;显示AL
DISP',';显示‘,’
CMPCX,2000;将CX与2000相比较
JBL3;若CX≤2000,则转L3
SUBCX,2000;将CX与2000相减
DISP'2';显示‘2’
DISP'0';显示‘0’
JMPL4;转L4
L3:
SUBCX,1900;相减
DISP'1';显示‘1’
DISP'9';显示‘9’
L4:
MOVAL,CL
MOVAH,00H
AAM;拆字
ORAX,3030H;相或
DISPAH;显示AH
DISPAL;显示AL
RET;返回
DATESENDP
;显示时间的子程序
TIMESPROCNEAR
MOVAH,2CH;取时间
INT21H;返回DOS
MOVBH,'A'
CMPCH,12;比较
JBT1;若CH≤12,则转T1
MOVBH,'P'
SUBCH,12;相减
T1:
ORCH,CH;相或
JNET2;若不为0则转T2
MOVCH,12
T2:
MOVAL,CH
MOVAH,0
AAM;拆字
ORAH,AH;相或
JZT3;若为0则转移
ADDAH,'O'
DISPAH
T3:
ADDAL,'0'
DISPAL;显示AL的值
DISP':
';显示':
'
MOVAL,CL
MOVAH,0
AAM
ADDAX,3030H
PUSHAX;入栈
DISPAH;显示AH的值
POPAX;出栈
DISPAL;显示AL
DISPSPACE;显示空格
DISPBH;显示BH
LEADX,DBD;DX指向DBD
MOVAH,9;字符串显示功能
INT21H;返回DOS
DISPSPACE;空格
RET;返回
TIMESENDP;结束
MOVAH,4CH;调用返回DOS功能
INT21H;返回DOS
CSEGENDS;代码段结束
ENDSTART;程序结束
八、运行结果
1、分支和循环程序设计:
数据排序统计
2、综合程序设计:
时间显示综合应用
九、课程设计心得
通过本次的程序设计,函数调用,调试方法的比较可以让我们更好的学习这门语言,而且,值得注意的一点是,任何语言的学习都必须经过不断的实践才能学好,汇编语言更是这样,在不断的实践中我们会碰到各种问题,而解决问题会使我们从中受益。
汇编语言的调试比较麻烦,而且指令也比较多,稍没搞好就会出问题然后就得重来,在编程的过程中我还碰到了许许多多其他方面的问题,通过本次课程设计我觉得:
学一门语言或者做任何事情都是一个不断实践,不断出错,不断改正的过程。