【问题标题】:Correct MIPS code for loop?循环的正确 MIPS 代码?
【发布时间】:2014-04-08 09:42:12
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    "move $reg1, $reg2" 等价于 "addu $reg1, $zero, $reg2"。事实上,“move”指令实际上并不存在,而是由汇编器实际实现为“addu”的宏,寄存器为$0。

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

    【讨论】:

    • 我正在使用 QTSimp,但我真的不知道它是否会自动处理重新排序。它一直在崩溃,但我认为这是由于无限循环。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多