一个汇编语言程序,用于将以华氏度为单位的温度值转换为摄氏度。要执行的公式为=(−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 nn"
.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
硬连接到0
。li
对此毫无意义。https://en.wikichip.org/wiki/risc-v/registers.
无论ecall
处理程序在哪个寄存器中查找系统调用号,它都不是x0
。查看文档以了解您正在使用的内容。(例如,RARS系统调用使用a7
,与MARS使用MIPS寄存器$v0
(而不是MIPS$0
,零寄存器)的方式相同)
混合使用x1
和t0
/s0
寄存器名通常也是个坏主意。很容易意外地为同一寄存器使用两个不同的名称,并让您的代码覆盖自己的数据。
在以前版本的问题中:
注意:RISC-V乘法和除法指令不支持立即数(常量)。因此,所有数值都要定义在内存中并从内存加载
这很奇怪;因此";并没有真正遵循。
li reg, constant
仍然比lw
便宜,尤其是对于小整数。但是,如果你的作业说你必须用一种愚蠢的方式来做,用数据内存而不是foo = 5
或.equ
来组装时间符号常数,那么你就必须这样做。你可以在一个地方定义你的常数,但如果你的汇编程序不烂的话,仍然可以将它们用作直接变量。