微机原理实验报告.docx

上传人:b****1 文档编号:2389029 上传时间:2023-05-03 格式:DOCX 页数:12 大小:84.82KB
下载 相关 举报
微机原理实验报告.docx_第1页
第1页 / 共12页
微机原理实验报告.docx_第2页
第2页 / 共12页
微机原理实验报告.docx_第3页
第3页 / 共12页
微机原理实验报告.docx_第4页
第4页 / 共12页
微机原理实验报告.docx_第5页
第5页 / 共12页
微机原理实验报告.docx_第6页
第6页 / 共12页
微机原理实验报告.docx_第7页
第7页 / 共12页
微机原理实验报告.docx_第8页
第8页 / 共12页
微机原理实验报告.docx_第9页
第9页 / 共12页
微机原理实验报告.docx_第10页
第10页 / 共12页
微机原理实验报告.docx_第11页
第11页 / 共12页
微机原理实验报告.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

微机原理实验报告.docx

《微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告.docx(12页珍藏版)》请在冰点文库上搜索。

微机原理实验报告.docx

微机原理实验报告

微机原理实验报告

实验名称:

MIPS汇编程序设计

院系:

电信学院

班级:

姓名:

指导老师:

 

一、实验目的:

1.熟悉MIPS汇编程序开发环境,学习使用Qtstim工具。

知道如何查看内存空间分配。

2. 了解C语言语句与汇编指令之间的关系。

3.掌握MIPS汇编程序设计 , 掌握QTSPIM的调试技术。

4. 了解MIPS汇编语言与机器语言之间的对应关系 。

5. 熟悉常见的MIPS汇编指令 6. 掌握程序的内存映像。

二、实验内容

1.用汇编程序实现以下伪代码:

要求使用移位指令实现乘除法运算。

Intmain()

{

IntK,Y;

IntZ[50];

Y=56;

For(k=0;k<50;K++)Z[k]=Y-16*(k/4+210);

}

三、程序设计及分析

语言分析:

有两个变量是int型,一个数组型;还有一个循环执行过程。

2.汇编程序实现分析:

首先需要定义用户数据段,获得一个内存空间作为数组空间。

再选定几个寄存器作为K,Y以及输出,其中输出输出和Y可以合用一个寄存器。

3.设计思路:

分配完空间地址后,最重要的是完成循环控制。

循环控制有两个思路:

可以是先判断后循环;或者是先循环后判断

即如图

 

否是

slti$t2,$t0,50#判断k是否于50

beq$t2,$t3($t2=1循环,否则结束。

 

四、程序实现及调试分析

1.汇编程序代码实现:

方法一

.data#定义用户数据段

z:

.space200#数组为int型,大小为50,所以占内存4*50

str:

.asciiz""#输出结果之间的空隙

.text

main:

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,0

syscall

li$v0,4#输出间隔

la$a0,str

syscall

 

addi$s0,$s0,4#地址移一位

addi$t0,$t0,1#k加1

jloop#循环

done:

li$v0,10

syscall

2.调试过程

1.编写程序:

详细见代码

2.装载程序

选择file,选择ReinitializeandLoadFile,把写好的文件导入QtSpim。

3.如果没有错误,便运行。

点击上图的小三角

运行之后点击不同的窗口便可得到我们想要的结果。

具体详细结果如下图

内存占用情况映像

分析:

由图可知数组地址从0Xfffff318—0Xfffff258;每行有四个是一样的,总共50个地址。

这是因为数组含有50个元素,而int型数据占4个字节空间,字对齐方式,所以连续四个地址是相同的

而且有上表也可以得出Qpstim仿真器是按大字节序

数据段内存映像

表格如下(数值都采用16进制)

内存地址(16进制)

变量名

内存地址(16进制)

变量名

fffff318

Z[0]

2

fffff2b8

Z[25]

2

fffff318

Z[1]

6

fffff2b8

Z[26]

6

fffff318

Z[2]

0

fffff2b8

Z[27]

0

fffff318

Z[3]

4

fffff2a8

Z[28]

4

fffff308

Z[4]

8

fffff2a8

Z[29]

8

fffff308

Z[5]

2

fffff2a8

Z[30]

2

fffff308

Z[6]

6

fffff2a8

Z[31]

6

fffff308

Z[7]

0

fffff298

Z[32]

0

fffff2f8

Z[8]

4

fffff298

Z[33]

4

fffff2f8

Z[9]

8

fffff298

Z[34]

8

fffff2f8

Z[10]

2

fffff298

Z[35]

2

fffff2f8

Z[11]

6

fffff288

Z[36]

6

fffff2e8

Z[12]

0

fffff288

Z[37]

0

fffff2e8

Z[13]

4

fffff288

Z[38]

4

fffff2e8

Z[14]

8

fffff288

Z[39]

8

fffff2e8

Z[15]

2

fffff278

Z[40]

2

fffff2d8

Z[16]

6

fffff278

Z[41]

6

fffff2d8

Z[17]

0

fffff278

Z[42]

0

fffff2d8

Z[18]

4

fffff278

Z[43]

4

fffff2d8

Z[19]

8

fffff268

Z[44]

8

fffff2c8

Z[20]

2

fffff268

Z[45]

2

fffff2c8

Z[21]

6

fffff268

Z[46]

6

fffff2c8

Z[22]

0

fffff268

Z[47]

0

fffff2c8

Z[23]

4

fffff258

Z[48]

4

fffff2b8

Z[24]

8

fffff258

Z[49]

8

 

点击Window选择console得下图

运行结果显示

代码段内存映像

地址机器码汇编指令

[00400014]0c100009  jal0x00400024[main]    

[00400018]00000000  nop                      

[0040001c]3402000a  ori$2,$0,10          

[00400020]0000000c  syscall                

[00400024]3c101001  lui$16,4097[z]       

[00400028]  ori$8,$0,0            

[0040002c]  ori$9,$0,56           

[00400030]290a0032  slti$10,$8,50         

[00400034]  beq$10,$0,64[done-0x00400034]

[00400038]00085882  srl$11,$8,2          

[0040003c]216b00d2  addi$11,$11,210      

[00400040]000b5900  sll$11,$11,4        

[00400044]012b5822  sub$11,$9,$11      

[00400048]ae0b0000  sw$11,0($16)         

[0040004c]  ori$2,$0,1       

[00400050]  addi$4,$16,0        

[00400054]0000000c  syscall                 

[00400058]  ori$2,$0,4           

地址机器码汇编指令

[0040005c]3c011001  lui$1,4097[str]       

[00400060]342400c8  ori$4,$1,200[str]   

[00400064]0000000c  syscall                  

[00400068]  addi$16,$16,4        

[0040006c]  addi$8,$8,1           

[00400070]0810000c  j0x00400030[loop]      

[00400074]3402000a  ori$2,$0,10           

[00400078]0000000c  syscall                  

[]0001d821  addu$27,$0,$1       

[]3c019000  lui$1,-28672          

[]ac220200  sw$2,512($1)          

[8000018c]3c019000  lui$1,-28672         

[]ac240204  sw$4,516($1)          

[]401a6800  mfc0$26,$13           

[]001a2082  srl$4,$26,2           

[8000019c]3084001f  andi$4,$4,31          

[800001a0]  ori$2,$0,4           

[800001a4]3c049000  lui$4,-28672[__m1_]  

[800001a8]0000000c  syscall                 

[800001ac]  ori$2,$0,1            

[800001b0]001a2082  srl$4,$26,2           

[800001b4]3084001f  andi$4,$4,31         

[800001b8]0000000c  syscall                 

[800001bc]  ori$2,$0,4           

[800001c0]3344003c  andi$4,$26,60         

[800001c4]3c019000  lui$1,-28672           

[800001c8]00240821  addu$1,$1,$4         

[800001cc]8c240180  lw$4,384($1)          

[800001d0]00000000  nop                      

[800001d4]0000000c  syscall                 

[800001d8]  ori$1,$0,24          

[800001dc]143a0008  bne$1,$26,32[ok_pc-0x800001dc]

[800001e0]00000000  nop                     

[800001e4]  mfc0$4,$14             

[800001e8]  andi$4,$4,3          

[800001ec]  beq$0,$4,16[ok_pc-0x800001ec]

[800001f0]00000000  nop                      

[800001f4]3402000a  ori$2,$0,10          

[800001f8]0000000c  syscall                  

[800001fc]  ori$2,$0,4            

[]3c019000  lui$1,-28672[__m2_]   

地址机器码汇编指令

[]3424000d  ori$4,$1,13[__m2_]  

[]0000000c  syscall                 

[8000020c]001a2082  srl$4,$26,2          

[]3084001f  andi$4,$4,31         

[]  bne$0,$4,8[ret-0x]

[]00000000  nop                      

[8000021c]401a7000  mfc0$26,$14           

[]275a0004  addiu$26,$26,4        

[]409a7000  mtc0$26,$14           

[]3c019000  lui$1,-28672           

[8000022c]8c220200  lw$2,512($1)         

[]3c019000  lui$1,-28672          

[]8c240204  lw$4,516($1)         

[]001b0821  addu$1,$0,$27         

[8000023c]  mtc0$0,$13             

[]401a6000  mfc0$26,$12           

[]375a0001  ori$26,$26,1         

[]409a6000  mtc0$26,$12            

[8000024c]  eret                    

仿真器在真正的用户代码段内增加了部分代码以实现程序运行控制,用户代码都必须存储在地址为0x00400000~0x00440000的范围之内。

用户代码段将每一行代码的地址,及其对应的机器码都显示给用户,为方便查看,还给出了反汇编得到的汇编指令,而且在注释中显示了用户编写的源代码。

通过地址部分信息,我们知道每一行代码的地址都是前一行代码地址+4,即PC+4,机器指令。

实验总结

1.本次试验让我对汇编程序的编写以及原理有力深刻的了解。

还有语法规范。

书写技巧,如何对书写的程序一目了然,层次清晰,还有养成多写注释习惯,既清晰自己的思路,还有助于别人的阅读。

2.由于汇编与C语言有较大的差别,所以刚开始编写非常不适应,编写程序不熟练,后面就好了一些。

首先要全局观,对各个寄存器所代表的意义要清晰;还要对程序执行过程了如指掌,尤其是跳转部分,跳转条件,是相等跳转,还是不相等跳转,是先循环在判断还是先循环后判断。

3.基本掌握了Qtspim软件的应用和程序的调试工作,并更深刻地理解了汇编语言中机器指令的执行方法。

对各个窗口以及一些常用的菜单各个数据段的含义做到了一一熟悉了解。

还有基本掌握了内存的分配区间。

4.还有最重要的是多练习。

虽然基本上现在的这些程序都能做到看懂,但是一遇到让自己写的时候还是有许多艰难的,熟能生巧嘛。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2