【问题标题】:MIPS - Assembly count goes down but goes into infinite loopMIPS - 程序集计数下降但进入无限循环
【发布时间】:2017-09-27 03:57:02
【问题描述】:

我正在尝试从用户输入的数字开始倒数,并希望显示介于数字和 0 之间的所有整数。我相信我的输出会下降,但随后会进入无限循环1. 似乎永远不会归零。

我刚开始学习汇编,所以如果这是一个不好的问题,我会提前道歉。

谢谢

这是我的代码:

.globl  main

.data
    msg: .asciiz "Input a number: "
    x: .word 1

    .text
main:

    li  $v0,4       # display the first message
    la  $a0, msg
    syscall 

    li  $v0, 5      # call for an input read, stores in $v0
    syscall

    move    $t0, $v0    # move the input to a temporary register
    lw  $t1, x          # loads x into $t1 registers

# Show Output
doLoop:
    sub $v0, $t0, $t1   # subtracts 1 from given input stores in $v0

    move $s0, $v0

    li $v0, 1       # Prepares to print integer
    move $a0, $v0
    syscall

    bgt $a0, 0, doLoop

    li  $v0,10      # load the "exit" number into register $v0
    syscall 

【问题讨论】:

  • google“mips 调试”并放入您使用的模拟器(MARS 或 SPIM?)。然后观察自己,寄存器中的值是如何演变的,以及为什么你的循环测试不起作用。
  • 我正在使用 MARS,谢谢!

标签: assembly mips


【解决方案1】:

这似乎对我有用,我一直在搞砸我在寄存器中放置常量的地方。因此,每次我尝试打印寄存器时都包含一个 1。

doLoop: 

sub     $t2, $t0, $t1   # subtracts 1 from given input stores in $v0

li  $v0, 1      
move    $a0, $t2    # Places answer in $a0
la  $v0, 1
syscall

move    $t0, $t2    
bgt $a0, 0, doLoop

li  $v0,10      # load the "exit" number into register $v0
syscall 

【讨论】:

  • la $t3, 1 的目的是什么?而且您不需要三个临时寄存器,您可以将主计数器值保存在单个寄存器中,并使用立即数进行减法(addi)。在您的回答中,bgt 仍在针对a0 进行测试,这只是因为syscall 没有修改它。
  • 什么情况下syscall会修改它?我也可以使用 $v0, 1 而不是做另一个临时的吗?
  • 应该在某个地方记录哪些寄存器被syscall 破坏并且保证会被保留。这是系统调用调用约定的重​​要部分,就像函数调用调用约定一样。 (请注意,约定取决于软件,因此您需要特定于 MARS syscall API/ABI 的答案,这可能与 Linux MIPS syscall 不同。)
  • 在什么情况下 - 在任何时候。 CPU 的寄存器是一种“超级全局”,即 CPU 中只有一个$2$v0 别名)寄存器。因此,当您控制某些不同的代码时,它也会使用“您的”寄存器。如果syscall 决定修改$v0,则在返回时您将看到新值。为了避免在每次调用子程序之前将所有寄存器存储/恢复到内存(慢),目标平台的程序员有calling convention
  • 因此,如果您将“计数器”值保留在 $s0 中,则系统调用不应修改它(除非其代码有错误)。 OTOH,您应该首先将原始 s0 存储到内存中,并在退出前恢复,以确保超级正确(在这种情况下,对于 MARS 中代码的 main 主体无关紧要,您可以修改 s0 而不会产生任何不适退出时生效)。一个问题是,MARS/SPIM 是模拟器,而不是实际机器,因此它们在编码器上有点“软”,使情况比在真实机器上更容易,例如所有系统调用都非常快,并且修改最少寄存器。原谅一些错误。
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多