目前使用CREATOR RISC-V模拟器:Creator 4.0 RISC-V(RV 32 IMFD)didaCtic和generRic assEmbly progrAmming simulaTOR
我正在尝试执行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
字符串
1条答案
按热度按时间pu82cl6c1#
终止程序的
ecall
不正确。将10放入a7
而不是a0
。你可以观察到程序没有在这个点停止,而是继续重新执行
sin
函数,即使它实际上没有被调用。但是因为
ra
寄存器有一些可以说是合法的代码地址值,所以每次sin
被 * 未 * 调用,但落入,它将返回到它 * 被 * 合法调用的最后一个调用点,即(紧接着)jal sin
。这将导致一个无限循环。
不应该在不保留s#或fs#寄存器的情况下使用它们。如果选择使用它们,那么它们的原始值需要保存到堆栈中,并在退出时恢复。
但是,没有理由在代码中使用它们-应该使用临时寄存器,即t#和ft#寄存器。
我们只需要保存的寄存器,如果它们可以被进一步的函数调用清除,并且
sin
不做任何进一步的函数调用。