晚安!
我想使用模拟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
答案 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