MIPS鼓音序器立即在MARS环境中结束

时间:2014-10-07 15:02:44

标签: assembly mips sequence mars-simulator

我试着在MIPS中创建一个鼓音序器,我已经存储在内存中,带有指令“.word”,0和1值。 1表示需要播放4/4 bar环的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

1 个答案:

答案 0 :(得分: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

中存储的信息播放声音然后暂停等