将华氏度转换为摄氏度的 RISC-V 汇编语言程序
RISC-V Assembly Language Program to Convert Fahrenheit to Celsius
一个汇编语言程序,用于将华氏温度值转换为摄氏温度值。要执行的公式是 = ( − 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, x6, 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
是 hard-wired 到 0
。 li
永远没有意义。 https://en.wikichip.org/wiki/risc-v/registers.
无论 ecall
处理程序如何注册查找 system-call 数字,它都不是 x0
。检查文档以了解您正在使用的任何内容。 (例如 RARS system-calls 使用 a7
,与 MARS 使用 MIPS 寄存器 $v0
的方式相同(不是 MIPS [=17=]
,零寄存器))
混合使用 x1
和 t0
/ s0
注册名称通常也是一个坏主意。很容易意外地为同一个寄存器使用 2 个不同的名称,并让您的代码覆盖它自己的数据。
在之前版本的问题中你有:
Note: RISC-V multiply and divide instructions do not support immediates (constants). Therefore, all numeric values are to be defined in and loaded from memory
这很奇怪,“因此”并没有真正跟随。
li reg, constant
仍然比 lw
便宜,尤其是对于小整数。但是如果你的作业说你必须以愚蠢的方式去做,用数据存储器而不是 foo = 5
或 .equ
assemble-time 符号常量,那么你必须这样做。您可以在一个地方定义您的常量,但如果您的汇编程序不烂,那么仍然可以将它们用作立即数。
一个汇编语言程序,用于将华氏温度值转换为摄氏温度值。要执行的公式是 = ( − 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, x6, 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
是 hard-wired 到 0
。 li
永远没有意义。 https://en.wikichip.org/wiki/risc-v/registers.
无论 ecall
处理程序如何注册查找 system-call 数字,它都不是 x0
。检查文档以了解您正在使用的任何内容。 (例如 RARS system-calls 使用 a7
,与 MARS 使用 MIPS 寄存器 $v0
的方式相同(不是 MIPS [=17=]
,零寄存器))
混合使用 x1
和 t0
/ s0
注册名称通常也是一个坏主意。很容易意外地为同一个寄存器使用 2 个不同的名称,并让您的代码覆盖它自己的数据。
在之前版本的问题中你有:
Note: RISC-V multiply and divide instructions do not support immediates (constants). Therefore, all numeric values are to be defined in and loaded from memory
这很奇怪,“因此”并没有真正跟随。
li reg, constant
仍然比 lw
便宜,尤其是对于小整数。但是如果你的作业说你必须以愚蠢的方式去做,用数据存储器而不是 foo = 5
或 .equ
assemble-time 符号常量,那么你必须这样做。您可以在一个地方定义您的常量,但如果您的汇编程序不烂,那么仍然可以将它们用作立即数。