2024年2月24日发(作者:蒙盼香)
实用文档
微机原理实验报告
实验名称:MIPS汇编程序设计
院系:电信学院
班级:
姓名:
指导老师:
一、
实验目的:
1.熟悉MIPS汇编程序开发环境,学习使用Qtstim工具。知道如何查看内存空间分配。
2. 了解C语言语句与汇编指令之间的关系。
.
实用文档
3. 掌握MIPS汇编程序设计 , 掌握QTSPIM的调试技术。
4. 了解MIPS汇编语言与机器语言之间的对应关系 。
5. 熟悉常见的MIPS汇编指令 6. 掌握程序的内存映像。
二、实验内容
1.用汇编程序实现以下伪代码:要求使用移位指令实现乘除法运算。
Int main ()
{
Int K,Y;
Int Z[50];
Y=56;
For(k=0;k<50;K++) Z[k]=Y-16*(k/4+210);
}
三、程序设计及分析
1.C语言分析:
有两个变量是int型,一个数组型;还有一个循环执行过程。
2.汇编程序实现分析:
首先需要定义用户数据段,获得一个内存空间作为数组空间。再选定几个存放器作为K,Y以及输出,其中输出输出和Y可以合用一个存放器。
3.设计思路:
分配完空间地址后,最重要的是完成循环控制。循环控制有.
实用文档
两个思路:可以是先判断后循环;或者是先循环后判断
即如图
Z[K] = Y - 16 * ( K / 4 + 210) ;
K<50
K=k+1
赋值
int K, Y ;int Z[50] ;K=0;Y =
赋值
int K, Y ;int Z[50] ;K=0;Y =
开始
开始
计算
Z[K] = Y - 16 * ( K / 4 + 210) ;
计算
否
K=k+1
K<50
否 是
结束
是
结束
slti $t2,$t0,50 #判断k是否于50
beq $t2,$t3〔$t2=1循环,否那么结束。〕
slti $t2,$t0,50 #判断k是否小于50,
beq $t2,$0,#是那么结束
#否,循环
四、程序实现及调试分析
1.
方法一
.
汇编程序代码实现:
实用文档
.data #定义用户数据段
z:.space 200 #数组为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
j loop #循环
done:
li $v0,10
syscall
2.调试过程
1.
2.
编写程序:详细见代码
装载程序
.
实用文档
选择file,选择Reinitialize and Load File,把写好的文件导入QtSpim。
3.
运行之后点击不同的窗口便可得到我们想要的结果。具体详细结果如下列图
如果没有错误,便运行。点击上图的小三角
内存占用情况映像
分析:由图可知数组地址从0Xfffff318—0Xfffff258;每行有四个是一样的,总共50个地址。这是因为数组含有50个元素,而int型数据占4个字节空间,字对齐方式,所以连续四个地址是相同的
而且有上表也可以得出Qpstim仿真器是按大字节序
数据段内存映像
表格如下〔数值都采用16进制〕
.
实用文档
内存地址〔16进制〕
fffff318
fffff318
fffff318
fffff318
fffff308
fffff308
fffff308
fffff308
fffff2f8
fffff2f8
fffff2f8
fffff2f8
fffff2e8
fffff2e8
fffff2e8
fffff2e8
fffff2d8
fffff2d8
fffff2d8
fffff2d8
fffff2c8
fffff2c8
fffff2c8
fffff2c8
fffff2b8
变量名
Z[0]
Z[1]
Z[2]
Z[3]
Z[4]
Z[5]
Z[6]
Z[7]
Z[8]
Z[9]
Z[10]
Z[11]
Z[12]
Z[13]
Z[14]
Z[15]
Z[16]
Z[17]
Z[18]
Z[19]
Z[20]
Z[21]
Z[22]
Z[23]
Z[24]
值 内存地址变量〔16进制〕 名
fffff2b8
fffff2b8
fffff2b8
fffff2a8
fffff2a8
fffff2a8
fffff2a8
fffff298
fffff298
fffff298
fffff298
fffff288
fffff288
fffff288
fffff288
fffff278
fffff278
fffff278
fffff278
fffff268
fffff268
fffff268
fffff268
fffff258
fffff258
Z[25]
Z[26]
Z[27]
Z[28]
Z[29]
Z[30]
Z[31]
Z[32]
Z[33]
Z[34]
Z[35]
Z[36]
Z[37]
Z[38]
Z[39]
Z[40]
Z[41]
Z[42]
Z[43]
Z[44]
Z[45]
Z[46]
Z[47]
Z[48]
Z[49]
值
268500992
268500996
268501000
268501004
268501008
268501012
268501016
268501020
268501024
268501028
268501032
268501036
268501040
268501044
268501048
268501052
268501056
268501060
268501064
268501068
268501072
268501076
268501080
268501084
268501088
268501092
268501096
268501100
268501104
268501108
268501112
268501116
268501120
268501124
268501128
268501132
268501136
268501140
268501144
268501148
268501152
268501156
268501160
268501164
268501168
268501172
268501176
268501180
268501184
268501188
点击Window选择console得下列图
运行结果显示
.
实用文档
代码段内存映像
地址 机器码 汇编指令
[00400014] 0c100009 jal 0x00400024 [main]
[00400018] 00000000 nop
[0040001c] 3402000a ori $2, $0, 10
[00400020] 0000000c syscall
[00400024] 3c101001 lui $16, 4097 [z]
[00400028] 34080000 ori $8, $0, 0
[0040002c] 34090038 ori $9, $0, 56
[00400030] 290a0032 slti $10, $8, 50
[00400034] 11400010 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] 34020001 ori $2, $0, 1
[00400050] 22040000 addi $4, $16, 0
[00400054] 0000000c syscall
[00400058] 34020004 ori $2, $0, 4
地址 机器码 汇编指令
[0040005c] 3c011001 lui $1, 4097 [str]
.
实用文档
[00400060] 342400c8 ori $4, $1, 200 [str]
[00400064] 0000000c syscall
[00400068] 22100004 addi $16, $16, 4
[0040006c] 21080001 addi $8, $8, 1
[00400070] 0810000c j 0x00400030 [loop]
[00400074] 3402000a ori $2, $0, 10
[00400078] 0000000c syscall
[80000180] 0001d821 addu $27, $0, $1
[80000184] 3c019000 lui $1, -28672
[80000188] ac220210 sw $2, 512($1)
[8000018c] 3c019000 lui $1, -28672
[80000190] ac240204 sw $4, 516($1)
[80000194] 401a6800 mfc0 $26, $13
[80000198] 001a2082 srl $4, $26, 2
[8000019c] 3084001f andi $4, $4, 31
[800001a0] 34020004 ori $2, $0, 4
[800001a4] 3c049000 lui $4, -28672 [__m1_]
[800001a8] 0000000c syscall
[800001ac] 34020001 ori $2, $0, 1
[800001b0] 001a2082 srl $4, $26, 2
[800001b4] 3084001f andi $4, $4, 31
[800001b8] 0000000c syscall
[800001bc] 34020004 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] 34010018 ori $1, $0, 24
[800001dc] 143a0008 bne $1, $26, 32 [ok_pc-0x800001dc]
[800001e0] 00000000 nop
[800001e4] 40047000 mfc0 $4, $14
[800001e8] 30840003 andi $4, $4, 3
[800001ec] 10040004 beq $0, $4, 16 [ok_pc-0x800001ec]
[800001f0] 00000000 nop
[800001f4] 3402000a ori $2, $0, 10
[800001f8] 0000000c syscall
[800001fc] 34020004 ori $2, $0, 4
[80000200] 3c019000 lui $1, -28672 [__m2_]
地址 机器码 汇编指令
[80000204] 3424000d ori $4, $1, 13 [__m2_]
.
实用文档
[80000208] 0000000c syscall
[8000020c] 001a2082 srl $4, $26, 2
[80000210] 3084001f andi $4, $4, 31
[80000214] 14040002 bne $0, $4, 8 [ret-0x80000214]
[80000218] 00000000 nop
[8000021c] 401a7000 mfc0 $26, $14
[80000220] 275a0004 addiu $26, $26, 4
[80000224] 409a7000 mtc0 $26, $14
[80000228] 3c019000 lui $1, -28672
[8000022c] 8c220210 lw $2, 512($1)
[80000230] 3c019000 lui $1, -28672
[80000234] 8c240204 lw $4, 516($1)
[80000238] 001b0821 addu $1, $0, $27
[8000023c] 40806800 mtc0 $0, $13
[80000240] 401a6000 mfc0 $26, $12
[80000244] 375a0001 ori $26, $26, 1
[80000248] 409a6000 mtc0 $26, $12
[8000024c] 42000018 eret
仿真器在真正的用户代码段内增加了局部代码以实现程序运行控制,用户代码都必须存储在地址为0x00400000~0x00440000的范围之内。用户代码段将每一行代码的地址,及其对应的机器码都显示给用户,为方便查看,还给出了反汇编得到的汇编指令,而且在注释中显示了用户编写的源代码。通过地址局部信息,我们知道每一行代码的地址都是前一行代码地址+4,即PC+4,机器指令。
实验总结
1. 本次试验让我对汇编程序的编写以及原理有力深刻的了解。还有语法标准。书写技巧,如何对书写的程序一目了然,层次清晰,还有养成多写注释习惯,既清晰自己的思路,还有助于别人的阅读。
.
2.
3.
4.
.
实用文档
由于汇编与C语言有较大的差异,所以刚开始编写非常不适应,编写程序不熟练,后面就好了一些。首先要全局观,对各个存放器所代表的意义要清晰;还要对程序执行过程了如指掌,尤其是跳转局部,跳转条件,是相等跳转,还是不相等跳转,是先循环在判断还是先循环后判断。
根本掌握了Qtspim软件的应用和程序的调试工作,并更深刻地理解了汇编语言中机器指令的执行方法。对各个窗口以及一些常用的菜单各个数据段的含义做到了一一熟悉了解。还有根本掌握了内存的分配区间。
还有最重要的是多练习。虽然根本上现在的这些程序都能做到看懂,但是一遇到让自己写的时候还是有许多艰难的,熟能生巧嘛。
2024年2月24日发(作者:蒙盼香)
实用文档
微机原理实验报告
实验名称:MIPS汇编程序设计
院系:电信学院
班级:
姓名:
指导老师:
一、
实验目的:
1.熟悉MIPS汇编程序开发环境,学习使用Qtstim工具。知道如何查看内存空间分配。
2. 了解C语言语句与汇编指令之间的关系。
.
实用文档
3. 掌握MIPS汇编程序设计 , 掌握QTSPIM的调试技术。
4. 了解MIPS汇编语言与机器语言之间的对应关系 。
5. 熟悉常见的MIPS汇编指令 6. 掌握程序的内存映像。
二、实验内容
1.用汇编程序实现以下伪代码:要求使用移位指令实现乘除法运算。
Int main ()
{
Int K,Y;
Int Z[50];
Y=56;
For(k=0;k<50;K++) Z[k]=Y-16*(k/4+210);
}
三、程序设计及分析
1.C语言分析:
有两个变量是int型,一个数组型;还有一个循环执行过程。
2.汇编程序实现分析:
首先需要定义用户数据段,获得一个内存空间作为数组空间。再选定几个存放器作为K,Y以及输出,其中输出输出和Y可以合用一个存放器。
3.设计思路:
分配完空间地址后,最重要的是完成循环控制。循环控制有.
实用文档
两个思路:可以是先判断后循环;或者是先循环后判断
即如图
Z[K] = Y - 16 * ( K / 4 + 210) ;
K<50
K=k+1
赋值
int K, Y ;int Z[50] ;K=0;Y =
赋值
int K, Y ;int Z[50] ;K=0;Y =
开始
开始
计算
Z[K] = Y - 16 * ( K / 4 + 210) ;
计算
否
K=k+1
K<50
否 是
结束
是
结束
slti $t2,$t0,50 #判断k是否于50
beq $t2,$t3〔$t2=1循环,否那么结束。〕
slti $t2,$t0,50 #判断k是否小于50,
beq $t2,$0,#是那么结束
#否,循环
四、程序实现及调试分析
1.
方法一
.
汇编程序代码实现:
实用文档
.data #定义用户数据段
z:.space 200 #数组为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
j loop #循环
done:
li $v0,10
syscall
2.调试过程
1.
2.
编写程序:详细见代码
装载程序
.
实用文档
选择file,选择Reinitialize and Load File,把写好的文件导入QtSpim。
3.
运行之后点击不同的窗口便可得到我们想要的结果。具体详细结果如下列图
如果没有错误,便运行。点击上图的小三角
内存占用情况映像
分析:由图可知数组地址从0Xfffff318—0Xfffff258;每行有四个是一样的,总共50个地址。这是因为数组含有50个元素,而int型数据占4个字节空间,字对齐方式,所以连续四个地址是相同的
而且有上表也可以得出Qpstim仿真器是按大字节序
数据段内存映像
表格如下〔数值都采用16进制〕
.
实用文档
内存地址〔16进制〕
fffff318
fffff318
fffff318
fffff318
fffff308
fffff308
fffff308
fffff308
fffff2f8
fffff2f8
fffff2f8
fffff2f8
fffff2e8
fffff2e8
fffff2e8
fffff2e8
fffff2d8
fffff2d8
fffff2d8
fffff2d8
fffff2c8
fffff2c8
fffff2c8
fffff2c8
fffff2b8
变量名
Z[0]
Z[1]
Z[2]
Z[3]
Z[4]
Z[5]
Z[6]
Z[7]
Z[8]
Z[9]
Z[10]
Z[11]
Z[12]
Z[13]
Z[14]
Z[15]
Z[16]
Z[17]
Z[18]
Z[19]
Z[20]
Z[21]
Z[22]
Z[23]
Z[24]
值 内存地址变量〔16进制〕 名
fffff2b8
fffff2b8
fffff2b8
fffff2a8
fffff2a8
fffff2a8
fffff2a8
fffff298
fffff298
fffff298
fffff298
fffff288
fffff288
fffff288
fffff288
fffff278
fffff278
fffff278
fffff278
fffff268
fffff268
fffff268
fffff268
fffff258
fffff258
Z[25]
Z[26]
Z[27]
Z[28]
Z[29]
Z[30]
Z[31]
Z[32]
Z[33]
Z[34]
Z[35]
Z[36]
Z[37]
Z[38]
Z[39]
Z[40]
Z[41]
Z[42]
Z[43]
Z[44]
Z[45]
Z[46]
Z[47]
Z[48]
Z[49]
值
268500992
268500996
268501000
268501004
268501008
268501012
268501016
268501020
268501024
268501028
268501032
268501036
268501040
268501044
268501048
268501052
268501056
268501060
268501064
268501068
268501072
268501076
268501080
268501084
268501088
268501092
268501096
268501100
268501104
268501108
268501112
268501116
268501120
268501124
268501128
268501132
268501136
268501140
268501144
268501148
268501152
268501156
268501160
268501164
268501168
268501172
268501176
268501180
268501184
268501188
点击Window选择console得下列图
运行结果显示
.
实用文档
代码段内存映像
地址 机器码 汇编指令
[00400014] 0c100009 jal 0x00400024 [main]
[00400018] 00000000 nop
[0040001c] 3402000a ori $2, $0, 10
[00400020] 0000000c syscall
[00400024] 3c101001 lui $16, 4097 [z]
[00400028] 34080000 ori $8, $0, 0
[0040002c] 34090038 ori $9, $0, 56
[00400030] 290a0032 slti $10, $8, 50
[00400034] 11400010 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] 34020001 ori $2, $0, 1
[00400050] 22040000 addi $4, $16, 0
[00400054] 0000000c syscall
[00400058] 34020004 ori $2, $0, 4
地址 机器码 汇编指令
[0040005c] 3c011001 lui $1, 4097 [str]
.
实用文档
[00400060] 342400c8 ori $4, $1, 200 [str]
[00400064] 0000000c syscall
[00400068] 22100004 addi $16, $16, 4
[0040006c] 21080001 addi $8, $8, 1
[00400070] 0810000c j 0x00400030 [loop]
[00400074] 3402000a ori $2, $0, 10
[00400078] 0000000c syscall
[80000180] 0001d821 addu $27, $0, $1
[80000184] 3c019000 lui $1, -28672
[80000188] ac220210 sw $2, 512($1)
[8000018c] 3c019000 lui $1, -28672
[80000190] ac240204 sw $4, 516($1)
[80000194] 401a6800 mfc0 $26, $13
[80000198] 001a2082 srl $4, $26, 2
[8000019c] 3084001f andi $4, $4, 31
[800001a0] 34020004 ori $2, $0, 4
[800001a4] 3c049000 lui $4, -28672 [__m1_]
[800001a8] 0000000c syscall
[800001ac] 34020001 ori $2, $0, 1
[800001b0] 001a2082 srl $4, $26, 2
[800001b4] 3084001f andi $4, $4, 31
[800001b8] 0000000c syscall
[800001bc] 34020004 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] 34010018 ori $1, $0, 24
[800001dc] 143a0008 bne $1, $26, 32 [ok_pc-0x800001dc]
[800001e0] 00000000 nop
[800001e4] 40047000 mfc0 $4, $14
[800001e8] 30840003 andi $4, $4, 3
[800001ec] 10040004 beq $0, $4, 16 [ok_pc-0x800001ec]
[800001f0] 00000000 nop
[800001f4] 3402000a ori $2, $0, 10
[800001f8] 0000000c syscall
[800001fc] 34020004 ori $2, $0, 4
[80000200] 3c019000 lui $1, -28672 [__m2_]
地址 机器码 汇编指令
[80000204] 3424000d ori $4, $1, 13 [__m2_]
.
实用文档
[80000208] 0000000c syscall
[8000020c] 001a2082 srl $4, $26, 2
[80000210] 3084001f andi $4, $4, 31
[80000214] 14040002 bne $0, $4, 8 [ret-0x80000214]
[80000218] 00000000 nop
[8000021c] 401a7000 mfc0 $26, $14
[80000220] 275a0004 addiu $26, $26, 4
[80000224] 409a7000 mtc0 $26, $14
[80000228] 3c019000 lui $1, -28672
[8000022c] 8c220210 lw $2, 512($1)
[80000230] 3c019000 lui $1, -28672
[80000234] 8c240204 lw $4, 516($1)
[80000238] 001b0821 addu $1, $0, $27
[8000023c] 40806800 mtc0 $0, $13
[80000240] 401a6000 mfc0 $26, $12
[80000244] 375a0001 ori $26, $26, 1
[80000248] 409a6000 mtc0 $26, $12
[8000024c] 42000018 eret
仿真器在真正的用户代码段内增加了局部代码以实现程序运行控制,用户代码都必须存储在地址为0x00400000~0x00440000的范围之内。用户代码段将每一行代码的地址,及其对应的机器码都显示给用户,为方便查看,还给出了反汇编得到的汇编指令,而且在注释中显示了用户编写的源代码。通过地址局部信息,我们知道每一行代码的地址都是前一行代码地址+4,即PC+4,机器指令。
实验总结
1. 本次试验让我对汇编程序的编写以及原理有力深刻的了解。还有语法标准。书写技巧,如何对书写的程序一目了然,层次清晰,还有养成多写注释习惯,既清晰自己的思路,还有助于别人的阅读。
.
2.
3.
4.
.
实用文档
由于汇编与C语言有较大的差异,所以刚开始编写非常不适应,编写程序不熟练,后面就好了一些。首先要全局观,对各个存放器所代表的意义要清晰;还要对程序执行过程了如指掌,尤其是跳转局部,跳转条件,是相等跳转,还是不相等跳转,是先循环在判断还是先循环后判断。
根本掌握了Qtspim软件的应用和程序的调试工作,并更深刻地理解了汇编语言中机器指令的执行方法。对各个窗口以及一些常用的菜单各个数据段的含义做到了一一熟悉了解。还有根本掌握了内存的分配区间。
还有最重要的是多练习。虽然根本上现在的这些程序都能做到看懂,但是一遇到让自己写的时候还是有许多艰难的,熟能生巧嘛。