我的代码中一直出现这个错误:
spim:(parser)syntax error on line 62 of file C:/Users/Emili/Downloads/Hello World.s ldc1 $f2,32.0
.data
prompt: .asciiz "Enter temperature in Fahrenheit: "
result: .asciiz "The temperature in Celsius is: "
prompt2: .asciiz "Convert another temperature? (y/n): "
newline: .asciiz "\n"
.text
.globl main
.ent main
main:
# Print prompt and read Fahrenheit temperature
li $v0, 4
la $a0, prompt
syscall
li $v0, 5
syscall
move $t0, $v0 # Save Fahrenheit temperature in $t0
# Call conversion procedure
jal convertToFahrenheit
# Print the Celsius temperature
li $v0, 4
la $a0, result
syscall
li $v0, 2
mov.s $f12, $f0 # Move Celsius temperature to $f12
syscall
# Ask if user wants another conversion
li $v0, 4
la $a0, prompt2
syscall
li $v0, 12
syscall
move $t1, $v0 # Save user's input in $t1
# Check if input is 'y'
li $t2, 'y'
bne $t1, $t2, exit # Exit program if input is not 'y'
# Print newline
li $v0, 4
la $a0, newline
syscall
j main # Start another iteration of the program
exit:
# Program is finished running
li $v0, 10
syscall
.end main
# Conversion procedure
convertToFahrenheit:
sub.s $f0, $f12, $f0
ldc1 $f2, 32.0
sub.s $f0, $f0, $f2
ldc1 $f2, 9.0
div.s $f0, $f0, $f2
mul.s $f0, $f0, $f2
jr $ra
1条答案
按热度按时间nle07wnf1#
ldc1
和l.d
的所有第二个操作数(相同,但恕我直言)都是内存位置,通常指定为数据的简单标签或相对于整数基址寄存器的寻址模式。虽然整数指令允许
li
伪指令,但这些(例如,l.d
)不等同于浮点数,它们等同于整数单位的lw
。如果你只有
lw
,你怎么能把一个特定的整数常量放进一个整数寄存器呢?当然,从内存中加载它,然后给予lw
您用于该数据项的标签的名称。对于浮点常量也是同样的想法。浮点常量对于单精度浮点数是32位的,对于双精度浮点数是64位的,所以无论如何不能很好地适应指令流,最好从内存中加载。
顺便说一句,也适用于字符串字面量-
la
不允许你把一个字符串字面量直接作为第二个参数,所以必须声明在内存中初始化的字符串,然后使用标签或其他东西引用它们。看起来你不小心混合了单浮点数和双浮点数,所以也许可以检查一下。如果你真的想混合它们,你必须从单到双转换和/或反之亦然-不能直接将双加到单(反之亦然)。
(建议使用
l.s
表示单精度,l.d
表示双精度,而不是lwc1
和ldc1
-后缀.s
和.d
将有助于提醒您使用的精度,因为它看起来类似于add.s
和mul.s
)