-1

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

3

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

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

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

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

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

于 2014-03-06T01:57:04.357 回答