我正在尝试编写与此高级语言代码等效的MIPS代码:
i = 0;
n = str2; //supplied by user from console
while(i < n) {
System.out.println(str1); //str1 is supplied by user from console
i++;
}
System.exit(0);
这是我的MIPS代码:
.data
str1: .asciiz "Enter the first integer: "
str2: .asciiz "Enter the second integer: "
newline: .asciiz "\n"
.text # instructions follow this line
main: # indicates start of code (first instruction to execute)
add $s0,$zero, $zero # $s0 = 0
add $s1, $zero, str2 # $s1 = 0
slt $t0, $s0, $s1
beq $t0, $zero, Exit
li $v0, 1 # load appropriate system call code into register $v0;
# code for printing integer is 1
move $a0, str1 # move integer to be printed into $a0: $a0 = str1
syscall
addi $s0, $s0, 1 # $s0++
j loop #jump back to loop
Exit: nop
我正在尝试打印第一个数字第二个数字的值的次数。示例:第一个数字:2,第二个数字:4,因此打印2次4次
答案 0 :(得分:3)
您的代码缺少“循环”标签。我猜它应该超过第一个“添加”。
您应该使用“u”形式的加法和减法指令。也就是说,“addu”代替“add”,而“addiu”代替“addi”。这是因为“add”和“addi”会在溢出而不是换行时崩溃。 Java不会在整数溢出时崩溃,并且您希望MIPS等同于Java代码。
MIPS代码应该具有用户指定数字加载到的寄存器的名称,而不是字面上的“str1”和“str2”。
“move $ reg1,$ reg2”相当于“addu $ reg1,$ zero,$ reg2”。事实上,“移动”指令实际上并不存在,实际上是由汇编程序实现为“addu”的宏,寄存器为$。
另外,您使用的是自动处理重新排序的汇编程序吗?我很好奇你的汇编程序是否为你处理MIPS延迟槽,或者你是否需要自己把东西放在分支的延迟槽中。这可以改变您对循环进行编码的方式。