【问题标题】:How can I translate this C code into RISC-V rv64i assembly code?如何将此 C 代码翻译成 RISC-V rv64i 汇编代码?
【发布时间】:2022-11-20 05:26:51
【问题描述】:
int function (float X, float Y, float Z, int result) 
{
    result = (X*Y)+ Z;
    
    
}

我尝试使用https://godbolt.org/ 但它不支持 rv64i

【问题讨论】:

  • 这不是有效的 C,因此编译它不是很有用。当你有一些正确的代码时,编译它的最好方法是使用编译器。获取适当版本的 gcc 并使用 -S 选项运行它。
  • 您可以将其拆分为子问题,例如“如何在 RISC-V 中将两个浮点数相乘?”、“如何在 RISC-V 中将两个数相加?”,然后研究这些问题。
  • @Gene 这不是有效的 C?这是未定义的行为,但对我来说似乎是有效的 C。
  • 看起来像合法的 C,但相当无意义:不为非 void 函数返回一个值,并为一个从未使用过且在函数退出后不可用的参数赋值。

标签: assembly riscv


【解决方案1】:

您的代码已损坏,但假设它是这样写的:

float function (float X, float Y, float Z) 
{
   return (X*Y) + Z;    
}

此外,假设您有一个浮点单元,即您正在使用 rv64ifrv64id 设备。然后下面的汇编代码就可以完成这项工作:

function:
    fmul.s ft0, fa0, fa1
    fadd.s fa0, ft0, fa2
    ret

不幸的是,您使用的设备 rv64i 没有浮点单元。一个普通的 C 编译器会提供许多子程序来执行各种浮点运算,检查它们命名的最好方法是编译程序。

如果您打算自己编写子例程,那么您将面临一项艰巨的任务,因为这可能需要有经验的汇编程序员数周甚至数月的时间才能完成。

【讨论】: