java - MIPS 汇编 while 循环
问题描述
我目前正在学习 MIPS,在做一些练习时遇到了一个问题,即首先用 Java 编写斐波那契数列,然后将其转换为 MIPS 程序集。我只能使用beq
,我bne
的slt
Java 代码如下:
int n = 50; F_MAX v
int t1 = 0;
int t2 = 1;
int sum = 0;
while(t1 <= n)
{
System.out.print(t1 + " ")
sum = t1 + t2
t1 = t2
t2 = sum;
}
这意味着如果 n = 50 如果应该打印 50 之前的所有数字 (0; 1; 1; 2; 3; 5; 8; 13; 21; 34)
我的 MIPS 汇编代码是:
la $s0, F_MAX
lw $s0, 0($s0) #$s0 = int n = F_MAX (50);
addi $t1, $zero, 0 # $t1 = int t1 = 0;
addi $t2, $zero, 1 # $t2 = int t2 = 1;
addi $t3, $zero, 0 # $t3 = int sum = 0
while:
beq $t1, $s0, Exit #if t1 == 50 exit the program
addi $v0, $zero, 1 # syscall code to print integer
add $a0, $zero, $t1 # t1 to be printed
syscall # print t1
add $t3, $t1, $t2
addi $t1, $t2, 0
addi $t2, $t3, 0
addi $v0, $zero, 4 # syscall code to print a string
la $a0, COMMA
syscall # print a comma (and a space)
j while
Exit:
li $v0, 10
syscall
但由于某种原因,它让我溢出并打印所有可能的正数,我不知道为什么。
解决方案
所以这里是更新的代码:由于条件 t1== 50 从未满足,所以它总是错误的,我不得不使用slt
和bne
说明。
la $s0, F_MAX
lw $s0, 0($s0) #$s0 = int n = F_MAX (50);
addi $t1, $zero, 0 # $t1 = int t1 = 0;
addi $t2, $zero, 1 # $t2 = int t2 = 1;
addi $t3, $zero, 0 # $t3 = int sum = 0
while:
addi $v0, $zero, 1 # syscall code to print integer
add $a0, $zero, $t1 # t1 to be printed
syscall # print t1
add $t3, $t1, $t2
addi $t1, $t2, 0
addi $t2, $t3, 0
addi $v0, $zero, 4 # syscall code to print a string
la $a0, COMMA
syscall # print a comma (and a space)
slt $t4, $t1, $s0 #if t1 < 50 $t4 = 1
bne $t4, $zero, while #if $t4 != $zero goto while
slt $t4, $s0, $t1 #if 50 < $t1 $t4 = 1
bne $t4, $zero, Exit #if $t4 != $zero goto Exit
Exit:
li $v0, 10
syscall
推荐阅读
- db2 - DB2 模式操作细节
- registry - Installshield 不导入 .reg 文件
- php - 循环中的 PDO 查询
- apache-kafka - 带有 JSON 格式消息的 KSQL EXTRACTJSONFIELD 返回 null
- nsis - 检查特定标志是否已发送到 NSIS 脚本
- julia - Julia REPL 中数字背后的代码是什么?
- c++ - 在 C++ 中向用户询问输出文件名
- php - 三个js:查看跟随鼠标移动另一个场景
- firebase - firestore 事务为仅允许具有一个特定字段的更新规则引发错误
- python - 如何连接两个系列类型的对象并在数据框中创建另一列