assembly 循环,打印无限输出

mzsu5hc0  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(127)

目前使用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

字符串

pu82cl6c

pu82cl6c1#

终止程序的ecall不正确。将10放入a7而不是a0
你可以观察到程序没有在这个点停止,而是继续重新执行sin函数,即使它实际上没有被调用。
但是因为ra寄存器有一些可以说是合法的代码地址值,所以每次sin被 * 未 * 调用,但落入,它将返回到它 * 被 * 合法调用的最后一个调用点,即(紧接着)jal sin
这将导致一个无限循环。
不应该在不保留s#或fs#寄存器的情况下使用它们。如果选择使用它们,那么它们的原始值需要保存到堆栈中,并在退出时恢复。
但是,没有理由在代码中使用它们-应该使用临时寄存器,即t#和ft#寄存器。
我们只需要保存的寄存器,如果它们可以被进一步的函数调用清除,并且sin不做任何进一步的函数调用。

相关问题