2017-02-15 77 views
2

我是MIPS和这个网站的新手(这是我的第一篇文章),所以请在这里忍受我...我必须输入一个用户输入的数字,整数使用除法(HI/LO)整数,并将余数存储到新寄存器中,以便将结果反转的数字与原始数据进行比较,以查看它是否是回文。这很好,得到了这个部分(我认为?),但是一旦我第二次分割并尝试将第二个余数加到第一个分部的剩余部分上,它将简单地覆盖寄存器的内容,而不是在它的结尾,对吧?我无法在互联网上找到答案。我怎样才能做到这一点?因为简单地做'移动'会覆盖内容,对吗?这里是我到目前为止的代码将整数移到新的寄存器而不覆盖MIPS

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.

回答

0

您的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 
+0

对不起,我从来没有回应,多谢了帮帮我! – teddymv

相关问题