如何将给定C代码转换为RISC-V rv64i汇编代码?
RISC-V rv64i 汇编转换实现
原C代码
int function (float X, float Y, float Z, int result) { result = (X*Y)+ Z; }
关键说明
RISC-V rv64i是纯整数指令集,无硬件浮点运算单元,因此浮点数运算必须依赖软浮点库(如GCC工具链中的libgcc软浮点实现)。另外原C代码存在两个问题:
- 函数声明为
int类型但无返回语句,不符合C标准 result是值传递参数,内部赋值不会影响调用者的变量
若修正为合理的返回式实现,对应的C代码应为:
int function(float X, float Y, float Z) { return (int)((X * Y) + Z); }
对应RV64I汇编实现
# RV64I ABI规则:参数依次存在a0-a2,返回值存a0 function: addi sp, sp, -8 # 分配栈空间保存返回地址 sd ra, 0(sp) # 保存ra寄存器 # 调用软浮点float乘法函数 __mulss3,输入a0=X, a1=Y,输出a0=X*Y call __mulss3 # 调用软浮点float加法函数 __addss3,输入a0=X*Y, a1=Z,输出a0=(X*Y)+Z mv a1, a2 call __addss3 # 调用软浮点float转int函数 __fixsfsi,输入a0=浮点结果,输出a0=转换后的int值 call __fixsfsi ld ra, 0(sp) # 恢复ra寄存器 addi sp, sp, 8 # 释放栈空间 ret # 返回结果
针对原错误C代码的汇编(仅匹配逻辑,无实际意义)
如果严格按照原代码的错误逻辑实现(赋值给值传递的result参数),汇编如下:
function: addi sp, sp, -16 # 分配栈空间保存寄存器和参数 sd ra, 8(sp) sd a3, 0(sp) # 保存传入的result参数 # 执行浮点运算流程 call __mulss3 mv a1, a2 call __addss3 call __fixsfsi ld a3, 0(sp) # 取出原result参数(赋值无意义,因为是值传递) mv a0, a3 # 无返回逻辑,这里返回原result值 ld ra, 8(sp) addi sp, sp, 16 ret
内容的提问来源于stack exchange,提问作者Mims Delama
相关产品推荐
相关产品推荐

