西电微机原理上机.docx

上传人:b****5 文档编号:7748787 上传时间:2023-01-26 格式:DOCX 页数:30 大小:319.92KB
下载 相关 举报
西电微机原理上机.docx_第1页
第1页 / 共30页
西电微机原理上机.docx_第2页
第2页 / 共30页
西电微机原理上机.docx_第3页
第3页 / 共30页
西电微机原理上机.docx_第4页
第4页 / 共30页
西电微机原理上机.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

西电微机原理上机.docx

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

西电微机原理上机.docx

西电微机原理上机

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;CH

JE 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;

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

当前位置:首页 > 高等教育 > 理学

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

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