MIPS播放哔声

问题描述 投票:0回答:3

晚上好!

我想使用模拟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
mips
3个回答
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。


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相同,不同之处在于它会在音频持续时间内阻塞。


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
© www.soinside.com 2019 - 2024. All rights reserved.