将整数移动到新寄存器而不覆盖 MIPS

Move integer to new register without overwriting in MIPS

我对 MIPS 和这个网站还很陌生(这是我的第一个 post)所以请多多包涵...我必须接受用户输入的数字,逐个整数地反转它使用除法(HI/LO)并将余数存储到新的寄存器中,以便将得到的反转数与原始数进行比较,看它是否是回文。很好,得到除法部分(我想?),但是一旦我第二次除法并尝试将第二个余数加到第一个除法的余数上,它只会覆盖寄存器的内容,而不是在结束了,对吧?我在互联网上找不到这个问题的答案。我怎样才能做到这一点?因为简单地做 'move' 会覆盖内容,对吗?到目前为止,这是我的代码

li  $v0, 4  # System call code for print string
la  $a0, Prompt # Load address for Prompt into a0
syscall

li  $v0, 5  # System call code for read integer
syscall     # Read the integer into v0
move  $t0, $v0  # Move the value into t0

move  $t9, $t0

li  $s0, 10 # Load 10 into s0 for division
li  $s1, 0  # Load 0 into s1 for division

div     $t0, $s0  # Divides t0 by 10

mfhi    $t1     # Move remainder into t1
mflo    $t0     # Move quotient into t0

本质上,我想将余数连接在一起,而不是将它们加在一起或覆盖寄存器。假设第一个余数是 3,第二个是 6,第三个是 9。最后,我不希望它是 18 或 9。我希望它是 369。

你的 div/mfhi/mflo 很好。您需要的是具有第二个变量的循环。

我已经创建了等效的 C 代码并将其添加为注释块并创建了一个工作程序[请原谅不必要的样式清理]:

#   int
#   rev(int inp)
#   {
#       int acc;
#       int dig;
#
#       acc = 0;
#
#       while (inp != 0) {
#           dig = inp % 10;
#           inp /= 10;
#
#           acc *= 10;
#           acc += dig;
#       }
#
#       return acc;
#   }

    .data
Prompt:     .asciiz     "Enter number to reverse:\n"
nl:         .asciiz     "\n"

    .text
    .globl  main

main:
    li      $v0,4                   # System call code for print string
    la      $a0,Prompt              # Load address for Prompt into a0
    syscall

    li      $v0,5                   # System call code for read integer
    syscall                         # Read the integer into v0
    bltz    $v0,exit                # continue until stop requested
    move    $t0,$v0                 # Move the value into t0

    li      $t3,0                   # initialize accumulator

    li      $s0,10                  # Load 10 into s0 for division
    li      $s1,0                   # Load 0 into s1 for division

next_digit:
    beqz    $t0,print               # more to do? if no, fly
    div     $t0,$s0                 # Divides t0 by 10

    mfhi    $t1                     # Move remainder into t1 (i.e. dig)
    mflo    $t0                     # Move quotient into t0 (i.e. inp)

    mul     $t3,$t3,$s0             # acc *= 10
    add     $t3,$t3,$t1             # acc += dig
    j       next_digit              # try for more

print:
    li      $v0,1                   # print integer syscall
    move    $a0,$t3                 # get value to print
    syscall

    li      $v0,4
    la      $a0,nl
    syscall

    j       main

exit:
    li      $v0,10
    syscall