首页 > 解决方案 > 如何调试 MIPS 代码?感情问题

问题描述

我试图在 MIPS 中复制这个 Java 函数:

static int gmul(int a, int b) {
        int p = 0;
        for (int i = 0; i < 8; i++) {
            if ( (b & 1) == 1) p = p ^ a;
            a = a << 1;
            if ( a > 255 ) a = a ^ 283;     
            b = b >> 1;
        }
    return p ;
}

我有这个 MIPS 代码:

.data
    demanda:
        .asciiz "Enter a first number"

    demandb:
        .asciiz "Enter a second number"
  
.text
main: 
    la $a0, demanda
    li $v0, 4               
    syscall
    li $v0, 5               
    syscall 
    move $t2, $v0           
    
    la $a1, demandb                       
    li $v0, 4               
    syscall
    li $v0, 5               
    syscall 
    move $a1, $v0           
    
    move $a0, $t2
    
    li $v0, 0               # this is p in the java version
    li $t0, 0       
    
    jal for         

    li $v0, 1               # Print p
    syscall     
                                    
    li $v0, 10              
    syscall

    
for:
        bge $t0,8,finfor    # if i>=8
        addi $t0, $t0, 1    # Incrementation
        andi $t2, $a1,1     # Preliminary condition calculation: (b & 1) == 1 in Java
        beq $t2,0, bEven    # if ( (b & 1) == 1) in java
        xor $v0, $a0, $v0   # Execution p = p ^ a in Java
bEven:  
        sll $a0, $a0, 1     # Execution a = a << 1 in java
        blt $a0,256, aSmall # if ( a > 255 )
        xori $a0, $a0, 283  # Execution a = a ^ 283 in Java
aSmall: 
        srl $a1, $a1, 1     # Execution b = b >> 1 in java
        j for  
finfor:
        jr $ra              
            

我认为公式没问题,因为程序运行,但它没有按预期返回 p。它似乎宁愿返回 a(在 $a0 中),我不明白,因为我已将 p 放入 $v0 并尝试打印这个。但这不是我第一次在 MIPS 中为寄存器和做作而苦苦挣扎。

欢迎任何帮助,并提前致谢。

标签: debuggingmips

解决方案


找到了。MIPS 中的技巧是打印输出命令li $v0, 1可以覆盖您可能希望在 $v0 中打印的值,这是我的错误。解决方法是先将数据存储在另一个寄存器中:

move $a2, $v0       
...
move $a0 $a2    
li $v0, 1       
syscall

或者最好不要将 $v0 用于您需要处理的变量。一步一步的功能确实有助于找出错误。


推荐阅读