debugging - 如何调试 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 中为寄存器和做作而苦苦挣扎。
欢迎任何帮助,并提前致谢。
解决方案
找到了。MIPS 中的技巧是打印输出命令li $v0, 1
可以覆盖您可能希望在 $v0 中打印的值,这是我的错误。解决方法是先将数据存储在另一个寄存器中:
move $a2, $v0
...
move $a0 $a2
li $v0, 1
syscall
或者最好不要将 $v0 用于您需要处理的变量。一步一步的功能确实有助于找出错误。
推荐阅读
- python - 尝试使用 .replace 和 Python 编辑字符串
- augmented-reality - 如何使用 ARcore 的 Augmented Faces 将 3D 模型绑定到面部的特定点
- node.js - 如何在 Linux 主机上的 Azure Functions 上运行节点 v10.x?
- typescript - 为什么没有严格检查 promise 回调结果类型?
- java - 是否可以将 IloNumVar 与 java 中的常量相加?
- excel - 有没有办法根据用户表单输入选择表格?
- java - spring-boot-starter-mail 使用后“应用程序无法启动”
- angular - 如何将 jsPdf 以 pdf 格式发送到 Spring Post?
- c# - 无法处理 SAP B1 UI API 中的按钮单击事件
- python - Django - 暂停/停用帐户 N 秒