晚上好!
我想使用模拟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
似乎您将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。
您的变量是字节(8位),但是您正在尝试加载字(32位)。您无法从非单词对齐的地址加载单词,即使您不能获得正确的结果。
所以您需要更改:
la $t0,song
lw $a0,0($t0)
to
la $t0,song
lbu $a0,0($t0)
对于其他负载,依此类推。
我看不到您将乐器编号加载到$a2
的任何位置。
您应该以jr $ra
指令结束程序,否则CPU将继续执行syscall
指令之后发生的任何事情。
syscall
31没有阻塞;它立即完成,因此如果您之后立即结束程序,您可能不会听到哔声。您可以改用syscall
33,该功能与31相同,不同之处在于它会在音频持续时间内阻塞。
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