0

假设从 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
4

2 回答 2

1

我看到了一系列问题:

1)初始化寄存器(不要假设寄存器初始值为零)。例如,addi $t5, 1需要以前的add $t5, $zero, $zero(或li您想要的值)。

2) beq 跳转指令需要两个寄存器。例如,您必须beq $s4, 3 J通过以下方式进行更改:

li $t6, 3
beq $s4, $t6, J
于 2013-05-02T06:35:50.437 回答
0

除了 Miguel 的观点,我想补充一点,您正在以一种奇怪的方式使用指令集。也许您的汇编程序能够弄清楚您的意思,但它仍然使代码难以阅读。

lw $t3, 2
lw $t4, 3

这些应该是li。该lw指令用于从内存中加载字。


la $t0, 4($t1)

这应该是lw,除非您只想检查从地址 0x400004 开始的指令,否则您应该删除偏移量。

我似乎也找不到你在哪里增加$t1,所以你将在循环的每次迭代中使用相同的地址。

于 2013-05-02T06:52:05.837 回答