AArch64汇编向C函数传浮点参数及printf打印浮点数问题
问题分析与解决
核心问题
- 类型不匹配:
printf的%f格式符要求传入64位double浮点类型,但你定义的f是32位float类型,直接加载到64位浮点寄存器d1时,寄存器高位会填充垃圾值,导致printf解析出错误数值。 - 寄存器传递错误: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
相关产品推荐
相关产品推荐

