assembly 将华氏温度转换为摄氏温度的汇编过程

wlwcrazw  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(118)

我的代码中一直出现这个错误:
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
nle07wnf

nle07wnf1#

ldc1l.d的所有第二个操作数(相同,但恕我直言)都是内存位置,通常指定为数据的简单标签或相对于整数基址寄存器的寻址模式。
虽然整数指令允许li伪指令,但这些(例如,l.d)不等同于浮点数,它们等同于整数单位的lw
如果你只有lw,你怎么能把一个特定的整数常量放进一个整数寄存器呢?当然,从内存中加载它,然后给予lw您用于该数据项的标签的名称。
对于浮点常量也是同样的想法。浮点常量对于单精度浮点数是32位的,对于双精度浮点数是64位的,所以无论如何不能很好地适应指令流,最好从内存中加载。
顺便说一句,也适用于字符串字面量-la不允许你把一个字符串字面量直接作为第二个参数,所以必须声明在内存中初始化的字符串,然后使用标签或其他东西引用它们。
看起来你不小心混合了单浮点数和双浮点数,所以也许可以检查一下。如果你真的想混合它们,你必须从单到双转换和/或反之亦然-不能直接将双加到单(反之亦然)。
(建议使用l.s表示单精度,l.d表示双精度,而不是lwc1ldc1-后缀.s.d将有助于提醒您使用的精度,因为它看起来类似于add.smul.s

相关问题