西电微机基础原理上机课后复习第三.docx
《西电微机基础原理上机课后复习第三.docx》由会员分享,可在线阅读,更多相关《西电微机基础原理上机课后复习第三.docx(23页珍藏版)》请在冰豆网上搜索。
西电微机基础原理上机课后复习第三
微机上机作业三
内容:
编写如下程序,并在机器上调试成功。
程序采用菜单式选择,可以接收用户从键盘输入的五个命令(1-5),各命令功能分别为:
(1)按下“1”键,完成字符串小写字母变成大写字母。
(2)按下“2”键,完成找最大值(二选一)。
(3)按下“3”键,完成排序(二选一)。
(4)按下“4”键,显示时间。
(5)按下“5”键,结束程序运行,返回系统提示符。
汇编程序:
STACKSEGMENTSTACK
DB256DUP(?
)
TOPLABELWORD
STACKENDS
DATASEGMENT
TABLEDWG1,G2,G3,G4,G5
STRING0DB'FormtheschoolIDis02111460LiCheng',0DH,0AH,'$'
STRING1DB'1.Changesmalllettersintocapitallettersofstring;',0DH,0AH,'$'
STRING2DB'2.Findthemaximumofstring;',0DH,0AH,'$'
STRING3DB'3.Sortfordatas;',0DH,0AH,'$'
STRING4DB'4.ShowTime;',0DH,0AH,'$'
STRING5DB'5.Exit.',0DH,0AH,'$'
STRINGNDB'Inputthenumberyouselect(1-5):
$'
IN_STRDB'Inputthestring(includingletters&numbers,lessthan60letters):
',0DH,0AH,'$'
PRESTRDB'Originalstring:
$'
NEWSTRDB'Newstring:
$'
OUT_STRDB'Thestringis$'
MAXCHRDB'Themaximumis$'
IN_NUMDB'Inputthenumbers(0-255,nomorethan20numbers):
',0DH,0AH,'$'
OUT_NUMDB'Sortednumbers:
',0DH,0AH,'$'
IN_TIMDB'Correctthetime(HH:
MM:
SS):
$'
HINTSTRDB'PressESC,gobacktothemenu;orpressanykeytoplayagain!
$'
KEYBUFDB61
DB?
DB61DUP(?
)
NUMBUFDB?
DB20DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVSP,OFFSETTOP
MAIN:
CALLFARPTRMENU;设置显示器
AGAIN:
MOVAH,2
MOVBH,0;页号
MOVDL,41;列号
MOVDH,10;行号
INT10H;光标位置设置
MOVAH,1
INT21H
CMPAL,'1'
JBAGAIN
CMPAL,'5'
JAAGAIN
SUBAL,'1';N-1
SHLAL,1;(N-1)*2
CBW;AL->AX
LEABX,TABLE
ADDBX,AX
JMPWORDPTR[BX]
G1:
CALLFARPTRCHGLTR
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPG1
G2:
CALLFARPTRMAXLTR
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPG2
G3:
CALLFARPTRSORTNUM
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPG3
G4:
CALLFARPTRTIMCHK
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPG4
G5:
MOVAH,4CH
INT21H
MENUPROCFAR;显示主界面
;设置显示器方式
MOVAH,0
MOVAL,3;
MOVBL,0;
INT10H;清屏
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,5;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING0
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,6;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING1
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,7;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING2
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,8;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING3
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,9;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING4
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,10;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRING5
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,11;行号
INT10H;光标位置设置
MOVAH,9
LEADX,STRINGN
INT21H
RET
MENUENDP
CHGLTRPROCFAR;将输入字符串中小写字母便换成大写字母
RECHG:
;设置显示器方式
MOVAH,0
MOVAL,3
MOVBL,0
INT10H;清屏
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,5;行号
INT10H;输入提示光标位置设置
MOVAH,9
LEADX,IN_STR
INT21H;输入字符串提示
MOVAH,2
MOVDL,5;列号
MOVDH,6;行号
INT10H;输入字符串光标位置设置
MOVAH,0AH
LEADX,KEYBUF
INT21H;输入字符串
CMPKEYBUF+1,0
JZRECHG;判断输入字符串是否为空串
LEABX,KEYBUF+2
MOVAL,KEYBUF+1
CBW
MOVCX,AX
ADDBX,AX
MOVBYTEPTR[BX],'$';在输入字符串尾加结束标志$
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,7;行号
INT10H;源字符串提示光标位置设置
MOVAH,9
LEADX,PRESTR
INT21H;输出源字符串提示
MOVAH,9
LEADX,KEYBUF+2
INT21H;输出源字符串
LEABX,KEYBUF+2
LCHG:
CMPBYTEPTR[BX],61H
JBNOCHG
ANDBYTEPTR[BX],0DFH
NOCHG:
INCBX
LOOPLCHG;将字符串中小写字母转换成大写字母
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,8;行号
INT10H;新字符串提示光标位置设置
MOVAH,9
LEADX,NEWSTR
INT21H;输出新字符串提示
MOVAH,9
LEADX,KEYBUF+2
INT21H;输出新字符串
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,9;行号
INT10H;提示信息光标位置设置
MOVAH,9
LEADX,HINTSTR
INT21H;输出提示信息
RET
CHGLTRENDP
MAXLTRPROCFAR;在输入字符串中找出最大值
REMAX:
;设置显示器方式
MOVAH,0
MOVAL,3
MOVBL,0
INT10H;清屏
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,5;行号
INT10H;输入提示光标位置设置
MOVAH,9
LEADX,IN_STR
INT21H;输入字符串提示
MOVAH,2
MOVDL,5;列号
MOVDH,6;行号
INT10H;输入字符串光标位置设置
MOVAH,0AH
LEADX,KEYBUF
INT21H;输入字符串
CMPKEYBUF+1,0
JZREMAX;判断输入字符串是否为空串
LEABX,KEYBUF+2
MOVAL,KEYBUF+1
CBW
MOVCX,AX
ADDBX,AX
MOVBYTEPTR[BX],'$';在输入字符串位加结束标志$
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,7;行号
INT10H;源字符串提示光标位置设置
MOVAH,9
LEADX,OUT_STR
INT21H;输出字符串提示
MOVAH,9
LEADX,KEYBUF+2
INT21H;输出字符串
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,8;行号
INT10H;新字符串提示光标位置设置
MOVAH,9
LEADX,MAXCHR
INT21H;输出字符串中最大值提示
MOVDL,0
LEABX,KEYBUF+2
LCMP:
CMP[BX],DL
JBNOLCHG
MOVDL,[BX]
NOLCHG:
INCBX
LOOPLCMP;找出字符串中最大字符,放入DL
MOVAH,2
INT21H;输出字符串中最大字符
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,9;行号
INT10H;提示信息光标位置设置
MOVAH,9
LEADX,HINTSTR
INT21H;输出提示信息
RET
MAXLTRENDP
SORTNUMPROCFAR;对输入数据组排序
RESORT:
;设置显示器方式
MOVAH,0
MOVAL,3
MOVBL,0
INT10H;清屏
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,5;行号
INT10H;输入提示光标位置设置
MOVAH,9
LEADX,IN_NUM
INT21H
MOVAH,2
MOVDL,5;列号
MOVDH,6;行号
INT10H;输入数据组光标位置设置
MOVAH,0AH
LEADX,KEYBUF
INT21H;输入数据组字符串
CALLCIN_INT;字符串转换成数据串
CMPAL,0
JZRESORT;判断数据串是否有错
CMPNUMBUF,0
JZRESORT;判断数据串是否为空
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,7;行号
INT10H;输出提示光标位置设置
MOVAH,9
LEADX,OUT_NUM
INT21H;输出数据串提示
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,8;行号
INT10H;输出数据组光标位置设置
CALLFARPTRMPSORT;数据组排序
CALLFARPTRINT_OUT;数据组的输出
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,9;行号
INT10H;提示信息光标位置设置
MOVAH,9
LEADX,HINTSTR
INT21H;输出提示信息
RET
SORTNUMENDP
CIN_INTPROCNEAR;读入整型数
;入口参数:
无
;出口参数为:
AL(有无错误标志,0为有,1为无)
MOVCL,KEYBUF+1
LEASI,KEYBUF+2
MOVCH,0;数据组数据个数置0
MOVDH,10
MOVAL,0;当前数据x=0
MOVDL,0;有无数据标志置0,即无数据
FNDNUM:
CMPBYTEPTR[SI],''
JZADDNUM;判断当前字符是否为空格
CMPBYTEPTR[SI],'0'
JBERRNUM
CMPBYTEPTR[SI],'9'
JAERRNUM;判断当前字符是否在'0'-'9'之间
MOVDL,1;有无数据标志置1,即有数据
MULDH
XORBH,BH
MOVBL,[SI]
ADDAX,BX
SUBAX,'0';计算出当前数据x
CMPAH,0
JAERRNUM;判断x是否越界
JMPNEXT
ADDNUM:
CMPDL,1
JNZNEXT;判断是否有数据
INCCH;数据组数据个数加1
CALLADDNEW
MOVDL,0
MOVAL,0;清零
NEXT:
INCSI
DECCL
CMPCL,0
JNZFNDNUM;依次检查各字符
CMPDL,1
JNZTOTAL;判断是否有未加入的数据
INCCH
CALLADDNEW
TOTAL:
MOVNUMBUF,CH;置数据组数据个数
MOVAL,1;输入数据无错误
JMPCRTNUM
ERRNUM:
MOVAL,0;输入数据有错误
CRTNUM:
RET
CIN_INTENDP
ADDNEWPROCNEAR;增加新数
;入口参数:
CH(数据组数据个数)、AL(当前数据x)
;出口参数:
无
PUSHAX
LEABX,NUMBUF
MOVAL,CH
CBW
ADDBX,AX
POPAX
MOV[BX],AL
RET
ADDNEWENDP
MPSORTPROCFAR;数据组排序
MOVAL,NUMBUF
CMPAL,1
JBENOSORT;若只有一个元素,停止排序
CBW
MOVCX,AX
LEASI,NUMBUF;SI指向数据组首地址
ADDSI,CX;SI指向数据组末地址
DECCX;外循环次数
LP1:
;外循环开始
PUSHCX
PUSHSI
MOVDL,0;交换标志置0
LP2:
;内循环开始
MOVAL,[SI]
CMPAL,[SI-1]
JAENOXCHG
XCHGAL,[SI-1];交换操作
MOV[SI],AL
MOVDL,1;交换标志置1
NOXCHG:
DECSI
LOOPLP2
POPSI
POPCX
CMPDL,1
JNZNOSORT;判断交换标志
LOOPLP1
NOSORT:
RET
MPSORTENDP
INT_OUTPROCFAR;输出数据组
MOVAL,NUMBUF
CBW
MOVCX,AX
MOVBL,10H
LEASI,NUMBUF+1
PRINT:
MOVAL,[SI]
CALLOUTNUM
INCSI
MOVAH,2
MOVDL,''
INT21H
LOOPPRINT
RET
INT_OUTENDP
OUTNUMPROCNEAR;将十进制数以十六进制输出
;入口参数:
AL(待转换的数据),BL(转换进制数16)
;出口参数:
无
MOVAH,0
DIVBL
PUSHAX
CMPAH,10
JBPNUM
ADDAH,7
PNUM:
ADDAH,30H
MOVDL,AH
POPAX
PUSHDX
CMPAL,0
JZOUTN
CALLOUTNUM
OUTN:
POPDX
MOVAH,2
INT21H
RET
OUTNUMENDP
TIMCHKPROCFAR;设定并显示时间
;设置显示器方式
MOVAH,0
MOVAL,3;
MOVBL,0;
INT10H;清屏
MOVAH,2
MOVBH,0;页号
MOVDL,5;列号
MOVDH,6;行号
INT10H;设置提示光标位置设置
MOVAH,9
LEADX,IN_TIM
INT21H;时间串提示
MOVAH,0AH
LEADX,KEYBUF
INT21H;输入时间串
MOVBL,10
MOVAL,KEYBUF+2
SUBAL,'0'
MULBL
ADDAL,KEYBUF+3
SUBAL,'0'
CMPAL,0
JBINVALID
CMPAL,24
JAEINVALID;判断时有效性
MOVCH,AL
MOVAL,KEYBUF+5
SUBAL,'0'
MULBL
ADDAL,KEYBUF+6
SUBAL,'0'
CMPAL,0
JBINVALID
CMPAL,60
JAEINVALID;判断分有效性
MOVCL,AL
MOVAL,KEYBUF+8
SUBAL,'0'
MULBL
ADDAL,KEYBUF+9
SUBAL,'0'
CMPAL,0
JBINVALID
CMPAL,60
JAEINVALID;判断秒有效性
MOVDH,AL
MOVDL,0
MOVAH,2DH
INT21H;置系统时间
INVALID:
CALLTIME
RET
TIMCHKENDP
TIMEPROC