Mips编程跳转问题

时间:2013-05-02 06:27:32

标签: windows assembly mips

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

2 个答案:

答案 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

这些应该是lilw指令用于从内存加载单词。


la $t0, 4($t1)

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

我似乎无法找到增加$t1的任何地方,因此您将在循环的每次迭代中使用相同的地址。