打印无限输出的循环

问题描述 投票:0回答:1

目前使用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
function assembly cpu-registers riscv
1个回答
0
投票

用于终止程序的

ecall
格式不正确。将 10 放入
a7
而不是
a0

您可以观察到程序无法在此时停止并继续重新执行

sin
函数,即使它实际上并未被调用。在调试器中使用单步。

但是因为

ra
寄存器有一些可以说是合法的代码地址值,每次
sin
not 调用,但是陷入其中,它将返回到它 was 合法调用的最后一个调用点,即 (就在之后)
jal sin

这会导致无限循环。


不应在未保留 s# 或 fs# 寄存器的情况下使用它们。如果您选择使用它们,那么它们的原始值需要保存到堆栈中并在退出时恢复。

但是,没有理由在该代码中使用它们——应该使用临时寄存器,即 t# 和 ft# 寄存器。

我们只需要保存的寄存器,如果它们可以通过进一步的函数调用来清除,并且

sin
不会进行任何进一步的函数调用。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.