本实验要用到汇编器PCSpim,软件我放到百度网盘里面了
链接: https://pan.baidu.com/s/1dtY9xkC9MWD1jVuDkLN4aQ
密码: d9wu
实验要求:
1)编写test.asm文件,在PCSpim中打开它,并使用单步执行和连续执行方式运行该程序,不需要设置为裸机执行方式(Bare Machine)。
test.asm代码
main: li $v0, 5
syscall
move $t0, $v0
li $v0, 5
syscall
move $t1, $v0
bgt $t0, $t1, t0_bigger
move $t2, $t1
b endif
t0_bigger: move $t2, $t0
endif: move $a0, $t2
li $v0, 1
syscall
jr $ra;
2)编写R_CPU_Test.asm文件,并在PCSpim中单步运行,观察各个寄存器的值是否和预期的一致。注意:为了能正确执行R_CPU_Test.asm程序,要将模拟器设置为裸机执行方式。
R_CPU_Test.asm代码(#预期结果)
nor $1 ,$0 ,$0 ; #$1 =FFFF_FFFF
sltu $2 ,$0 ,$1 ; #$2 =0000_0001
add $3 ,$2 ,$2 ; #$3 =0000_0002
add $4 ,$3 ,$2 ; #$4 =0000_0003
add $5 ,$4 ,$3 ; #$5 =0000_0005
add $6 ,$5 ,$3 ; #$6 =0000_0007
sllv $7 ,$6 ,$2 ; #$7 =0000_000E
add $9 ,$5 ,$6 ; #$9 =0000_000C
sllv $8 ,$6 ,$9 ; #$8 =0000_7000
xor $9 ,$1 ,$8 ; #$9 =FFFF_8FFF
add $10,$9 ,$1 ; #$10=FFFF_8FFE
sub $11,$8 ,$7 ; #$11=0000_6FF2
sub $12,$7 ,$8 ; #$12=FFFF_900E
and $13,$9 ,$12; #$13=FFFF_800E
or $14,$9 ,$12; #$14=FFFF_9FFF
or $15,$6 ,$7 ; #$15=0000_000F
nor $16,$6 ,$7 ; #$16=FFFF_FFF0
add $17,$7 ,$3 ; #$17=0000_0010
sllv $18,$8 ,$17; #$18=7000_0000
sllv $19,$3 ,$17; #$19=0002_0000
sllv $20,$19,$7 ; #$20=8000_0000
add $21,$20,$1 ; #$21=7FFF_FFFF
or $22,$18,$21; #$22=7FFF_FFFF
add $23,$20,$22; #$23=FFFF_FFFF
sub $24,$20,$22; #$24=0000_0001
sub $25,$22,$20; #$25=FFFF_FFFF
xor $26,$18,$1 ; #$26=8FFF_FFFF
sltu $27,$22,$20; #$27=0000_0001
sltu $28,$26,$20; #$28=0000_0000
add $29,$22,$2 ; #$29=8000_0000
sub $30,$20,$2 ; #$30=7FFF_FFFF
add $31,$11,$26; #$30=9000_6FF1
3)将上述程序的指令代码逐条摘录出来,复制至ROM IP关联文件*.coe中,供后继实验使用。
PCSpim使用教程:
测试结果:
Test.asm装载之后,一直点单步运行,程序要求我们在控制台输入两个数,之后输出结果。
虽然看不懂汇编,根据输入输出,可以猜测,程序的功能就是找出较小数。
R_CPU_Test.asm装载之后,单步运行,发现到了0x00400014就跑不动了。点击go,跳转到0x00400024继续单步运行。发现寄存器结果与预期完全一致。
寄存器 | 内容 | 寄存器 | 内容 | 寄存器 | 内容 |
$0 | 0x00000000 | $11 | 0x00006ff2 | $22 | 0x70000000 |
$1 | 0xffffffff | $12 | 0xffff900e | $23 | 0xf0000000 |
$2 | 0x00000001 | $13 | 0xffff800e | $24 | 0x00000000 |
$3 | 0x00000002 | $14 | 0xffff9fff | $25 | 0x00000000 |
$4 | 0x00000003 | $15 | 0x0000000f | $26 | 0x3000ff13 |
$5 | 0x00000005 | $16 | 0xfffffff0 | $27 | 0xffffffff |
$6 | 0x00000007 | $17 | 0x00000010 | $28 | 0x00000000 |
$7 | 0x0000000e | $18 | 0x70000000 | $29 | 0x70000001 |
$8 | 0x00007000 | $19 | 0x00020000 | $30 | 0x00000000 |
$9 | 0xffff8fff | $20 | 0x80000000 | $31 | 0x30016f05 |
$10 | 0xffff8ffe | $21 | 0x00000000 |
保存日志文件(Save Log File)
R_CPU_Test.coe机器码
memory_initialization_radix=16;
memory_initialization_vector=00000827 0001102b 00421820 00622020 00832820 00a33020 00463804 00a64820 01264004
00284826 01215020 01075822 00e86022 012c6824 012c7025 00c77825 00c78027 00e38820 02289004 02239804 00f3a004
0281a820 0255b025 0296b820 0296c022 02d4c822 0241d026 02d4d82b 0354e02b 02c2e820 0282f022 017af820;