微机课设.docx

上传人:b****3 文档编号:3825540 上传时间:2022-11-25 格式:DOCX 页数:18 大小:145.78KB
下载 相关 举报
微机课设.docx_第1页
第1页 / 共18页
微机课设.docx_第2页
第2页 / 共18页
微机课设.docx_第3页
第3页 / 共18页
微机课设.docx_第4页
第4页 / 共18页
微机课设.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

微机课设.docx

《微机课设.docx》由会员分享,可在线阅读,更多相关《微机课设.docx(18页珍藏版)》请在冰豆网上搜索。

微机课设.docx

微机课设

《微机系统与接口》课程设计任务书

一、课程设计的目的本课程设计通过系列的编程设计,来引导学生熟练地运用指令系统和汇编语言来进行程序设计,系统地掌握微机程序设计的基本要领和方法,使学生的应用知识能力、程序调试能力、程序设计能力等有一定的提高。

二、课程设计题目微机汇编语言系列程序设计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、综合程序设计:

时间显示综合应用

九、课程设计心得

通过本次的程序设计,函数调用,调试方法的比较可以让我们更好的学习这门语言,而且,值得注意的一点是,任何语言的学习都必须经过不断的实践才能学好,汇编语言更是这样,在不断的实践中我们会碰到各种问题,而解决问题会使我们从中受益。

汇编语言的调试比较麻烦,而且指令也比较多,稍没搞好就会出问题然后就得重来,在编程的过程中我还碰到了许许多多其他方面的问题,通过本次课程设计我觉得:

学一门语言或者做任何事情都是一个不断实践,不断出错,不断改正的过程。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1