微型计算机实验一实验报告Word下载.docx
《微型计算机实验一实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《微型计算机实验一实验报告Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
实验步骤:
Part1
(一)熟悉DEBUG的使用(熟悉DEBUG的常用命令A,U,R,T,D,E,G)
DEGUG下的实践:
1在DEBUG状态下用“E”命令在偏移地址为0200H开始的18H个单元输入0,1,2….,17H。
(1)写一段程序,把这24个单元的内容复制到偏移地址为0230H开始的单元中。
(2)写一段程序,把偏移地址为5000H开始的40H个单元写入AAH.
2.写一段程序把1,2,...,100共100个数写入偏移地址为0200H开始的100个单元中。
用条件转移指令完成这100个数相加,并把结果放入偏移地址为0300H起的单元中。
(选做)
(二)寻址方式实践
(1)用E命令(E2000:
0000)把内存2000:
0000开始的10个单元的内容改写为:
10,11,12,13,14…..,19;
把内存2000:
0040开始的10个单元的内容改写为:
00,11,22,33,44…..,99
(2)用D命令检查执行
(1)的情况
(3)用A命令输入如下指令,逐条执行并观察结果并解析之。
MOVAX,2000
MOVDS,AX
MOVBX,4
MOVSI,40
MOVAL,[2]
MOVAL,[BX]
MOVAL,[SI]
MOVAL,[BX+4]
MOVAL,[SI+3]
MOVAL,[BX+SI]
MOVAX,[BX+SI+4]
MOV[BX+SI+20],AL;
AL的内容送何处?
MOVBP,4
MOV[BP+2],AX;
AX的内容送何处?
找找
INCAX
MOV[BX+2],AX;
PUSHAX;
AX的内容送何处?
观察SP的变化
PUSHBX ;
BX的内容送何处?
POPCX;
CX=?
观察SP的变化
(4)说明第4~13条指令的寻址方式,确定第5~11条指令源操作数的物理地址
Part2
一 在DEBUG状态下用“E”命令在3000:
0010H开始的10H个单元输入0,1,2….,0FH。
(1)写一段程序,用串指令把这16个单元的内容复制到4000:
0020H开始的单元中。
(2)写一段程序,用串指令把物理地址为3000:
0400H开始的40H个单元写入AAH;
3000:
0450
开始的30H个单元写入55H
二熟悉Masmforwindows的使用。
三编写1个具有一定功能的小程序,完成它们的汇编,连接,运行和在DEBUG下的调试。
(分析运行结果)题目可自拟
实验结果:
1在DEBUG状态下用“E”命令在偏移地址为0200H开始的24H个单元输入0,1,2….,17H,
在ASM平台上代码如下:
MOVAX,2000H
MOVDS,AX
MOVBX,200H
MOVCX,24
MOVSI,230H
FIND:
MOVAL,[BX]
MOV[SI],AL
INCBX
INCSI
LOOPFIND
实验结果分析:
这个程序完成了从偏移地址从200开始的24个内存单元的数值复制,初始偏移地址为SI=200H,要复制到偏移地址BX=230中,每复制一次,BX,SI都要做+1操作,循环,当做完CX=24次复制时,程序停止。
MOVAX,2000H
MOVDS,AX
MOVCX,40
MOVSI,5000H
MOVAL,0AAH
FIND:
INCSI
LOOPFIND
实验结果分析:
先把要赋值的AAH赋值给AL,然后设置循环次数CX=40,偏移地址为5000H,从5000H开始给内存单元赋值AAH,循环结束后完成40次赋值。
2.写一段程序把1,2,...,100共100个数写入偏移地址为0200H开始的100个单元中。
MOVCX,100
MOVAX,0;
SUM
MOVBX,1
JUMP:
ADDAX,BX
INCBL
DECCX
JNZJUMP
MOVSI,300H
MOV[SI],AX
1+2+3+...+100=1050,用16进制表示即13BA,结果正确(按照数据的存储规则低位在前高位在后)。
在本题目中,先给和赋初值0,BX=1~100,一共计算CX=100次,每次相加后BL即BX的值增加1,最终能算出正确结果。
二)寻址方式实践
分析:
执行第一条后,AX=2000.
执行第二条,DS=2000
使BX=0004
对SI赋值
把偏移地址为0002的内存单元的内容,即把12赋给AL,则AX=2012
把偏移地址为0004的内存单元的内容,即把14赋给AL,则AX=2014
把偏移地址为0040的内存单元的内容,即把14赋给AL,则AX=2000
把偏移地址为BX+4=0008的内存单元的内容,即把18赋给AL,则AX=2018
把偏移地址为SI+3=0043的内存单元的内容,即把33赋给AL,则AX=2033
把偏移地址为BX+SI=0044的内存单元的内容,即把44赋给AL,则AX=2044
把偏移地址为BX+SI+4=0048的内存单元的内容,即把88赋给AX,则AX=9988(按照低位在前高位在后的存储规则)
把偏移地址为AL=0088的内存单元的内容,即把88赋给BX+SI+20=0064所在的内存单元,值为0088
把4赋值给BP,BP=0004
把AX=9988赋值给BP+2=0006所在的内存单元,此时由SS=140D提供段地址
分析:
把AX的值+1,AX=9989
把AX=9989赋值给BX+2=0006所在的内存单元,DS提供段地址
压栈,栈顶指针SP=SP-2=-2即FFFE。
AX的内容送到SS:
SP=140D:
FFFE中,99在前,89在后,如图。
压栈,栈顶指针SP=SP-2=-4即FFFC。
BX的内容送到SS:
FFFC中,04在前,00在后,如图。
入栈,先把栈SS:
FFFC中的数据送到BX中,顶指针SP=SP+2=-2即FFFE。
MOVSI,40立即数寻址
MOVAL,[2]直接寻址2000:
0002
MOVAL,[BX]寄存器间接寻址2000:
:
0004
MOVAL,[SI]寄存器间接寻址2000:
0040
MOVAL,[BX+4]寄存器相对寻址2000:
0008
MOVAL,[SI+3]寄存器相对寻址2000:
0043
MOVAL,[BX+SI]基址变址寻址2000:
0044
MOVAX,[BX+SI+4]基址变址相对寻址2000:
0048
MOV[BX+SI+20],AL基址变址相对寻址
MOVBP,4立即数寻址
MOVAX,3000H
MOVAX,4000H
MOVES,AX
MOVSI,10H
MOVDI,20H
MOVCX,16;
此处输入代码段代码
CLD
REPMOVSB
HLT
结果分析:
由于串指令指定源串地址为DS:
SI(支持段重设),目标串地址为ES:
DI(不支持段重设),因此程序开始先设定DS,SI,ES,DI的值,然后设定传送次数CX=16,接着有CLD设定DF=0即传送方向从低地址向高地址进行,再在无条件循环REP下使用字节传送指令MOVSB即可完成复制。
MOVDI,400H
MOVCX,40;
MOVAL,0AAH
REPSTOSB
MOVDI,450H
MOVCX,30;
MOVAL,55H
HLT
STOSB指令把AL中的字节存到由ES:
DI指向的存储单元中,因此需要先设定ES,DI的值,然后设定存储次数CX和存储方向DF,在无条件循环REP下实现两次地址不同的地址存储。
定义12个数,把它们的和放到SUM中;
找出它们中最大和最小的数,分别放到MAX和MIN单元中。
DATASSEGMENT
ARRAYDW2,1,4,8,5,3,7,6,9,12,10,11
SUMDW0
MAXDW0
MINDW0
;
此处输入数据段代码
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVCX,12
LEASI,SUM;
由于输出结果为ASCII码,此处直接记录地址方便调试
LEASI,MIN;
记录地址
LEASI,MAX;
LEASI,ARRAY;
MOVAX,0
ADDING:
ADDAX,[SI]
ADDSI,2
LOOPADDING
MOVSUM,AX
;
MOVAH,09
MOVDX,OFFSETSUM;
INT21H
MOVCX,12;
求最大值
LEASI,ARRAY
MOVAX,[SI]
DECCX
MAX1:
JCXZMINN
CMP[SI],AX
JLMAX1
JMPMAX1
MINN:
求最小值
MOVMAX,AX
MIN1:
JCXZENDING
JGMIN1
JMPMIN1
ENDING:
MOVMIN,AX
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
经过记录,SUM,MAX,MIN的偏移地址分别为0018,001A,001C.以下用D查看相关结果:
由上图可以知道,这12个数相加的和为4E(即10进制的78),最大值为C(10进制的12),最小值为1,结果正确。
程序主要思路:
先对12个数求和,不断地把SI指向的内存单元的数值累加到AX中,得到最终结果。
第二步求最大值,用AX存储,通过没比较一次CX减少1,共比较11次,每次把大的数值存储在AX中,最后把AX中的数值赋给MAX。
同理,第三部对12个数求最小值时,用AX存储,通过没比较一次CX减少1,共比较11次,每次把小的数值存储在AX中,最后把AX中的数值赋给MIN。
实验结论:
①通过这次实验,我能比较熟练地操作使用DEBUG了。
②常见的寻址方式有以下几种:
立即寻址,直接寻址,寄存器寻址,寄存器间接寻址,寄存器相对寻址,基址——变址寻址,基址——变址——相对寻址,隐含寻址。
③通过本次实验,能比较熟练地在MASM平台上编写程序了。
实验心得:
①做第一部分时,用到寄存器间接寻址,而用SI,DI,BX来指定有效地址时,段地址由DS提供,因此在代码中需要对DS进行设定。
②在ASM平台上写程序时,把AAH赋值给AL,注意要写成MOVAL,0AAH而不是MOVAL,AAH,否则会出错。
③做1~100求和的时候,要注意不能直接ADDAX,BL,因为BL8位AX16位,因此写成ADDAX,BX,而这么写的前提是BH=0,即提前赋值使得BX=0.
④使用串指令时要注意操作数的大小使用不同的指令。
⑤在求数组的最大值最小值时,一开始没有把CMP比较命令和JL跳转命令连在一起写,导致结果错误,原因是夹在条命令之间的命令对SF或者ZF做修改导致程序没有按照人的意愿跳转。