0

我正在尝试在存储在内存中的 MIPS 中创建一个鼓音序器,使用指令“.word”、0 和 1 值。1 表示需要播放 4/4 小节循环的 1/16。因此,寄存器 $t8 将寻址内存中的 16 个字,程序将控制声音是否必须播放 (1) 或睡眠 (0)。$t7 是一个计数器,用于验证循环何时结束并且必须重新启动序列。问题是,当我组装程序(并且 MARS 做得很好)并运行它时,在执行一个步骤后,我收到以下消息:“--程序已完成运行(从底部掉下)--”好的......但是为什么 ?!

这是源代码:

.data

LOOP1: .word 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0


    la $t8, LOOP1           #

    addi $t9, $t9, 0        #increments $t8 with the correct amount to adress every 1/16

    li $t2, 114             #sound's timbre

Loop:

    addiu $t8, $t8, $t9

    lw $t1, 0($t8)

    addi $t7, $t7, 1        #$t7 is used to verify the loop's end

    bne $0, $t1, PlaySound      

    li $a0, 100


    li $v0, 32

    syscall                    #sleep syscall

Afterplayng:

    sll $t9, $t9, 2

    beq $t7, 16, ReinitializeLoopCounter

        j Loop                #jumps back to the top of loop

PlaySound:

    li $a0, 62 

    li $a1, 100

    move $a2, $t2

    li $a3, 120

    la $v0, 33

    syscall                #calls service 33, playing music

    j Afterplayng

ReinitializeLoopCounter:

    addi $t7, $0, 1

    addi $t8, $t8, -64

    j Loop
4

1 回答 1

0

您的代码中有几个错误。第一个是你没有告诉 MARS 你的代码从哪里开始。

您应该添加一行

.code

在这一行之后:

LOOP1: .word 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0

然后,如果您尝试组装 MARS 将显示一些错误,例如,您正在发出addiu $t8, $t8, $t9期望立即数而不是寄存器作为第三个参数。

那里还有其他可疑代码。例如,开头的一行状态

addi $t9, $t9, 0        #increments $t8 with the correct amount to adress every 1/16

但它确实没有任何用处(将常数 0 添加到 $t9,这不是您的描述所说的那样)。

如果稍微修改您的代码以测试 MARS 的 midi 功能:

.data

LOOP1: .word 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0
.text

  la $t8, LOOP1           #

  li $t2, 114             #sound's timbre  ???
Loop:

  lw $t1, 0($t8)
  addiu $t8, $t8, 4  # Increment play data
  addi $t7, $t7, 1        #$t7 is used to verify the loop's end
  bne $0, $t1, PlaySound      
  li $a0, 100
  li $v0, 32
  syscall                    #sleep syscall
Afterplayng:
  beq $t7, 16, ReinitializeLoopCounter
  j Loop                #jumps back to the top of loop
PlaySound:
  li $a0, 62 
#  li $a1, 100
  li $a1, 500  # half second
  move $a2, $t2
  li $a3, 120
  la $v0, 33
  syscall                #calls service 33, playing music
  j Afterplayng
ReinitializeLoopCounter:
  addi $t7, $0, 1
  la $t8, LOOP1           # Reinitialize $t8
  j Loop

检查与您的代码的差异。这个只是根据从 LOOP1 存储的信息播放声音,然后暂停等

于 2014-10-07T16:43:25.673 回答