目前使用CREATOR RISC-V模拟器:Creator 4.0 RISC-V (RV32IMFD) 教学和通用汇编编程模拟器
我正在尝试执行 sin 函数,并且稍微触及了浮点寄存器。我知道,由于约定,我必须使用 s# 和 fs# 寄存器。 执行代码时,我得到了正确的输出,但我有循环打印以无限输出。此外,我遇到错误:“参数传递约定可能失败”。
.data
pi: .float 3.14159 # Aproximación de pi
valueTest: .float 6.28 # Valor aleatorio para probar [-2pi, 2pi]
.text
main:
# Llamar a la función sin
jal ra, sin
# Mover el resultado de la función a un registro adecuado
# Imprimir el resultado
li a7, 2 # Código de la llamada al sistema para imprimir una cadena
ecall
# Salir del programa
li a0, 10
ecall
# Función sin
sin:
la s0, pi
flw fs0, 0(s0) # Cargar el valor de pi (aprox)
la s1, valueTest
flw fs1, 0(s1) # Cargar el valor para probar
fmul.s fs2, fs0, fs1 # Realizar los cálculos necesarios para la función sin
fmv.s fa0, fs2
jr ra # Retornar al registro de retorno de la función
用于终止程序的
ecall
格式不正确。将 10 放入 a7
而不是 a0
。
您可以观察到程序无法在此时停止并继续重新执行
sin
函数,即使它实际上并未被调用。在调试器中使用单步。
但是因为
ra
寄存器有一些可以说是合法的代码地址值,每次 sin
被 not 调用,但是陷入其中,它将返回到它 was 合法调用的最后一个调用点,即 (就在之后)jal sin
。
这会导致无限循环。
不应在未保留 s# 或 fs# 寄存器的情况下使用它们。如果您选择使用它们,那么它们的原始值需要保存到堆栈中并在退出时恢复。
但是,没有理由在该代码中使用它们——应该使用临时寄存器,即 t# 和 ft# 寄存器。
我们只需要保存的寄存器,如果它们可以通过进一步的函数调用来清除,并且
sin
不会进行任何进一步的函数调用。