0

晚上好!

我想使用模拟 MIDI 输出声音的 MIPS 系统调用 31 发出哔声。我指定了所有系统调用 31 所需的参数,例如 $a0 - 音高,$a1 - 持续时间。但执行后声音没有播放。你能说什么是不对的。我还添加了 12,以八度音调。所以我已经完成了系统调用 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
4

3 回答 3

1

看起来您将la(加载地址)与lw加载字混淆了。$a0之后la $a0, beep包含 beep 的地址,而不是它的内容。

要修复此错误:

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。

于 2013-11-03T19:45:17.760 回答
0

您的变量是字节(8 位),但您正在尝试加载字(32 位)。您无法从非字对齐地址加载字,即使您可以,您也不会得到正确的结果。

所以你需要改变:

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

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

对于其他负载,依此类推。


我没有看到您将仪器编号加载到$a2任何地方。


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


syscall31 不阻塞;它立即完成,因此如果您之后立即结束程序,您可能不会听到哔声。您可以改用syscall33,它的工作原理与 31 相同,只是它会在音调的持续时间内阻塞。

于 2013-11-04T15:12:59.440 回答
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
于 2020-01-17T06:02:15.900 回答