如果/ Else Statement MIPS

时间:2015-02-16 02:22:44

标签: mips spim

我正在使用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'行而没有做任何事情。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

与读取整数不同,读取字符串不会将用户输入读入寄存器$v0。 MIPS中的寄存器只有4个字节,因此将字符串存储在单个寄存器中是没有意义的。相反,MIPS会从指定地址开始将其读入内存。

MIPS中的读取字符串系统调用的工作方式如下:

  • $a0是内存中要保留字符串的缓冲区的起始地址(您不需要自己选择它 - 您只需使用标签名称分配空间,MIPS将为你选择一个地址)
  • $a1是字符串缓冲区的长度(以字节为单位)。 对于单个字符,您希望它为2 ,因为字符串使用其最后一个字节作为空终止符。如果这是1,那么系统调用甚至不会从用户那里读取任何内容,因为该字符自动需要是一个空终止符。

您可以在.data部分

中包含此内容,为字符串分配2个字节的内存
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指令应该按照您的预期运作。