如何调试 MIPS 代码?做作问题
How to debug a MIPS code? Affectation issues
我正在尝试在 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
我认为公式没问题,因为程序运行了,但它没有像预期的那样 returns p。似乎它更像是 return a(在 $a0 中),我不明白,因为我把 p 放在 $v0 中并尝试打印这个。
但这不是我第一次在 MIPS 中与寄存器和矫揉造作作斗争。
欢迎任何帮助,并提前致谢。
找到了。 MIPS 中的技巧是打印命令 li $v0, 1
可以覆盖您可能想要在 $v0 中打印的值,那是我的错误。解决方法是先将数据存储在另一个寄存器中:
move $a2, $v0
...
move $a0 $a2
li $v0, 1
syscall
或者最好不要将 $v0 用于您需要处理的变量。
而且单步执行功能确实有助于找出错误。
我正在尝试在 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
我认为公式没问题,因为程序运行了,但它没有像预期的那样 returns p。似乎它更像是 return a(在 $a0 中),我不明白,因为我把 p 放在 $v0 中并尝试打印这个。 但这不是我第一次在 MIPS 中与寄存器和矫揉造作作斗争。
欢迎任何帮助,并提前致谢。
找到了。 MIPS 中的技巧是打印命令 li $v0, 1
可以覆盖您可能想要在 $v0 中打印的值,那是我的错误。解决方法是先将数据存储在另一个寄存器中:
move $a2, $v0
...
move $a0 $a2
li $v0, 1
syscall
或者最好不要将 $v0 用于您需要处理的变量。 而且单步执行功能确实有助于找出错误。