正确的MIPS代码循环?

时间:2014-03-06 01:16:14

标签: assembly mips organization computer-architecture low-level-code

我正在尝试编写与此高级语言代码等效的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次

1 个答案:

答案 0 :(得分:3)

您的代码缺少“循环”标签。我猜它应该超过第一个“添加”。

您应该使用“u”形式的加法和减法指令。也就是说,“addu”代替“add”,而“addiu”代替“addi”。这是因为“add”和“addi”会在溢出而不是换行时崩溃。 Java不会在整数溢出时崩溃,并且您希望MIPS等同于Java代码。

MIPS代码应该具有用户指定数字加载到的寄存器的名称,而不是字面上的“str1”和“str2”。

“move $ reg1,$ reg2”相当于“addu $ reg1,$ zero,$ reg2”。事实上,“移动”指令实际上并不存在,实际上是由汇编程序实现为“addu”的宏,寄存器为$。

另外,您使用的是自动处理重新排序的汇编程序吗?我很好奇你的汇编程序是否为你处理MIPS延迟槽,或者你是否需要自己把东西放在分支的延迟槽中。这可以改变您对循环进行编码的方式。