微机实验子程序设计.docx
《微机实验子程序设计.docx》由会员分享,可在线阅读,更多相关《微机实验子程序设计.docx(24页珍藏版)》请在冰豆网上搜索。
![微机实验子程序设计.docx](https://file1.bdocx.com/fileroot1/2023-1/29/3ded4f9b-740a-4aaa-b504-f0d2d2a7b328/3ded4f9b-740a-4aaa-b504-f0d2d2a7b3281.gif)
微机实验子程序设计
微机实验三分支和循环程序设计实验
一、分支程序设计实验
1.实验目的
1.掌握分支程序的结构。
2掌握分支程序的设计、调试方法。
2.实验设备
微机一台
3.内容
设计一数据块间的搬移程序
设计思想:
程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。
源数据块和目的数据块在存贮中可能有三种情况。
对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出以下结论:
当源数据块首址〉目的块首址时,从数据块首址开始传送数据。
当源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
流程图:
结果:
在源数据块中存入6个数,分别使SI大于、等于、小于DI均发觉数据正确传送。
可见程序正确。
实现代码如下:
DATASEGMENT
ORG3500H
SRC_MESSDB1,2,3,4,5,6
ORG3510H
NEW_LOCDB20DUP(0)
DATAENDS
;
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
LEASI,SRC_MESS
LEADI,NEW_LOC
MOVCX,6
CLD;DF置0
CMPSI,DI;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JLNEXT1;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2)
NEXT2:
REPMOVSB
NEXT1:
ADDSI,CX;SI=SI+CX-1从末地址开始传递数据
DECSI;
ADDDI,CX;DI+=DI+CX-1
DECDI;
STD;DF置1
JMPNEXT2;
CODEENDS
ENDSTART
结果显示:
将3500H开始的1,2,3,4,5,6复制到3510H开始的地址。
DATASEGMENT
ORG3500H
SRC_MESSDB1,2,3,4,5,6
DATAENDS
;
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
LEASI,SRC_MESS
MOVDI,3502H
MOVCX,6
CLD;DF置0
CMPSI,DI;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JLNEXT1;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2)
NEXT2:
REPMOVSB
MOVAH,4CH
INT21H
NEXT1:
ADDSI,CX;SI=SI+CX-1从末地址开始传递数据
DECSI;
ADDDI,CX;DI+=DI+CX-1
DECDI;
STD;DF置1
JMPNEXT2;
CODEENDS
ENDSTART
结果显示:
将3500H开始的连续的1,2,3,4,5,6复制搬移到3502H开始的地址。
此时,搬移过程应当从数组的最后一个数字6开始搬移,一直到最前面的3500H对应的的数字01搬移到3502H地址为止。
DATASEGMENT
ORG3502H
SRC_MESSDB1,2,3,4,5,6
DATAENDS
;
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
LEASI,SRC_MESS
MOVDI,3500H
MOVCX,6
CLD;DF置0
CMPSI,DI;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JLNEXT1;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2)
NEXT2:
REPMOVSB
MOVAH,4CH
INT21H
NEXT1:
ADDSI,CX;SI=SI+CX-1从末地址开始传递数据
DECSI;
ADDDI,CX;DI+=DI+CX-1
DECDI;
STD;DF置1
JMPNEXT2;
CODEENDS
ENDSTART
结果显示:
将3502H开始的1,2,3,4,5,6搬移到3500H开始的地址,应该从3502H地址开始传数据到3500H,依次往后搬移。
二、循环程序设计实验
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
HELLODB32DUP(0)
DATAENDS
;
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,1;DX存储总和
MOVBL,2;BL存储被乘项
NEXT:
MOVAL,BL;AL存储被乘项
INCBL;
MULBL;结果存储在AX
ADDDX,AX
CMPAX,200
JLNEXT
MOVBX,3500H
MOV[BX],DX
MOVBX,3510H
MOV[BX],AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
结果与分析:
运行结果为045FH,与实际相符,程序正确。
(2)求某个数据区内负数的个数
设数据区的第一单元存放区内数据的个数,从第二单元开始存放数据,在区内最后一个单元存放结果。
为统计数据区内负数的个数,需要逐个判断区内的每一个数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,即得区内所包含负数的个数。
流程图:
实现代码:
DATASEGMENT
ORG3500H
HELLODB6,3,-58,-34,7,-2,29;6是数据的个数,共有6个数据
ORG3510H
NUM_TDB16DUP(0);3510H单元存结果
DATAENDS
;
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA;初始化数据段
MOVDS,AX
MOVDI,3500H;数据区的首地址给DI
MOVCL,[DI];数据的个数给CL,作为NEXT1循环的个数
INCDI;DI指向第一个需要比较的数据
MOVCH,0
MOVBL,0
NEXT1:
MOVAL,[DI]
ANDAL,80H;AL与1000(B)做按位与操作,如果是负数,AL存储的是1000(B),否则存储的是0
CMPAL,80H;如果是负数,AL与80H相等
JENEXT2;如果是负数,跳转到NEXT2
GOGO:
INCDI
LOOPNEXT1
MOVDI,3510H
MOV[DI],BL
MOVAX,4C00H;返回DOS
INT21H
NEXT2:
INCBL
JMPGOGO
CODEENDS
ENDSTART
结果与分析:
输入数据个数为6
输入3,-58,-34,7,-2,29得结果03,存放在3510H地址。
其中3500H地址对应的数字6是原始数据的个数。
结果与实际相符,程序正确。
输入数据个数为6
输入3,-58,-34,7,-2,-29得结果04,存放在3510H地址。
其中3500H地址对应的数字6是原始数据的个数。
结果与实际相符,程序正确。
实验四 子程序设计
一.实验目的
1、学习子程序的定义和调用方法。
2、掌握子程序、子程序嵌套的结构。
3、掌握子程序的程序设计、编制和调试方法。
二.实验内容
程序采用菜单式选择,可接收用户输入的命令(1~5),各命令如下:
按1键完成字符串小写字母变大写字母
用户输入一由英文大小写字母或数字0~9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其它字符不变,并在屏幕上显示。
用户按任一键,重做,按ESC键,返回主菜单。
按2键完成找最大值(二选一)
1、接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来。
2、接收用户输入若干无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按3键完成排序(二选一)
1、接收用户输入的可显示字符串,以回车结束。
程序按ASCII码值大小由大到小排序并输出显示。
2、接收用户输入若干个有符号8位数(以空格逗号为分隔符,以回车结束)。
程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按4键显示时间
首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:
××(时):
××(分):
××(秒),最好定点显示。
用户按任一键,重新对时,按ESC键,返回主菜单。
按5键,结束程序运行,返回系统提示符。
三.程序与流程图
主程序的简略流程子程序一的简略流程图子程序二的简略流程图
子程序三的简略流程图子程序4,显示时间流程图
实现代码:
DATASEGMENT
ORG3500H
BUFDB100;从3500H开始定义缓冲区
DB?
DB100DUP(0)
MYNAMEDB'Programedbyali...',0DH,0AH,'$'
BUF1DB'1.Inputastring,thenconvertthesmalllettertobigletter.',0DH,0AH,'$'
BUF2DB'2.FindthecharacterwhoseASCIIcodeisbiggest.',0DH,0AH,'$'
BUF3DB'3.SortthecharacterbyASCIIcodebydecreasingorder.',0DH,0AH,'$'
BUF4DB'4.Displaythetickingtime.',0DH,0AH,'$'
BUF5DB'5.Endtheprogram.',0DH,0AH,'$'
STRING1DB'Pleaseinputastring:
',0DH,0AH,'$'
STRING2DB'EnteranycharactertoplayagainorEsctoquit...',0DH,0AH,'$'
STRING3DB0DH,0AH,'$'
DATAENDS
;
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA;DATA初始化
MOVDS,AX
HELLO:
CALLCHILD0;显示菜单
MOVAX,0100H;从键盘输入一个数字的ASCII,AL存储输入的数字的ASCII
INT21H
CMPAL,31H
JENEXT1
CMPAL,32H
JENEXT2
CMPAL,33H
JENEXT3
;CMPAL,34H
;JENEXT4
CMPAL,35H
JENEXT5
NEXT1:
CALLCHILD1
JMPHELLO
NEXT2:
CALLCHILD2
JMPHELLO
NEXT3:
CALLCHILD3
JMPHELLO
;NEXT4:
CALLCHILD4
;JMPHELLO
NEXT5:
CALLCHILD5
;显示菜单子程序
CHILD0PROCNEAR
MOVDX,OFFSETMYNAME
MOVAH,9H;显示
INT21H
MOVDX,OFFSETBUF1
MOVAH,9H;显示
INT21H
MOVDX,OFFSETBUF2
MOVAH,9H;显示
INT21H
MOVDX,OFFSETBUF3
MOVAH,9H;显示
INT21H
MOVDX,OFFSETBUF4
MOVAH,9H;显示
INT21H
MOVDX,OFFSETBUF5
MOVAH,9H;显示
INT21H
RET
CHILD0ENDP
;
CHILD1PROCNEAR
HELLO_1:
MOVDX,OFFSETSTRING1
MOVAH,9H
INT21H
LEADX,BUF
MOVAH,10
INT21H
MOVDX,OFFSETSTRING3;换行
MOVAH,9H
INT21H
MOVBX,3501H
MOVCL,[BX]
MOVCH,0
MOVBX,3502H
NEXT1_1:
MOVAL,[BX]
CMPAL,97
JLDADA
CMPAL,122
JGDADA
SUBAL,32;是小写字符
DADA:
MOVDL,AL
MOVAH,02H
INT21H
INCBX
LOOPNEXT1_1
MOVDX,OFFSETSTRING3;换行
MOVAH,9H
INT21H
MOVDX,OFFSETSTRING2
MOVAH,9H
INT21H
MOVAH,08H
INT21H
CMPAL,27;跟ESC的ASCII比较
JEBYBY
JMPHELLO_1
BYBY:
RET
CHILD1ENDP
;
CHILD2PROCNEAR
MOVDX,OFFSETSTRING1
MOVAH,9H
INT21H
LEADX,BUF
MOVAH,10
INT21H
MOVDI,3501H
MOVCL,[DI]
DECCL;循环次数
MOVCH,0
LOOP1:
MOVDX,CX
MOVBX,3502H
LOOP2:
MOVAL,[BX]
CMPAL,[BX+1]
JAENO_CHANGE
XCHGAL,[BX+1]
MOV[BX],AL
NO_CHANGE:
ADDBX,1
LOOPLOOP2
MOVCX,DX
LOOPLOOP1
MOVDX,OFFSETSTRING3
MOVAH,9H
INT21H
MOVDI,3502H
MOVDL,[DI]
MOVAH,02H
INT21H
MOVDX,OFFSETSTRING3;换行
MOVAH,9H
INT21H
RET
CHILD2ENDP
CHILD3PROCNEAR
MOVDX,OFFSETSTRING1
MOVAH,9H
INT21H
LEADX,BUF
MOVAH,10
INT21H
MOVDI,3501H
MOVCL,[DI]
DECCL;循环次数
MOVCH,0
LOOP11:
MOVDX,CX
MOVBX,3502H
LOOP22:
MOVAL,[BX]
CMPAL,[BX+1]
JAENO_CHANGE1
XCHGAL,[BX+1]
MOV[BX],AL
NO_CHANGE1:
ADDBX,1
LOOPLOOP22
MOVCX,DX
LOOPLOOP11
MOVDX,OFFSETSTRING3
MOVAH,9H
INT21H
MOVCH,0
MOVBX,3501H
MOVCL,[BX]
MOVDI,3502H
PETER:
MOVDL,[DI]
MOVAH,02H
INT21H
INCDI
LOOPPETER
MOVDX,OFFSETSTRING3;换行
MOVAH,9H
INT21H
RET
CHILD3ENDP
;返回DOS
CHILD5PROCNEAR
MOVAX,4C00H
INT21H
RET
CHILD5ENDP
CODEENDS
ENDSTART
结果显示:
选择1号功能,输入字符串,将字符串转换成大写形式,并显示到屏幕上。
之后输入任意键,将重新提示输入字符串,实现1号功能,按Esc键,则回到功能菜单界面。
选择2号功能,提示输入字符串,输入之后,将ASCII值最大的字符输出到屏幕上,并回到功能菜单界面。
选择3号功能,输入字符串,利用冒泡排序,将字符串按ASCII值由大到小排序并输出到屏幕上。
之后回到功能菜单界面。
输入5,将推出程序,回到DOS。