微机实验分支和循环程序设计实验.docx
《微机实验分支和循环程序设计实验.docx》由会员分享,可在线阅读,更多相关《微机实验分支和循环程序设计实验.docx(20页珍藏版)》请在冰点文库上搜索。
微机实验分支和循环程序设计实验
微机实验分支和循环程序设计实验
微机实验三分支和循环程序设计实验
一、分支程序设计实验
1.实验目的
1.掌握分支程序的结构。
2掌握分支程序的设计、调试方法。
2.实验设备
微机一台
3.内容
设计一数据块间的搬移程序
代码:
DATASEGMENT;定义数据段
ORG2520H;输入原数据存放地址XDB1,2,3,4,5,6,7;1234567的赋值COUNTEQU$-X;计算数据串长度ORG2525H;输入目的数据存放地址YDB7DUP(0);定义目的数据长度DATAENDS;数据段结束
STACKSEGMENTPARASTACK'STACK';定义堆栈段STAPNDB100DUP(?
);定义100个字节空间TOPEQULENGTHSTAPNSTACKENDS
CODESEGMENT;定义代码段
MAINPROCFAR;过程定义语句
ASSUMECS:
CODE,DS:
DATA,SS:
STACK;段寄存器分别与哪些段有关
START:
MOVAX,STACK;设置堆栈寄存器
MOVSS,AX
MOVSP,TOP
PUSHDS;DS入栈保护
SUBAX,AX;AX=0
PUSHAX;段内偏移量0入栈
MOVAX,DATA;数据段基址赋给AX
MOVDS,AX
LEAAX,X;取X的地址偏移量
LEABX,Y;取Y的地址偏移量
CMPAX,BX;比较大小
JCFE;如果AX小于BX,则执行FE
JMPFS;否则执行FS
FS:
MOVSI,0;从前往后复制
MOVDI,0
MOVCX,COUNT;确定复制次数
CIRCLE1:
MOVAL,X[SI];MOV不能实现两存储空间赋值,所以先把原始数据存入AL
MOVY[DI],AL;将数据赋给Y
INCSI;SI指向下一个数据
INCDI;DI指向下一个数据
LOOPCIRCLE1;循环赋值
JMPEND1;循环结束退出FE:
MOVSI,COUNT;从末尾开始赋值
MOVDI,COUNT
DECSI;指向最后一个数据
DECDI
MOVCX,COUNT;确定循环次数
CIRCLE2:
MOVAL,X[SI];MOV不能实现两存储空间赋值,所以先把原始数据存入AL
MOVY[DI],AL;将数据赋给Y
DECSI;SI指向下一个数据
DECDI;DI指向下一个数据
LOOPCIRCLE2;循环赋值
JMPEND1;循环结束退出
END1:
RET;返回dosMAINENDP;MAIN过程结束
CODEENDS;代码段结束
ENDMAIN;源代码结束
运行结果:
若从后往前传:
若从前往后传:
二、循环程序设计实验
1.实验目的
(1)加深对循环结构的理解。
(2)掌握循环结构程序设计的方法。
(3)熟练掌握调试循环程序的方法。
2.实验设备
TDS-MD微机一台
3.内容
(1)编制程序使S=1+2*3+3*4+4*5+……N(N+1),直到N(N+1)项大于200为止。
代码:
DATASEGMENT;定义数据段ORG3500H;输入原数据存放地址SDW1;总和初值为1
XDB2;需要加的数字
DATAENDS;数据段结束
STACKSEGMENTPARASTACK'STACK';定义堆栈段STAPNDB100DUP(?
);定义100个字节空间TOPEQULENGTHSTAPNSTACKENDS
CODESEGMENT;定义代码段
MAINPROCFAR;过程定义语句
ASSUMECS:
CODE,DS:
DATA,SS:
STACK;段寄存器分别与哪些段有关
START:
MOVAX,STACK;设置堆栈寄存器
MOVSS,AX
MOVSP,TOP
PUSHDS;DS入栈保护
SUBAX,AX;AX=0
PUSHAX;段内偏移量0入栈
MOVAX,DATA;数据段基址赋给AX
MOVDS,AX
MOVAX,0;AX清0
CIRCLE:
MOVAL,X;X的值赋给AL
INCX;每循环一次X加一
MULX;X的值与AL的值相乘,结果保存在AX中
ADDS,AX;把新的乘积加到总和里
CMPAX,200;加数是否大于200
JAEND1;若大于则退出
JMPCIRCLE;否则继续循环
END1:
RET;返回dos
MAINENDP;MAIN过程结束CODEENDS;代码段结束
ENDMAIN;源代码结束
运行结果:
(2)求某个数据区内负数的个数
设数据区的第一单元存放区内数据的个数,从第二单元开始存放数据,在区内最后一个
单元存放结果。
代码:
DATASEGMENT;定义数据段
ORG3500H;已判断的数据量存放地址NUMDB0;已判断的数据量初值为0
XDB12H,88H,82H,90H,22H,33H;需要判断的数字COUNTEQU$-X;需要判断的数据个数
NGDB0;负数的个数
DATAENDS;数据段结束
STACKSEGMENTPARASTACK'STACK';定义堆栈段STAPNDB100DUP(?
);定义100个字节空间TOPEQULENGTHSTAPNSTACKENDS
CODESEGMENT;定义代码段
MAINPROCFAR;过程定义语句
ASSUMECS:
CODE,DS:
DATA,SS:
STACK;段寄存器分别与哪些段有关
START:
MOVAX,STACK;设置堆栈寄存器
MOVSS,AX
MOVSP,TOP
PUSHDS;DS入栈保护
SUBAX,AX;AX=0
PUSHAX;段内偏移量0入栈
MOVAX,DATA;数据段基址赋给AX
MOVDS,AX
MOVSI,0;用于指向下一个数据的指针
MOVCX,COUNT;判断循环次数
CIRCLE:
TESTX[SI],80H;相与,只留该数据的最高位
JZPOS;若为正数,则跳过负数加一的指令
INCNG;若为负数,NG加1POS:
INCSI;指向下一个数
INCNUM;已判断数个数加1
LOOPCIRCLE;循环判断
END1:
RET;返回dos
MAINENDP;MAIN过程结束
CODEENDS;代码段结束
ENDMAIN;源代码结束
运行结果:
实验四子程序设计
一.实验目的
、学习子程序的定义和调用方法。
、掌握子程序、子程序嵌套的结构。
、掌握子程序的程序设计、编制及调试方法。
二.实验内容
程序采用菜单式选择,可接收用户输入的命令(1~5),各命令如下:
按1键完成字符串小写字母变大写字母
用户输入一由英文大小写字母或数字0~9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其它字符不变,并在屏幕上显示。
用户按任一键,重做,按ESC键,返回主菜单。
按2键完成找最大值(二选一)
、接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来。
、接收用户输入若干无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按3键完成排序(二选一)
、接收用户输入的可显示字符串,以回车结束。
程序按ASCII码值大小由大到小排序并输出显示。
、接收用户输入若干个有符号8位数(以空格逗号为分隔符,以回车结束)。
程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按4键显示时间
首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:
××(时):
××(分):
××(秒),最好定点显示。
用户按任一键,重新对时,按ESC键,返回主菜单。
按5键,结束程序运行,返回系统提示符。
代码:
DATASEGMENT;定义数据段
ORG3500H
BUFFDB30;存放待用户输入的字符串
DB?
DB30DUP(?
)
MESSDB31DUP(?
);存放输出的转换的字符串
MAXDB?
;存放最大值
PRIDB'LLEXP4',0DH,0AH
DB'PLEASEINPUTANUMBER';菜单界面屏幕显示的字幕
DB0DH,0AH
DB'NUMBERONEISFORTRANSFORMINGLETTERS'
DB0DH,0AH
DB'NUMBERTWOISFORFINDINGTHEMAXIMUMNUMBER'
DB0DH,0AH
DB'NUMBERTHREEISFORORDERING'
DB0DH,0AH
DB'NUMBERFOURISFORQUIT',0DH,0AH,'$'ERRDB'INPUTERROR',0DH,0AH,'$';若用户输入不正确需要显示的字符
CHOOSEDB'PRESSANYBUTTONTOCONTINUE,PRESSESCTOEXIT','$';每个子程序完成后按任意键继续
SHURUDB'PLEASEINPUTASTRING','$';提示用户输入字符
FLAGGDB?
;记录是按了esc还是其他DATAENDS;数据段结束
STACKSEGMENTPARASTACK'STACK';定义堆栈段
STAPNDB100DUP(?
);定义100个字节空间
TOPEQULENGTHSTAPN
STACKENDS
CODESEGMENT;定义代码段
MAINPROCFAR;过程定义语句
ASSUMECS:
CODE,DS:
DATA,SS:
STACK;段寄存器分别与哪些段有关START:
MOVAX,STACK;设置堆栈寄存器
MOVSS,AX
MOVSP,TOP
PUSHDS;DS入栈保护
SUBAX,AX;AX=0
PUSHAX;段内偏移量0入栈
MOVAX,DATA;数据段基址赋给AX
MOVDS,AXMENU:
MOVAX,SEGPRI;菜单界面,显示字符串,并等待用户输入一个字符
MOVDS,AX
MOVDX,OFFSETPRI
MOVAH,9
INT21HINPUT:
MOVAH,01H;输入一个字符INT21H
CMPAL,'1';相应功能的跳转JEF1
CMPAL,'2'
JEF2
CMPAL,'3'
JEF3
CMPAL,'4'
JEF4
JMPF5
F1:
CALLPROC1;功能的跳转F2:
CALLPROC2
F3:
CALLPROC3
F4:
JMPPROC44
F5:
CALLCRLF
MOVAX,SEGERR;若输入不正确,显示字符串MOVDS,AX
MOVDX,OFFSETERRMOVAH,9
INT21H
JMPINPUT
PROC44:
;子程序4,退出
RET
MAINENDP;MAIN过程结束PROC11:
PROC1PROCNEAR
PUSHAX
PUSHDX;子程序1,保护现场
CALLCRLF;显示后换行
MOVAX,SEGSHURU;功能1界面,显示字符串,并等待用户输入一个字符
MOVDS,AX
MOVDX,OFFSETSHURU
MOVAH,9
INT21H
CALLCRLF;显示后换行
MOVAX,SEGBUFF;用户输入一个字符串,数据段基址赋给AX
MOVDS,AX
MOVDX,OFFSETBUFF;指向buff
MOVAH,0AH
INT21H
PUSHAX
PUSHDX
CALLCRLF;换行
POPDX
POPAX
MOVSI,2;指向用户输入的空间MOVDI,0;存放数据的指针MOVCH,0
MOVCL,BUFF[1];计算比较次数
CIRCLE1:
MOVAL,BUFF[SI];
CMPAL,61H;判断是否是大写
JBNOTT
CMPAL,7AH;判断是否是大写
JANOTT
SUBAL,20H;若是,转为小写,否则不作为
NOTT:
MOVMESS[DI],AL;
INCSI;指向下一个字符INCDI
LOOPCIRCLE1
MOVMESS[DI],'$';把需要输出的字符末尾加上$MOVAX,SEGMESS;设置需要输出字符首地址MOVDS,AX
MOVDX,OFFSETMESS
MOVAH,09H;输出
INT21H
CALLCRLF;换行
POPDX;保护现场
POPAX
PUSHAX
PUSHDX
CALLEXIT;根据输入决定重做或退出
POPDX;保护现场
POPAX
CMPFLAGG,1;若输入不为esc,则重做
JEPROC11
JMPMENU;否则退回菜单
RET
PROC1ENDP
PROC22:
PROC2PROCNEAR
PUSHAX
PUSHDX;子程序2,保护现场
CALLCRLF;显示后换行
MOVAX,SEGSHURU;功能1界面,显示字符串,并等待用户输入一个字符
MOVDS,AX
MOVDX,OFFSETSHURU
MOVAH,9
INT21H
CALLCRLF;显示后换行
MOVAX,SEGBUFF;用户输入一个字符串,数据段基址赋给AX
MOVDS,AX
MOVDX,OFFSETBUFF
MOVAH,0AH
INT21H
PUSHAX
PUSHDX
CALLCRLF;换行
POPDX
POPAX
MOVAH,0
MOVAL,BUFF[1];把需要比较的次数赋给cx
MOVCX,AX
LEABX,BUFF[2];第一个数地址赋给bx
MOVAX,[BX]
AGAIN:
CMPAL,[BX];Al的值与bx偏移量的值进行比较
JAENEXT;若ax的值大,则不作为
MOVAL,[BX];否则把大的值赋给axNEXT:
INCBX;指向下一个数据
LOOPAGAIN
MOVMAX,AL;max中存放最大值
MOVDL,MAX
MOVAH,02H
INT21H;输出最大值
POPDX;保护现场
POPAX
CALLCRLF
PUSHAX
PUSHDX;保护现场
CALLEXIT
POPDX
POPAX
CMPFLAGG,1;若输入不为esc,则重做
JEPROC22
JMPMENU;否则退回菜单
RET
PROC2ENDP
PROC33:
PROC3PROCNEAR
PUSHAX;子程序3,保护现场
PUSHDX
CALLCRLF;显示后换行
MOVAX,SEGSHURU;功能1界面,显示字符串,并等待用户输入一个字
符
MOVDS,AX
MOVDX,OFFSETSHURU
MOVAH,9
INT21H
CALLCRLF;显示后换行
MOVAX,SEGBUFF;用户输入一个字符串,数据段基址赋给AX
MOVDS,AX
MOVDX,OFFSETBUFF
MOVAH,0AH
INT21H
PUSHAX
PUSHDX
CALLCRLF;换行
POPDX
POPAX
MOVAH,0
MOVAL,BUFF[1];把需要循环次数赋给cx
DECAX
MOVCX,AX
MOVSI,3;用于计算循环次数LOOP1:
MOVDX,CX;用于计算循环次数
MOVBX,2
INCSI
LOOP2:
MOVAL,BUFF[BX];将相邻数据进行比较
CMPAL,BUFF[BX+1]
JAENOCHANGE;若排序正确,无作为
XCHGAL,BUFF[BX+1];否则交换
MOVBUFF[BX],AL
NOCHANGE:
ADDBX,1
LOOPLOOP2
MOVCX,DX
LOOPLOOP1;大循环
MOVBUFF[SI],'$';用于输出
MOVAX,SEGBUFF;输出排序后结果
MOVDS,AX
MOVDX,OFFSETBUFF[2]
MOVAH,9
INT21H
POPDX
POPAX
CALLCRLF
PUSHAX
PUSHDX;保护现场
CALLEXIT
POPDX
POPAX
CMPFLAGG,1;若输入不为esc,则重做
JEPROC33
JMPMENU;否则退回菜单RET
PROC3ENDP
CRLFPROCNEAR;换行子程序
MOVDL,0DH
MOVAH,02H
INT21H
MOVDL,0AH
MOVAH,02H
INT21H
RET
CRLFENDP
EXITPROCNEAR;任意键继续,esc退出子程序
MOVAX,SEGCHOOSE;显示任意键继续
MOVDS,AX
MOVDX,OFFSETCHOOSE
MOVAH,09H
INT21H
CALLCRLF;显示后换行
MOVAH,01H;待用户输入任意键
INT21H
CMPAL,1BH
JEEXIT1
MOVFLAGG,1;继续,FLAGG为1
JMPEXIT2EXIT1:
MOVFLAGG,0;退出,FLAGG为0EXIT2:
RET
EXITENDP
CODEENDS;代码段结束ENDMAIN
运行结果:
菜单界面:
若输入’8’,则报输入错误
功能一:
输入小写字母,转换为大写字母,其他不变
功能结束,按任意键重做,按esc退出
若输入‘t’,则重做:
若输入esc,则返回菜单:
功能二:
找出ascii码最大的字符输出
功能三:
按ascii码的大小排序后输出
功能四:
若输入4,则退出