微机原理实验报告Word文档下载推荐.docx
《微机原理实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告Word文档下载推荐.docx(8页珍藏版)》请在冰豆网上搜索。
For(k=0;
k<
50;
K++)Z[k]=Y-16*(k/4+210);
}
三、程序设计及分析
1.C语言分析:
有两个变量是int型,一个数组型;
还有一个循环执行过程。
2.汇编程序实现分析:
首先需要定义用户数据段,获得一个内存空间作为数组空间。
再选定几个寄存器作为K,Y以及输出,其中输出输出和Y可以合
用一个寄存器。
3.设计思路:
分配完空间地址后,最重要的是完成循环控制。
循环控制有
两个思路:
可以是先判断后循环;
或者是先循环后判断
即如图
开始开始
赋值
intK,Y;
intZ[50];
K=0;
Y=
计算
Z[K]=Y-16*(K/4+210);
K<
50
K=k+1
否
否是
结束
是
slti$t2,$t0,50#判断k是否于50slti$t2,$t0,50#判断k是否小于
50,
beq$t2,$t3($t2=1循环,否则结束。
)beq$t2,$0,#是则结束
#否,循环
四、程序实现及调试分析
1.汇编程序代码实现:
方法一
.data#定义用户数据段
z:
.space200#数组为int型,大小为50,所以占内存4*50
str:
.asciiz"
"
#输出结果之间的空隙
.textmain:
la$s0,z#$s0#为数组在z[]
li$t0,0#$s1#代表k计数,初始值为0
li$t1,56#$t2#代表Y,初值为56
loop:
slti$t2,$t0,50#判断k是否于50
beq$t2,$0,done#当k大于等于50,跳转结束
srl$t3,$t0,2#k/4
addi$t3,$t3,210#k/4+210
sll$t3,$t3,4#16*(k/4+210)
sub$t3,$t1,$t3#y-16*(k/4+210)
sw$t3,0($s0)#写进z[k]
li$v0,1#输出addi$a0,$s0,0syscall
li$v0,4#输出间隔
la$a0,str
syscall
addi$s0,$s0,4#地址移一位
addi$t0,$t0,1#k加1
jloop#循环
done:
li$v0,10
2.调试过程
1.编写程序:
详细见代码
2.装载程序
选择file,选择ReinitializeandLoadFile,把写好的文件导入QtSpim。
3.如果没有错误,便运行。
点击上图的小三角
运行之后点击不同的窗口便可得到我们想要的结果。
具体详细结果如
下图
内存占用情况映像
分析:
由图可知数组地址从0Xfffff318—0Xfffff258;
每行有四个是
一样的,总共50个地址。
这是因为数组含有50个元素,而int型数
据占4个字节空间,字对齐方式,所以连续四个地址是相同的
而且有上表也可以得出Qpstim仿真器是按大字节序
数据段内存映像
表格如下(数值都采用16进制)
内存地址变量值内存地址变量值
(16进(16进制)
名名
制)
fffff318Z[0]268500992fffff2b8Z[25]268501092
fffff318Z[1]268500996fffff2b8Z[26]268501096
fffff318Z[2]268501000fffff2b8Z[27]268501100
fffff318Z[3]268501004fffff2a8Z[28]268501104
fffff308Z[4]268501008fffff2a8Z[29]268501108
fffff308Z[5]268501012fffff2a8Z[30]268501112
fffff308Z[6]268501016fffff2a8Z[31]268501116
fffff308Z[7]268501020fffff298Z[32]268501120
fffff2f8Z[8]268501024fffff298Z[33]268501124
fffff2f8Z[9]268501028fffff298Z[34]268501128
fffff2f8Z[10]268501032fffff298Z[35]268501132
fffff2f8Z[11]268501036fffff288Z[36]268501136
fffff2e8Z[12]268501040fffff288Z[37]268501140
fffff2e8Z[13]268501044fffff288Z[38]268501144
fffff2e8Z[14]268501048fffff288Z[39]268501148
fffff2e8Z[15]268501052fffff278Z[40]268501152
fffff2d8Z[16]268501056fffff278Z[41]268501156
fffff2d8Z[17]268501060fffff278Z[42]268501160
fffff2d8Z[18]268501064fffff278Z[43]268501164
fffff2d8Z[19]268501068fffff268Z[44]268501168
fffff2c8Z[20]268501072fffff268Z[45]268501172
fffff2c8Z[21]268501076fffff268Z[46]268501176
fffff2c8Z[22]268501080fffff268Z[47]268501180
fffff2c8Z[23]268501084fffff258Z[48]268501184
fffff2b8Z[24]268501088fffff258Z[49]268501188
点击Window选择console得下图
运行结果显示
代码段内存映像
地址机器码汇编指令
[00400014]0c100009jal0x00400024[main]
[00400018]00000000nop
[0040001c]3402000aori$2,$0,10
[00400020]0000000csyscall
[00400024]3c101001lui$16,4097[z]
[00400028]34080000ori$8,$0,0[0040002c]34090038ori$9,$0,56[00400030]290a0032slti$10,$8,50
[00400034]11400010beq$10,$0,64[done-0x00400034]
[00400038]00085882srl$11,$8,2
[0040003c]216b00d2addi$11,$11,210
[00400040]000b5900sll$11,$11,4
[00400044]012b5822sub$11,$9,$11
[00400048]ae0b0000sw$11,0($16)
[0040004c]34020001ori$2,$0,1
[00400050]22040000addi$4,$16,0[00400054]0000000csyscall[00400058]34020004ori$2,$0,4
[0040005c]3c011001lui$1,4097[str]
[00400060]342400c8ori$4,$1,200[str]
[00400064]0000000csyscall
[00400068]22100004addi$16,$16,4
[0040006c]21080001addi$8,$8,1
[00400070]0810000cj0x00400030[loop]
[00400074]3402000aori$2,$0,10
[00400078]0000000csyscall
[80000180]0001d821addu$27,$0,$1
[80000184]3c019000lui$1,-28672
[80000188]ac220200sw$2,512($1)[8000018c]3c019000lui$1,-28672[80000190]ac240204sw$4,516($1)
[80000194]401a6800mfc0$26,$13
[80000198]001a2082srl$4,$26,2
[8000019c]3084001fandi$4,$4,31
[800001a0]34020004ori$2,$0,4
[800001a4]3c049000lui$4,-28672[__m1_][800001a8]0000000csyscall[800001ac]34020001ori$2,$0,1
[800001b0]001a2082srl$4,$26,2
[800001b4]3084001fandi$4,$4,31
[800001b8]0000000csyscall
[800001bc]34020004ori$2,$0,4
[800001c0]3344003candi$4,$26,60
[800001c4]3c019000lui$1,-28672
[800001c8]00240821addu$1,$1,$4
[800001cc]8c240180lw$4,384($1)[800001d0]00000000nop[800001d4]0000000csyscall
[800001d8]34010018ori$1,$0,24
[800001dc]143a0008bne$1,$26,32[ok_pc-0x800001dc]
[800001e0]00000000nop
[800001e4]40047000mfc0$4,$14
[800001e8]30840003andi$4,$4,3
[800001ec]10040004beq$0,$4,16[ok_pc-0x800001ec]
[800001f0]00000000nop
[800001f4]3402000aori$2,$0,10[800001f8]0000000csyscall[800001fc]34020004ori$2,$0,4
[80000200]3c019000lui$1,-28672[__m2_]
[80000204]3424000dori$4,$1,13[__m2_]
[80000208]0000000csyscall
[8000020c]001a2082srl$4,$26,2
[80000210]3084001fandi$4,$4,31
[80000214]14040002bne$0,$4,8[ret-0x80000214]
[80000218]00000000nop
[8000021c]401a7000mfc0$26,$14
[80000220]275a0004addiu$26,$26,4
[80000224]409a7000mtc0$26,$14
[80000228]3c019000lui$1,-28672
[8000022c]8c220200lw$2,512($1)[80000230]3c019000lui$1,-28672[80000234]8c240204lw$4,516($1)
[80000238]001b0821addu$1,$0,$27
[8000023c]40806800mtc0$0,$13
[80000240]401a6000mfc0$26,$12
[80000244]375a0001ori$26,$26,1
[80000248]409a6000mtc0$26,$12[8000024c]42000018eret
仿真器在真正的用户代码段内增加了部分代码以实现程序运行
控制,用户代码都必须存储在地址为0x00400000~0x00440000
的范围之内。
用户代码段将每一行代码的地址,及其对应的机器码都
显示给用户,为方便查看,还给出了反汇编得到的汇编指令,而且在
注释中显示了用户编写的源代码。
通过地址部分信息,我们知道每一
行代码的地址都是前一行代码地址+4,即PC+4,机器指令。
实验总结
1.本次试验让我对汇编程序的编写以及原理有力深刻的了
解。
还有语法规范。
书写技巧,如何对书写的程序一目
了然,层次清晰,还有养成多写注释习惯,既清晰自己
的思路,还有助于别人的阅读。
2.由于汇编与C语言有较大的差别,所以刚开始编写非常
不适应,编写程序不熟练,后面就好了一些。
首先要全
局观,对各个寄存器所代表的意义要清晰;
还要对程序
执行过程了如指掌,尤其是跳转部分,跳转条件,是相
等跳转,还是不相等跳转,是先循环在判断还是先循环
后判断。
3.基本掌握了Qtspim软件的应用和程序的调试工作,并
更深刻地理解了汇编语言中机器指令的执行方法。
对各
个窗口以及一些常用的菜单各个数据段的含义做到了一
一熟悉了解。
还有基本掌握了内存的分配区间。
4.还有最重要的是多练习。
虽然基本上现在的这些程序都
能做到看懂,但是一遇到让自己写的时候还是有许多艰
难的,熟能生巧嘛。