我试着在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
答案 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
中存储的信息播放声音然后暂停等