我正在使用Spim在MIPS中编写程序,我希望将温度转换为华氏温度和摄氏温度。例如:
Enter a number to convert: 100
Enter the Temperature: C
100 C is the same as 212 F
所以我无法让程序识别用户输入“C”或“F”并跳转到相应的标签。以下是我遇到问题的代码部分:
li $v0, 8 # Loads System service to read string
syscall
move $s1, $v0 # Move value to register to save for later use
beq $s1, 'C', Fahrenheit
beq $s1, 'F', Celsius
程序只是通过'beq'行而没有做任何事情。任何帮助将不胜感激!
答案 0 :(得分:2)
与读取整数不同,读取字符串不会将用户输入读入寄存器$v0
。 MIPS中的寄存器只有4个字节,因此将字符串存储在单个寄存器中是没有意义的。相反,MIPS会从指定地址开始将其读入内存。
MIPS中的读取字符串系统调用的工作方式如下:
$a0
是内存中要保留字符串的缓冲区的起始地址(您不需要自己选择它 - 您只需使用标签名称分配空间,MIPS将为你选择一个地址)$a1
是字符串缓冲区的长度(以字节为单位)。 对于单个字符,您希望它为2 ,因为字符串使用其最后一个字节作为空终止符。如果这是1,那么系统调用甚至不会从用户那里读取任何内容,因为该字符自动需要是一个空终止符。您可以在.data
部分
myString:
.space 2
然后在.text
部分执行系统调用:
li $v0, 8
la $a0, myString # myString is a label for the memory address
la $a1, 2
syscall
然后使用lb
lb $s1, ($a0)
您的beq
指令应该按照您的预期运作。