If/Else 对来自 SPIM 系统调用的字符串的声明

If/Else Statement on character strings from SPIM system calls

我正在使用 Spim 在 MIPS 中编写程序,我想转换温度 to/from 华氏度和摄氏度。例如:

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' 行,没有做任何事情。任何帮助将不胜感激!

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

MIPS 中的读取字符串系统调用是这样工作的:

  • $a0是内存中要保存字符串的缓冲区的起始地址(这个不用自己选,给space分配一个label即可名称和 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 指令现在应该可以正常工作了。