如何解决RISC-V汇编语言程序,可将华氏温度转换为摄氏温度
一个汇编语言程序,用于将以华氏度为单位的温度值转换为摄氏温度。要实现的公式是?=(?− 32)×5⁄9。 所需的数据段:
- F_temp(单词)
- C_temp(单词)
- 值32(字节)
- 值5(字节)
- 值9(字节)
- 提示输入(字符串)
- 输出消息(字符串)
该堆栈用于将华氏温度值传递给子例程,并将计算出的摄氏温度值返回给主程序。为此将实现动态堆栈分配。 华氏温度和摄氏温度值都应存储在数据段中定义的分配存储位置中。
到目前为止,我得到的是这段代码。当我运行程序时,它说
Assemble: operation completed successfully.
应该要求用户输入华氏温度。但是它没有那样做。另外,用户输入数字后,应将其转换为摄氏度并显示结果。
.data
F_temp: .word 0
C_temp: .word 0
Number1: .byte 32
number2: .byte 5
number3: .byte 9
enterNumber: .ascii "\nEnter a temperature in Fahrenheit: \n"
celsiusDegree: .ascii "\nCelsius temperature is: "
array: .word 0:25
welcome1: .ascii " \n This program converts Fahrenheit to Celsius \n\n"
.text
main:
la a0,welcome1 #display welcome message
li x0,4
ecall
la x10,enterNumber #Ask user to write a number
li x17,4
ecall
la x6,array #store numbers array
li x30,25 #maximum of 25 integers are allowed to be entered
# F is in x10 #(F-32) * 5 / 9
addi x1,x0,9 #t1 = 9
addi x2,x2,5 #t0 = 5
addi s0,s0,32 #s0 = 32
sub x10,x6,s0 #F-32
mul x10,s0
div t0,t1,s0
done:
la x10,celsiusDegree #display celcius degree
ecall
exit:
ori a7,zero,10 # define program exit system call
ecall # exit program
解决方法
x0
硬连线到0
。将li
插入其中永远没有任何意义。 https://en.wikichip.org/wiki/risc-v/registers。
无论注册ecall
处理程序查找什么系统调用号码,它都不是x0
。查看文档以了解所使用的内容。 (例如RARS system-calls使用a7
,与MARS使用MIPS寄存器$v0
(不是MIPS $0
,即零寄存器)相同)
通常,混合使用x1
和t0
/ s0
寄存器名称也是一个坏主意。容易在同一寄存器中意外使用2个不同的名称,并使您的代码覆盖其自己的数据。
在先前版本的问题中,您有:
注:RISC-V乘法和除法指令不支持立即数(常量)。因此,所有数值都应在内存中定义并从内存中加载
这很奇怪,“因此”并没有真正出现。
li reg,constant
仍然比lw
便宜,尤其是对于一个小的整数。但是,如果您的作业说您必须用数据存储而不是foo = 5
或.equ
的汇编时符号常量来做愚蠢的方式,那么您就必须这样做。您可以在一个位置定义常量,但是如果汇编程序不烂的话,仍然可以将它们用作立即数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。