微机原理大作业.docx
《微机原理大作业.docx》由会员分享,可在线阅读,更多相关《微机原理大作业.docx(15页珍藏版)》请在冰豆网上搜索。
微机原理大作业
汇编语言程序设计综合实验
学校:
****************
学院:
************
班级:
*********
姓名:
******
学号:
************
指导教师:
******
一、实验目的
1.通过上机编程,熟悉汇编语言程序设计的流程。
2.通过编程实践,掌握常用的汇编程序设计方法与技巧。
3.学会汇编语言简单菜单程序的设计。
二、实验仪器
电脑一台
三、实验内容
利用汇编语言设计一个菜单程序,完成以下功能:
(1)小写字母变大写字母
(2)找最大值
(3)递增排序
(4)时间设置与显示
(5)结束程序运行
四、程序代码
STACKSEGMENTSTACK'STACK'
DW100HDUP(?
)
TOPLABELWORD
STACKENDS
DATASEGMENT
STRING1DB'1.LowercasetoUppercase',0DH,0AH,'$'
STRING2DB'2.FindtheMaximum',0DH,0AH,'$'
STRING3DB'3.Sort(AscendingOrder)',0DH,0AH,'$'
STRING4DB'4.TimeSettingsandDisplay',0DH,0AH,'$'
STRING5DB'5.Exit',0DH,0AH,'$'
STRING6DB'PleaseChoose:
','$'
STRING7DB'Pleaseinputthestring:
',0DH,0AH,'$'
STRING8DB'Themaximumis','$'
STRING9DB'Pleaseinputthenumbers:
',0DH,0AH,'$'
STRINGADB'Pleasesetthetime(HH:
MM:
SS)','$'
STRDECDB'DEC:
','$'
STRHEXDB'HEX:
','$'
TABLEDWG1,G2,G3,G4,G5;转移地址表
KEYLENDB20H,?
KEYBUFDB21HDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
SETCURMACROROW,COLUMN,PAGE;设置光标宏指令
MOVAH,2;设置光标位置
MOVDH,ROW;行
MOVDL,COLUMN;列
MOVBH,PAGE;页
INT10H
ENDM
DISSTRMACROSTROFFSET;显示字符串宏指令
MOVAH,9
LEADX,STROFFSET
INT21H
ENDM
DISHMSMACROREG;显示时、分或秒宏指令
MOVAL,REG
MOVAH,0
MOVBL,10
DIVBL
MOVDL,AL
MOVBH,AH
ORDL,30H
MOVAH,2
INT21H
MOVDL,BH
ORDL,30H
MOVAH,2
INT21H
ENDM
START:
MOVAX,DATA;主程序初始化
MOVDS,AX
MOVES,AX
MOVAX,STACK
MOVSS,AX
LEASP,TOP
CALLDISMENU;显示菜单
CHOOSE:
SETCUR14,20,0
MOVAH,1;输入选项
INT21H
CMPAL,'1'
JBCHOOSE
CMPAL,'5'
JACHOOSE
ANDAL,0FH
DECAL
SHLAL,1
CBW
LEABX,TABLE
ADDBX,AX
JMPWORDPTR[BX]
EXIT:
MOVAH,4CH;终止进程
INT21H
CLEARMACRO;清屏宏指令
MOVAH,0;设置显示方式
MOVAL,1;40×25彩色方式
INT10H
ENDM
G1:
CLEAR
SETCUR0,0,0
DISSTRSTRING1
SETCUR1,0,0
DISSTRSTRING7
MOVAH,0AH;输入字符串
MOVDX,OFFSETKEYLEN
INT21H
MOVCL,KEYLEN+1
MOVCH,0
MOVSI,0
L11:
MOVAL,KEYBUF[SI]
CMPAL,'a'
JBL12
CMPAL,'z'
JAL12
ANDKEYBUF[SI],5FH
L12:
INCSI
LOOPL11
MOVKEYBUF[SI],'$'
SETCUR3,0,0
DISSTRKEYBUF
L13:
MOVAH,6;直接控制台I/O
MOVDL,0FFH
INT21H
JZL13
CMPAL,1BH;判断是否按下ESC键
JNZG1
JMPSTART
G2:
CLEAR
SETCUR0,0,0
DISSTRSTRING2
SETCUR1,0,0
DISSTRSTRING7
MOVAH,0AH;输入字符串
MOVDX,OFFSETKEYLEN
INT21H
MOVCL,KEYLEN+1
MOVCH,0
MOVDL,KEYBUF
MOVSI,1
L21:
CMPKEYBUF[SI],DL
JBEL22
MOVDL,KEYBUF[SI]
L22:
INCSI
CMPSI,CX
JNZL21
PUSHDX
SETCUR3,0,0
DISSTRSTRING8
POPDX
MOVAH,2;显示结果
INT21H
MOVAH,2;显示结果
MOVDL,'.'
INT21H
L23:
MOVAH,6;直接控制台I/O
MOVDL,0FFH
INT21H
JZL23
CMPAL,1BH;判断是否按下ESC键
JNZG2
JMPSTART
G3:
CLEAR
SETCUR0,0,0
DISSTRSTRING3
SETCUR1,0,0
DISSTRSTRING9
MOVDH,10
MOVBH,0;空格标志
MOVDI,0
L36:
MOVDL,0
L33:
MOVAH,1
INT21H
CMPAL,0DH;判断是否按下回车键
JZL31
CMPAL,20H;判断是否按下空格键
JZL32
MOVBH,0
ANDAL,0FH
MOVBL,AL
MOVAL,DL
MULDH
ADDAL,BL
MOVDL,AL
JMPL33
L32:
CMPBH,0
JNZL34
MOVKEYBUF[DI],DL
INCDI
L34:
MOVBH,1
JMPL36
L31:
CMPBH,0
JNZL35
MOVKEYBUF[DI],DL
INCDI
L35:
CALLSORT
SETCUR3,0,0
DISSTRSTRDEC
MOVSI,0
L3C:
MOVAL,KEYBUF[SI]
MOVCL,0;位数
CBW
CMPAX,0
JZL37
MOVBL,10
L39:
DIVBL
MOVDL,AH
MOVAH,0
ORDL,30H
MOVDH,0
PUSHDX
INCCL
CMPAX,0
JNZL39
MOVCH,0
L3A:
POPDX
MOVAH,2
INT21H
LOOPL3A
JMPL3B
L37:
MOVAH,2
MOVDL,'0'
INT21H
L3B:
MOVAH,2
MOVDL,20H
INT21H
INCSI
CMPSI,DI
JNZL3C
SETCUR4,0,0
DISSTRSTRHEX
MOVSI,0
L3D:
MOVDL,KEYBUF[SI]
MOVCL,4
SHRDL,CL
CMPDL,10
JBL3E
ADDDL,7
L3E:
ADDDL,30H
MOVAH,2
INT21H
MOVDL,KEYBUF[SI]
ANDDL,0FH
CMPDL,10
JBL3F
ADDDL,7
L3F:
ADDDL,30H
MOVAH,2
INT21H
MOVAH,2
MOVDL,20H
INT21H
INCSI
CMPSI,DI
JNZL3D
L38:
MOVAH,6;直接控制台I/O
MOVDL,0FFH
INT21H
JZL38
CMPAL,1BH;判断是否按下ESC键
JNZG3
JMPSTART
G4:
CLEAR
SETCUR0,0,0
DISSTRSTRING4
SETCUR2,0,0
DISSTRSTRINGA
MOVAH,0AH;输入时间字符串
MOVDX,OFFSETKEYLEN
INT21H
CMPKEYLEN+1,8
JNZG4
MOVBL,10
MOVAL,KEYBUF
ANDAL,0FH
MOVAH,0
MULBL
MOVCH,KEYBUF+1
ANDCH,0FH
ADDAL,CH
MOVCH,AL;设置“时”
MOVAL,KEYBUF+3
ANDAL,0FH
MOVAH,0
MULBL
MOVCL,KEYBUF+4
ANDCL,0FH
ADDAL,CL
MOVCL,AL;设置“分”
MOVAL,KEYBUF+6
ANDAL,0FH
MOVAH,0
MULBL
MOVDH,KEYBUF+7
ANDDH,0FH
ADDAL,DH
MOVDH,AL;设置“秒”
MOVDL,0;设置“百分之一秒”
MOVAH,2DH
INT21H;设置时间
CMPAL,0
JNZG4
L41:
SETCUR0,32,0
MOVAH,2CH
INT21H
PUSHDX
DISHMSCH;显示“时”
MOVAH,2
MOVDL,':
'
INT21H
DISHMSCL;显示“分”
MOVAH,2
MOVDL,':
'
INT21H
POPDX
DISHMSDH;显示“秒”
MOVAH,1
MOVCX,2000H
INT10H
MOVAH,6;直接控制台I/O
MOVDL,0FFH
INT21H
JZL41
CMPAL,1BH;判断是否按下ESC键
JNZG4
JMPSTART
G5:
JMPEXIT
DISMENUPROCNEAR;显示菜单子程序
CLEAR
SETCUR4,6,0
DISSTRSTRING1
SETCUR6,6,0
DISSTRSTRING2
SETCUR8,6,0
DISSTRSTRING3
SETCUR10,6,0
DISSTRSTRING4
SETCUR12,6,0
DISSTRSTRING5
SETCUR14,6,0
DISSTRSTRING6
RET
DISMENUENDP
SORTPROC
PUSHDI
DECDI
CMPDI,0
JZDONE
MOVAX,DI
MOVCH,AL
N2:
MOVCL,CH
LEASI,KEYBUF
MOVBL,0;交换标志
N1:
MOVAL,[SI]
CMPAL,[SI+1]
JBENOCHG
XCHGAL,[SI+1]
MOV[SI],AL
MOVBL,1
NOCHG:
INCSI
DECCL
JNZN1
CMPBL,0
JZDONE
DECCH
JNZN2
DONE:
POPDI
RET
SORTENDP
CODEENDS
ENDSTART
五、运行结果
1.主菜单
2.完成功能
(1)小写字母变大写字母
(2)找最大值
(3)递增排序
(4)时间设置与显示
(5)结束程序运行
六、实验总结
通过本次实验加深理解了汇编语言的指令含义与其中的基本概念;通过上机编程,熟悉汇编语言程序设计的流程,掌握常用的汇编程序设计方法与技巧,学会汇编语言简单菜单程序的设计。
同时,通过上机编程,复习巩固了所学汇编程序设计知识,能够应用汇编语言解决一些实际问题。
在本次实验中也遇到了程序设计方面的问题,通过查阅相关资料解决了这些问题。