You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AArch64汇编向C函数传浮点参数及printf打印浮点数问题

问题分析与解决

核心问题

  1. 类型不匹配:printf的%f格式符要求传入64位double浮点类型,但你定义的f是32位float类型,直接加载到64位浮点寄存器d1时,寄存器高位会填充垃圾值,导致printf解析出错误数值。
  2. 寄存器传递错误:AArch64函数调用约定中,第一个浮点参数需要放在d0寄存器,而非d1。

修正方案

方案1:直接使用double类型(推荐)

将数据定义为double,并按约定加载到对应寄存器:

.global _start
.extern printf

.data
    string: .asciz "Hello World! %f\n"
    f: .double 1.132  // 改为double类型

.text

_start:
    ldr x0, =string   // 格式串传入第一个通用寄存器x0
    ldr d0, =f        // double参数传入第一个浮点寄存器d0
    bl printf

exit:
    mov x8, #93
    mov x0, #0
    svc 0

方案2:保留float类型,转换为double后传递

若需保留float定义,通过fcvt指令完成类型转换:

.global _start
.extern printf

.data
    string: .asciz "Hello World! %f\n"
    f: .float 1.132   // 保留float类型

.text

_start:
    ldr x0, =string
    ldr s0, =f        // 加载float到32位浮点寄存器s0
    fcvt d0, s0       // 转换为double类型存入d0寄存器
    bl printf

exit:
    mov x8, #93
    mov x0, #0
    svc 0

验证结果

重新执行你的build.sh脚本编译运行,输出会变为:

Hello World! 1.132000

内容的提问来源于stack exchange,提问作者JYL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:44:52