【问题标题】:Finding the max in MIPS在 MIPS 中寻找最大值
【发布时间】:2023-01-13 03:07:54
【问题描述】:

我是 MIPS 的新手,我正在做一项作业,要找到用户给定的两个数字之间的最大值,但是我遇到了两个我不明白为什么的错误,我写的代码从最大限度:.谢谢您的帮助

错误 1:第 35 行第 9 列:“$ra”:操作数的类型不正确

错误 2:第 40 行第 18 列:“else”:操作数的类型不正确

.text
 main:
 li   $sp, 0x7ffffffc    # initialize $sp

# PROLOGUE
subu $sp, $sp, 8        # expand stack by 8 bytes
sw   $ra, 8($sp)        # push $ra (ret addr, 4 bytes)
sw   $fp, 4($sp)        # push $fp (4 bytes)
addu $fp, $sp, 8        # set $fp to saved $ra

li   $v0, 5             # read x into a0
syscall
move $a0, $v0

li   $v0, 5             # read y into a1
syscall
move $a1, $v0

# lw  $a1, arg0          # a1 = arg1
# lw    $a2, arg1
jal  max                 # v0 = max(arg0, arg1)

move $a0, $v0           # print_int(rval)
li   $v0, 1
syscall
li   $v0, 11            # print_char(\n)
li   $a0, 10
syscall

# EPILOGUE
move $sp, $fp           # restore $sp
lw   $ra, ($fp)         # restore saved $ra
lw   $fp, -4($sp)       # restore saved $fp
j    $ra                # return to kernel
max:
  #PROLOGUE
 # $a0 = x, $a1 = y
sle $a0, $a1, else  # if(x <= y), jump to else
move $t0, $a0       # if (x > y), x is max
else:   move $t0, $a1       # set $t0 = $t2, y is max

【问题讨论】:

  • 你不能 j 注册,有 jr 操作码。
  • sle 是一个数学运算,一个二元运算符,用于确定关系——你不能给它一个标签;它有一个寄存器目标,您可以将其与后续分支指令结合使用,例如bnebeq,它们接受标签。

标签: assembly mips


【解决方案1】:
  • j $ra 需要是 jr $ra
  • sle $a0, $a1, else应该是ble $a0, $a1, else

那应该修复两个汇编器错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2021-09-12
    相关资源
    最近更新 更多