西电微机原理上机.docx
《西电微机原理上机.docx》由会员分享,可在线阅读,更多相关《西电微机原理上机.docx(30页珍藏版)》请在冰豆网上搜索。
![西电微机原理上机.docx](https://file1.bdocx.com/fileroot1/2023-1/22/fcc3e07c-a9ee-4a77-9812-e36a15407141/fcc3e07c-a9ee-4a77-9812-e36a154071411.gif)
西电微机原理上机
17.设有n(设为17)个人围坐在圆桌周围,按顺时针给他们编号(1、2、3…,n),从第一个人开始按顺时针方向加1报数,当报到m(设为11)时,该人出列,余下的人继续进行,直到所有人出列为止。
编写程序模拟这一过程,求出出列人编号顺序。
M=11
N=17
DATA SEGMENT
COUNT DB N DUP
(1);标记数组
DATA ENDS
STACK SEGMENT STACK 'STACK'
DW 100H DUP(?
)
STACK ENDS
CODE SEGMENT
ASSUME CS:
CODE,DS:
DATA,SS:
STACK
START:
MOV AX,DATA
MOV DS,AX
MOV CX,0
L1:
MOV BX,0;BX存放此轮已遍历人数的编号
L2:
CMP BX,N;到N=17人则从头开始
JE L1
ADD CL,COUNT[BX];CL存放此轮已报数人数
CMP CL,M;报数人数达到M=11个则跳转L3
JE L3
INC BX ;人数未达到则继续向下遍历
JMP L2
L3:
MOV CL,0
MOV COUNT[BX],0;出列人所对应数组单元置0
MOV DX,BX
INC DX
ADD DL,40H
MOV AH,02H
INT 21H;以英文大写字母形式输出出列人编号
INC CH ;CH存放已出列人个数
CMP CH,N
JB L2;CHJE EXIT;否则结束报数,退出程序
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
4.39(上机题)编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择:
(1)按数字键“1”,完成将字符串中的小写字母变换成大写字母。
用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示:
<原字符串>例如:
abcdgyt0092
<新字符串>ABCDGYT0092
按任一键重做;按Esc键返回主菜单。
(2)按数字键“2”,完成在字符串中找最大值。
用户输入由英文大小写字母或数字
0~9组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示:
<原字符串>Themaximumis<最大值>.
按任一键重做;按Esc键返回主菜单。
(3)按数字键“3”,完成输入数据组的排序。
用户输入一组十进制数值(小于255),
然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示:
<原数值串>
<新数值串>
按任一键重做;按Esc键返回主菜单。
(4)按数字键“4”,完成时间的显示。
首先提示用户对时,即改变系统的定时器
HH:
MM:
SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时
间:
HH:
MM:
SS。
按任一键重新对时;按Esc键返回主菜单。
(5)按数字键“5”,结束程序的运行,返回操作系统。
程序流程图:
主函数:
功能1:
功能2:
功能3:
功能4:
调试问题、心得体会:
此程序共5个功能,采用跳转表法来实现多路分支结构程序设计。
现将这5个程序段,各程序段的首地址分别标号。
将5个程序段的入口地址做成表TABLE放入数据段,程序根据给定的参数计算出欲转入的程序段的首地址在TABLE中的位置后,取出该地址,跳转至该程序段。
然后执行该程序段功能。
执行完后根据选择决定是重复执行改程序还是跳出选择其他程序执行。
问题1:
未在输入字符串末尾加上'$',导致出错,将后续存储区域的混乱字符全部显示出来!
修改:
MOVBYTEPTR[BX],'$';在输入字符串尾加结束标志$
问题2:
排序子函数出现问题
各数值只转化为16进制,并未排序,调用过程出现问题!
问题3:
实现显示位置不对,未设置显示位置坐标!
改正后得到正确结果!
运行结果:
主函数:
功能1:
功能2:
功能3:
功能4:
功能5:
程序代码:
STACKSEGMENTSTACK
DB256DUP(?
)
TOPLABELWORD
STACKENDS
DATASEGMENT
TABLEDWL1,L2,L3,L4,L5
STRING1DB'1.Changestring;',0DH,0AH,'$'
STRING2DB'2.Findthemaximum;',0DH,0AH,'$'
STRING3DB'3.Rank;',0DH,0AH,'$'
STRING4DB'4.Time;',0DH,0AH,'$'
STRING5DB'5.Exit.',0DH,0AH,'$'
STRINGNDB'Inputthenumber1-5:
$'
STRBUFDB'Inputthestring:
',0DH,0AH,'$'
MAXCHRDB'Themaximumis$'
NUMBERDB'Inputthenumbers:
',0DH,0AH,'$'
TIMESDB'Correctthetime(HH:
MM:
SS):
$'
STRBUF2DB'PressESCtoexit;orpressanykeytocontinue$'
KEYBUFDB61
DB?
DB61DUP(?
)
NUMBUFDB?
DB20DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
LEASP,TOP
MAIN:
CALLFARPTRMENU
AGAIN:
MOVAH,2
MOVBH,0
MOVDL,41
MOVDH,10
INT10H
MOVAH,1
INT21H
CMPAL,'1'
JBAGAIN
CMPAL,'5'
JAAGAIN
SUBAL,'1'
SHLAL,1
CBW
LEABX,TABLE
ADDBX,AX
JMPWORDPTR[BX]
L1:
CALLFARPTRCHGLTR
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPL1
L2:
CALLFARPTRMAXLTR
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPL2
L3:
CALLFARPTRSORTNUM
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPL3
L4:
CALLFARPTRTIMCHK
MOVAH,8
INT21H
CMPAL,1BH
JZMAIN
JMPL4
L5:
MOVAH,4CH
INT21H
MENUPROCFAR;设置显示器方式
MOVAH,0
MOVAL,3;
MOVBL,0;
INT10H
MOVAH,2
MOVBH,0
MOVDL,5
MOVDH,5
INT10H
MOVAH,9
LEADX,STRING1
INT21H
MOVAH,2
MOVDL,5
MOVDH,6
INT10H
MOVAH,9
LEADX,STRING2
INT21H
MOVAH,2
MOVDL,5
MOVDH,7
INT10H
MOVAH,9
LEADX,STRING3
INT21H
MOVAH,2
MOVDL,5
MOVDH,8
INT10H
MOVAH,9
LEADX,STRING4
INT21H
MOVAH,2
MOVDL,5
MOVDH,9
INT10H
MOVAH,9
LEADX,STRING5
INT21H
MOVAH,2
MOVDL,5
MOVDH,10
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,STRBUF
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
LEABX,KEYBUF+2
LCHG:
CMPBYTEPTR[BX],61H
JBNOCHG
ANDBYTEPTR[BX],0DFH
NOCHG:
INCBX
LOOPLCHG;将字符串中小写字母转换成大写字母
MOVAH,9
LEADX,KEYBUF+2
INT21H;输出新字符串
MOVAH,2
MOVBH,0
MOVDL,5
MOVDH,9
INT10H
MOVAH,9
LEADX,STRBUF2
INT21H;输出提示信息
RET
CHGLTRENDP
MAXLTRPROCFAR;在输入字符串中找出最大值
REMAX:
;设置显示器方式
MOVAH,0
MOVAL,3
MOVBL,0
INT10H
MOVAH,2
MOVBH,0
MOVDL,5
MOVDH,5
INT10H
MOVAH,9
LEADX,STRBUF
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,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,STRBUF2
INT21H;输出提示信息
RET
MAXLTRENDP
SORTNUMPROCFAR;对输入数据组排序
RESORT:
;设置显示器方式
MOVAH,0
MOVAL,3
MOVBL,0
INT10H
MOVAH,2
MOVBH,0
MOVDL,5
MOVDH,5
INT10H
MOVAH,9
LEADX,NUMBER
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,8
INT10H
CALLFARPTRMPSORT;数据组排序
CALLFARPTRINT_OUT;数据组的输出
MOVAH,2
MOVBH,0
MOVDL,5
MOVDH,9
INT10H
MOVAH,9
LEADX,STRBUF2
INT21H;输出提示信息
RET
SORTNUMENDP
CIN_INTPROCNEAR;读入整型数
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;增加新数
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;将十进制数以十六进制输出
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,TIMES
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;显示时间子程序
;设置显示器方式
MOVAH,0
MOVAL,3;
MOVBL,0;