MIPS播放哔声

时间:2013-11-03 15:03:00

标签: mips

晚安!

我想使用模拟MIDI输出声音的MIPS系统调用31发出哔声。我指定了所有系统调用31所需的参数,例如$ a0 - 音高音,$ a1 - 持续时间。但执行后声音没有播放。你能说出什么是对的吗?我还添加了12,以便在ocatve中进行投球。所以我已经完成了所需的系统调用31播放声音。谢谢!

.text
.globl main

main:   



li $v0,31
la $a0,beep
addi $t2,$a0,12
la $a1,duration

move $t2,$a0
move $t3,$a1

syscall


.data

beep: .byte 72
duration: .byte 100
volume: .byte 127

3 个答案:

答案 0 :(得分:1)

您似乎对la(加载地址)加载lw加载字感到困惑。在la $a0, beep $ a0之后包含蜂鸣声的地址,而不是其内容。

要解决此错误:

li $v0,31
la $a0,beep
lw $a0 0($a0)
addi $t2,$a0,12
la $a1,duration
lw $a1, 0($a1)

move $t2,$a0
move $t3,$a1

syscall

另外,看起来您忘记将音量加载到$ a3,因此可能为0.

答案 1 :(得分:0)

您的变量是字节(8位),但您尝试加载字(32位)。您无法从非字对齐的地址加载单词,即使您可能无法获得正确的结果。

所以你需要改变:

la $t0,song 
lw $a0,0($t0)

la $t0,song 
lbu $a0,0($t0)

等等其他负载。


我没有看到你将乐器编号加载到$a2的任何地方。


您应该使用jr $ra指令结束程序,否则CPU将继续执行syscall指令后发生的任何事情。


syscall 31没有阻止;它立即完成,所以如果你之后立即结束你的程序,你可能听不到哔哔声。您可以使用syscall 33,它与31的工作方式相同,只是它会在音调持续时间内阻止。

答案 2 :(得分:0)

li $v0, 31 
la $t0, pitch
la $t1, duration 
la $t2, instrument
la $t3, volume 
move $a0, $t0 
move $a1, $t1 
move $a2, $t2
move $a3, $t3 
syscall 

############
### END ####
############
li $v0, 10 #end program
syscall

.data 
pitch: .byte 69 # Put the notes to your song in a MIPS “array”
duration: .byte 100
instrument: .byte 58
volume: .byte 100