微机原理实验报告Word文档下载推荐.docx
《微机原理实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
)
DATAENDS
STACKSEGMENT
STADB20DUP(?
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,TOP
MOVSP,AX
MOVSI,OFFSETDATA1END
MOVDI,OFFSETDATA2END
CALLADDA
MOVAX,4C00H
INT21H
ADDAPROCNEAR
MOVDX,SI
MOVBP,DI
MOVBX,05H
AD1:
SUBBYTEPTR[SI],30H
SUBBYTEPTR[DI],30H
DECSI
DECDI
DECBX
JNZAD1
MOVSI,DX
MOVDI,BP
MOVCX,05H
CLC
AD2:
MOVAL,[SI]
MOVBL,[DI]
ADCAL,BL
AAA
MOV[SI],AL
DECSI
LOOPAD2
MOVDI,BP
AD3:
ADDBYTEPTR[SI],30H
ADDBYTEPTR[DI],30H
JNZAD3
RET
ADDAENDP
CODEENDS
ENDSTART
五、实验程序分析及预计结果
数据定义段省略分析
MOVSI,OFFSETDATA1END;
将DATA1的偏移地址给SI,SI中存放的是0004
MOVDI,OFFSETDATA2END;
将DATA2的偏移地址给DI,DI中存放的是0009
CALLADDA;
调用子程序ADDA
MOVAX,4C00H
INT21H
MOVDX,SI
MOVBP,DI
MOVBX,05H
SUBBYTEPTR[SI],30H;
将SI中的数值变为十进制数
SUBBYTEPTR[DI],30H;
将DI中的数值变为十进制数
DECSI;
将SI中的地址前移一位改变下一个数值
DECDI;
将DI中的地址前移一位改变下一个数值
DECBX;
定义循环的次数
JNZAD1;
在BX中的数值不等于0的情况下循环执行AD1
MOVSI,DX;
重新初始化SI
MOVDI,BP;
重新初始化DI
CLC;
将进位标志位清零
MOVBL,[DI]
ADCAL,BL;
将AL,BL中的数据用带进位的加法相加,保存到AL中
ADDBYTEPTR[SI],30H;
将十进制数转化为十六进制,并存到SI中
ADDBYTEPTR[DI],30H;
将十进制数转化为十六进制,并存到DI中
1、在数据段,定义了一个data1,分配的地址是00~04,data1end里面的内容是04h,且不占内存,定义的data2,分配的地址是05~09,类似的,data2end里面的内容是09h
2、在循环AD1过程中,data1里面的内容从开始的33h,39h,31h,37h,34h变为3,9,1,7,4;
data2里面的内容也从开始的34h,35h,30h,38h,32h变为4,5,0,8,2。
循环AD2就是实现数据的相加,不过此处还用到了ADC,也就是带进位的加法运算,所以此前就将CF清零了。
循环后data1里面的内容是8,4,2,5,6。
循环AD3后,data1里面的内容为38h,34h,32h,35h,36h;
data2里面的内容为34h,35h,30h,38h,32h.
循环结束后,返回到主程序,程序运行到INT21h结束。
也就是说实验最后的结果就是执行完循环AD3后,data1和data2中的内容。
结果保存在内存中,地址为00h~09h(ds:
000038343235363435303832)
六、实验结果如下:
七、实验总结
第一次做微机原理的实验,开始看了老师发给我们的实验内容和操作细节但是还是有很多的东西不是很清楚,感觉是模拟两可的。
在老师的讲解下,知道首先要将masm这个文件夹放在D盘里面,然后再在masm这个文件夹里面建一个文本文档,如xiangj.asm,然后再运行。
先masm.exexiangj.asm。
若程序报错,则要在记事本里面修改,直至编译没有错误为止,这时候会自动生成一个xiangj.obj文件。
然后链接,link.exexiangj.obj,执行之后敲xiangj.exe就可以运行程序了。
这是我觉得第一做微机原理的实验学习到最能让我永远记得的东西。
至于实验的程序,刚开始根本就看不懂,由于里面涉及的很多知识都是我们还没有学到的,这就给我们看程序以及程序的功能的阅读带来了很大的阻碍。
也直到现在,我才看懂这个程序。
我觉得做实验最重要的是细心和耐心,还有就是要预习。
那样才能够提前知道可能会出现什么样的状况,自己能有有余地去解决这个问题。
即使自己解决不了的能够在实验室的时候去问老师,在老师的讲解下能明白的更彻底些。
实验二排序实验
掌握用汇编语言编写排序程序的思路和方法。
将指定内存出开始的数据(最多为4位数)按从大到小的顺序排列。
第一个数字表示数据的个数(不是要比较的数值!
!
)。
三、程序流程图
图3-2
ADDRDW8,234,35,67,876,54,39,765,237
STADW32DUP(?
TOPDW
DATA,ES:
STACK
MOVES,AX
MOVSP,TOP
MOVCX,WORDPTRADDR[0]
DECCX
LOOP1:
MOVDI,CX
MOVBX,2
LOOP2:
MOVAX,WORDPTRADDR[BX]
CMPAX,WORDPTRADDR[BX+2]
JGECCC
XCHGAX,WORDPTRADDR[BX+2]
MOVWORDPTRADDR[BX],AX
CCC:
ADDBX,2
LOOPLOOP2
MOVCX,DI
LOOPLOOP1
EXIT:
ADDRDW8,234,35,67,876,54,39,765,237;
定义9个字,注意:
数字8是要排序的数据的个数
TOPDW?
MOVDS,AX
MOVES,AX
MOVAX,ACK
MOVSS,X
MOVSP,TOP
MOVCX,WORDPTRADDR[0];
将0008H赋给CX
DECCX;
将CX中的数据减1,用于控制循环次数
MOVDI,CX
MOVBX,2
MOVAX,WORDPTRADDR[BX];
将BX中的数据00EA(234)给AX
CMPAX,WORDPTRADDR[BX+2];
将下一个数据与00EA相比较
JGECCC;
比较之后AX中的数大于或等于BX+2中的数则跳转到执行CCC
XCHGAX,WORDPTRADDR[BX+2];
如果AX中的数小于BX+2中的数则交换两者的位置
MOVAX,4C00H;
跳出程序
预计结果:
经过分析程序的最后的排序结果是036C02FD00ED00EA0043003600270023
程序设计思路:
冒泡排序法
六、实验结果如下
七、实验中存在的问题及分析
1、看不懂程序还是主要的问题,开始看的时候不知道定义中的第一个数据是要排序的数据的个数
2、这个程序循环的次数比较多,没耐心去分析这个程序的功能。
3、有很多指令的功能不清楚,给分析程序带来了很大的困难。
实验三自编程序上机调试
选作业题中题目上机调试。
用汇编实现多位十六进制数相加
DATASEGMENT;
高位在前,个位最后
xdb0,45h,21h,0ADh,0CBh,54h,59h,44h,55H;
4521ADCB54594455H
ydb0,45h,21h,0BAh,0DCh,78h,59h,44h,55H;
4521BADC78594455H
zdb9dup(0);
累加和存放区
DATAENDS
;
CODESEGMENT
ASSUMECS:
DATA
START:
movax,DATA
movds,ax
movsi,offsety
decsi;
SI指向x的个位
movdi,offsetz
adddi,8;
指向z的个位
clc
movcx,9
next:
moval,[si];
逐位