Mips SPIM系统调用中字符串的If/Else语句

Mips SPIM系统调用中字符串的If/Else语句,mips,spim,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

我正在用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”行,什么也不做。任何帮助都将不胜感激

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

MIPS中的读取字符串syscall的工作原理如下:

  • $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
指令现在应该可以正常工作了。

Sweet!非常感谢你帮助我,把一切都解释得如此清楚@Kyle2595很高兴您发现它很有用。:)@Kyle2595这是一个很好的MIPS教程,如果您正在寻找系统调用,它还解释了系统调用。太棒了!非常感谢你的帮助!读取字符系统调用是
$v0=12
。你可以用这个。