【问题标题】:MIPS delay subroutineMIPS 延迟子程序
【发布时间】:2014-05-18 23:05:25
【问题描述】:

我最近开始使用 MIPS 并尝试做一些简单的事情。目前,这个程序打印出 Hello World 没有延迟,我想让它打印出 Hello World 有 1 秒的延迟。

.global myprog

.text
.set noreorder
.ent myprog 

myprog:
loop: 
    la      $a0,Serial
    la      $a1,hello
    jal     _ZN5Print7printlnEPKc        
    nop

    jal     mydelay
    nop

    j       loop
    nop

mydelay:
    li      $a2, 1000
    addi    $a2, $a2, -1
    bgez    mydelay     

    jr      $ra

.end myprog 

.data
hello:  .ascii "Hello, world!\0"

基本上通过这个,它会第一次打印第一个 Hello World,当它到达那个位置时进入“mydelay”,其中 mydelay 将循环 1000 次(这应该会提供一些延迟,不完全确定这部分),然后它应该返回标签循环,但目前它所做的只是毫无延迟地打印 Hello World。

【问题讨论】:

  • 您的代码在延迟循环开始之前打印(假设jal _ZN5Print7printlnEPKc 导致打印);会有什么延迟?
  • 目前,没有延迟,我正在尝试实现延迟。我的推理是,一旦打印出来,它就会跳转到 nodelay 标签,并且在延迟发生后,它会循环回到程序的开头。基本上我想展示的是Hello World。 (延迟)你好,世界。 (一遍又一遍。)
  • 无论您想要什么,您都可以毫无延迟地进行编码,因为您不会在第一次打印之前调用代码延迟,然后陷入无限循环(@ 987654323@ 循环,不是主要的loop)。

标签: delay mips subroutine


【解决方案1】:

这似乎是调用可靠延迟的一种非常糟糕的方法。始终寻找syscall,看看是否有什么东西已经为你做了。

如果您使用 MARS,这将延迟 1000 毫秒:

li $v0, 32
li $a0, 1000
syscall

【讨论】:

    【解决方案2】:
    1. 您在每次迭代时重新初始化 $a2,因此如果您的退出条件正常工作,则循环应该是无限的。
    2. 以上表明您的条件分支不正确;也许blez
    3. 即使您确实让延迟循环正常工作,1000 也可能太小而无法引起注意。

    【讨论】:

    • 我现在希望这是一个无限循环,更改了条件分支,如果我输入 1000,是否意味着 1000 毫秒?
    • 一个非常紧凑的循环数到 1000 需要多长时间取决于很多事情,您都没有说明。
    • @Soaps:你想让mydelay 循环无限吗?
    • 正如斯科特所说,这取决于很多事情。您应该考虑 CPU 的频率、编译器甚至机器将如何在指令级别转换和并行化循环(如果不按顺序执行,可能比预期快 1000 倍(或更多))等。
    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多