假设从main中的第一行开始计算代码中的R,I和J指令的数量。我已将代码更新为所有建议,但结果似乎仍然不正确。 :(
编辑:添加了那些语法更改,变量看起来效果更好,但循环似乎根本没有正确运行。有人看到任何明显的问题吗?EDIT2:如何更改循环以使$ t1一次旋转1个指令集?这是我现在的关键问题,而不是新mips用户的愚蠢语法。
EDIT3:我已将代码更新为所有建议,但结果似乎仍然不正确。 :(
.text
Main:
la $t1, 0x400000
li $t5, 0
li $t3, 2
li $t4, 3
li $t2, 0
la $s0, 0x400000
loop:
lw $t1, 0($s0)
addi $s0, 4
addi $t5, 1
beq $t5, 20 exit
srl $s4, $t1, 26
beq $s4, $t2 R
beq $s4, $t3 J
beq $s4, $t4 J
addi $s3, 1
j loop
R:
addi $s1, 1
j loop
J:
addi $s2, 1
j loop
exit:
sw $s1, RType
sw $s2, JType
sw $s3, IType
jr $ra
答案 0 :(得分:1)
我看到一系列问题:
1)初始化寄存器(不要假设寄存器初始值为零)。例如,addi $t5, 1
需要先前的add $t5, $zero, $zero
(或li
到您想要的值。
2)beq跳转指令需要两个寄存器。例如,您必须更改beq $s4, 3 J
:
li $t6, 3
beq $s4, $t6, J
答案 1 :(得分:0)
除了Miguel的观点之外,我还想补充说你正在以一种奇怪的方式使用指令集。也许你的汇编程序能够弄清楚你的意思,但它仍然会使代码混淆阅读。
lw $t3, 2
lw $t4, 3
这些应该是li
。 lw
指令用于从内存加载单词。
la $t0, 4($t1)
这应该是lw
,除非您只想检查从地址0x400004开始的指令,否则应该删除偏移量。
我似乎无法找到增加$t1
的任何地方,因此您将在循环的每次迭代中使用相同的地址。