华工微机实验报告Word格式文档下载.docx
《华工微机实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《华工微机实验报告Word格式文档下载.docx(40页珍藏版)》请在冰豆网上搜索。
CODE,SS:
STACK
START:
MOVBX,0AH
MOVSI,3500H
MOVDI,3510H
MOVCX,5
MOVAX,0
MOVDH,0
AGAIN:
MULBX
MOVDL,BYTEPTR[SI]
SUBDL,30H
CLC
ADDAX,DX
INCSI
LOOPAGAIN
EXIT:
MOVWORDPTR[DI],AX
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
实验结果如下:
图2.1-1:
输入3030303132,3510~3511是0C00(正确读数是000C)
图2.1-2:
输入3031303233,3510~3511是FF03(正确读数是03FF)
图2.1-3:
输入3031303132,3510~3511是F403(正确读数是03F4)
实验结论:
程序执行结果正确
2将从键盘输入的五位十进制数的ASCII码已存在3500起始的内存单元中。
把它转换成BCD码后,再按位分别存入350A起始的内存单元内。
若输入的不是十进制的ASCII码,则显示FF.
实验步骤:
(2)在3500~3504H单元存入五位十进制数的ASCII码,即e3500
并输入31,32,33,34,35。
(3)G=2000,运行以上程序。
(4)D350A,显示结果为:
0000:
350A01020304CC…
实验代码实现如下(实际代码实现与流程图顺序有小部分出入,整体框架一样,下同):
DB100DUP(?
)
;
ORG2000H
MOVDI,350AH
MOVCX,05H
MOVDL,0FFH
MOVAL,BYTEPTR[SI]
CMPAL,39H
JAERROR
CMPAL,30H
JBERROR
SUBAL,30H
MOV[DI],AL
JMPEXIT
ERROR:
MOV[DI],DL
INCDI
MOVAX,4C00H
图2.2-1:
输入3132333435,在350A开始看到:
0102030405
图2.2-2:
输入3133393A34,在350A开始看到:
010309FF04B4
3.将十六位二进制数转换为ASCII码表示的十进制数。
十六进制数的值域为0~65535,最大可转换为五位十进制数。
(2)在3500~3501H单元中存放0C00,运行程序并检查结果,应看到3510~3514H单元中的数依次为3030303132。
实验流程图如下:
代码实现如下:
CODESEGMENT
MOVBX,0
MOVDI,3515H
MOVAL,[SI]
MOVAH,[SI+1]
MOVDX,0
MOVBX,0AH
PROCG1:
DECDI
DIVBX
ADDDL,30H
MOV[DI],DL
CMPAX,0
JNEPROCG1
PROCG2:
CMPDI,3510H;
DI不等于3510H,即5位十进制数有相应高位是多余的,须置0
JEEXIT
DECDI
MOVDL,30H
JMPPROCG2
图2.3-1:
输入0C00(正确读数是000C),在3510处开始看到:
3030303132
图2.3-2:
输入1CAE(正确读数是AE1C),在3510处开始看到:
3434353732
4.十六进制数转换为ASCII码
设经过CPU处理后的十六进制存放在起始地址为3500H的内存中,把它们转换成ASCII码之后,再分别存入起始地址为3510的内存单元中。
参考流程图如图2-5所示。
(2)在3500~3501H单元中存入四位16进制数203B,即:
e3500,并输入3B,20。
(3)G=2000,运行程序
0000:
350A42333032`
输入数与结果ASCII码对应顺序相反
START:
MOVCX,04H
MOVAX,[SI]
PROCG1:
MOVDX,AX
ANDAX,0FH
CMPAL,09H;
是数字,+30H
JBNUMB
JMPLECT;
是字母,+37H
NUMB:
ADDAL,30H
LECT:
ADDAL,37H
PROCG2:
PUSHCX
MOVCL,04
SHRDX,CL;
左移四位
POPCX
MOVAX,DX
LOOPPROCG1
实验结果如下:
图2.4-1:
输入3B20(实际读数是203B),在3510处开始:
42333032
图2.4-2:
输入A31B(实际读数是1BA3),在3510处开始:
33414231
5.BCD码转换为二进制码
设四个二位十进制的BCD码存放在起始地址为3500H的单元中,转换出的二进制数码存入起始为3510的内存单元中,程序流程图如图2-6。
(1)输入程序并检查无误
(2)在3500~3501H单元中存入四个十进制数(12,34,56,78)的BCD码,即e3500,输入01.02.03.04.05.06.07.08。
(4)D3510,显示结果为35100C00220038004E00
实验实现代码如下:
DB50DUP(?
ASSUMECS:
ORG2000H
MOVSI,3500H
MOVCX,8
MOVAL,BYTEPTR[SI]
MOVDL,0AH
MULDL
MOVAH,AL
ADDAL,AH
MOVAH,0
MOV[DI],AX
EXIT:
MOVAX,4C00H
图2.5-1:
输入0102030405060708,在3510处开始看到:
0C00220038004有00
微机实验三分支和循环程序设计实验
一、分支程序设计实验
1.实验目的
1.掌握分支程序的结构。
2掌握分支程序的设计、调试方法。
2.实验设备
微机一台
3.内容
设计一数据块间的搬移程序
设计思想:
程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。
源数据块和目的数据块在存贮中可能有三种情况。
对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出以下结论:
当源数据块首址〉目的块首址时,从数据块首址开始传送数据。
当源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
流程图:
STACKSEGMENTSTACK'
MOVCX,0AH
MOVBX,3500H
MOVSI,[BX];
SI[BX]
MOVDI,[BX+2];
DI[BX+2]
CMPSI,DI
JAA1;
SI>
DI,首地址开始拷贝
MOVAX,SI;
SI<
=DI,末地址开始拷贝
ADDAX,CX
MOVSI,AX
MOVAX,DI
MOVDI,AX
DECSI
STD;
地址减量
REPMOVSB
A1:
CLD;
地址增量
图3.1-1:
SI=3400,DI=3420时数据搬移
图3.2-2:
SI=3420,DI=3400时数据搬移
图3.2-3:
SI=3400,DI=3405,源数据与搬移地址重叠
无论SI<
=DI,还是DI>
SI或者源数据是否与搬移地址重叠数据均能正确搬移
二、循环程序设计实验
(1)加深对循环结构的理解。
(2)掌握循环结构程序设计的方法。
(3)熟练掌握调试循环程序的方法。
TDS-MD微机一台
(1)编制程序使S=1+2*3+3*4+4*5+……N(N+1),直到N(N+1)项大于200为止。
流程图:
代码实现如下:
STACKSEGMENTSTACK'
DATASEGMENT
ORG3500H
RESDW10DUP(0)
DATAENDS
CODE,DS:
DATA,SS:
MOVAX,DATA
MOVDS,AX
MOVDX,1
MOVBL,2
LEASI,RES
MOVAL,BL
INCBL
MULBL
ADDDX,AX
CMPAX,200D
JAEXIT
JMPPROCG1
MOVWORDPTR[SI],DX
结果与分析:
运行结果为045FH,与实际相符,程序正确。
(2)求某个数据区内负数的个数
设数据区的第一单元存放区内数据的个数,从第二单元开始存放数据,在区内最后一个单元存放结果。
为统计数据区内负数的个数,需要逐个判断区内的每一个数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,即得区内所包含负数的个数。
流程图:
MOVDI,3510H
MOVCL,BYTEPTR[DI]
MOVCH,00H
MOVBX,00H
GETN:
MOVAL,[DI]
TESTAL,80H
JNZGETF
LOOPGETN
JMPPEND
GETF:
PEND:
INCDI
MOV[DI],BL
实验结果与分析:
输入数据个数为6
输入12、88、82、90、22、33得结果03
结果与实际相符,程序正确。
实验四 子程序设计
一.实验目的
1、学习子程序的定义和调用方法。
2、掌握子程序、子程序嵌套的结构。
3、掌握子程序的程序设计、编制及调试方法。
二.实验内容
程序采用菜单式选择,可接收用户输入的命令(1~5),各命令如下:
按1键完成字符串小写字母变大写字母
用户输入一由英文大小写字母或数字0~9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其它字符不变,并在屏幕上显示。
用户按任一键,重做,按ESC键,返回主菜单。
按2键完成找最大值
1、接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来。
按3键完成排序
1、接收用户输入的可显示字符串,以回车结束。
程序按ASCII码值大小由大到小排序并输出显示。
按4键显示时间
首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:
×
(时):
(分):
(秒),最好定点显示。
用户按任一键,重新对时,按ESC键,返回主菜单。
按5键,结束程序运行,返回系统提示符。
三.程序与流程图
主程序的简略流程
子程序一的简略流程图子程序2的流程图
子程序三的简略流程图子程序4,显示时间流程图
DATASEGMENT
TMDB'
PROGRAMFORLAB4:
'
0DH,0AH,'
$'
C0DB'
PLEASECHOOSEONEOFTHESUBPROGRAMS(1~5)BYINPUTINGTHEPROMPTNUMBER'
C1DB'
1.INPUTASTRING,THENCONVERTSMALLLETTERSTOCAPITALLETTERS'
C2DB'
2.INPUTASTIRNG,THENRETURNACHARACTERWITHTHEBIGGESTASCIIVALUE'
C3DB'
3.INPUTASIRING,THENSORTITINDECREASEDORDER'
C4DB'
4.DISPLAYTHETICKINGTIME'
C5DB'
5.EXIT'
E1DB0DH,0AH,'
DOYOUWANNACONTINUE?
PRESSANYKEYIFAGAIN,ORPRESSESCTORET'
E2DB0DH,0AH,'
SORRY,YOUHAVEINPUTAWRONGNUMBERPLEASETRYAGAIN'
E3DB0DH,0AH,'
PLEASEINPUTANEWTIMEWITHFORMxx:
xx:
xx'
E4DB0DH,0AH,'
DOYOUWANNATRYOTHERSUBPROGRAM(YFORYES,OTHERFORNO)'
E5DB0DH,0AH,'
PLEASEINPUTTHESTRING:
E6DB'
RESULT:
$'
E7DB'
YOUHAVEINPUTAINCORRECTFORM,PLEASETRYAGAIN!
E8DB0DH,0AH,'
TOCONTINUEAGAIN,CHOOSENUMBER1~5:
TSDB'
NOWTHESYSTEMTIMEDISPLAYBEHIND,PRESSANYKEYTOINTERPURT!
CLFDB0DH,0AH,'
BUFDB30
LENDB?
BUFFDB30DUP(?
TDB5DUP(?
DATAENDS
STAPNDW100DUP(?
TOPLABELWORD
STACKENDS
MAINPROCFAR
CODE,DS:
MOVAX,STACK
MOVSS,AX
MOVSP,OFFSETTOP
MENU:
LEADX,CLF;
调用菜单
MOVAH,09H
LEADX,TM
LEADX,C0
LEADX,C1
LEADX,C2
LEADX,C3
LEADX,C4
LEADX,C5
P0:
MOVAH,01H
P1:
CMPAL,1
JNEP2
CALLPROCG1;
调用子程序1
JMPAGAIN
P2:
CMPAL,2
JNEP3
CALLPROCG2;
调用子程序2
P3:
CMPAL,3
JNEP4
CALLPROCG3;
调用子程序3
P4:
CMPAL,4
JNEP5
CALLPROCG4;
调用子程序4
P5:
CMPAL,5
JNEERROR;
输入有误,转错误提示
JMPEXIT;
调用子程序5,即退出程序
ERROR:
LEADX,E2
JMPP0
AGAIN:
LEADX,E4
CMPAL,'
Y'
JEETR
ETR:
LEADX,E8
MOVAX,4C00H;
退出程序
MAINENDP
PROCG1PROCNEAR;
子程序1,输入一段字符串,将小写字母转换成大写字母
P1STEP1:
LEADX,E5
MOVAH,0AH
LEADX,BUF
LEADX,CLF
LEASI,BUFF
P1STEP2:
INCSI
CMPAL,0DH
JEP1SHOW
CMPAL,61H
JBP1STEP2
CMPAL,7AH
JAP1STEP2
SUBAL,20H
MOV[SI],AL
JMPP1STEP2
P1SHOW:
MOVAL,0AH
MOV[SI+1],AL
MOVAL,'
MOV[SI+2],AL
LEADX,E6