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