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

Win64平台汇编调用C标准库pow函数返回结果不符合预期问题求助

问题根因

你遇到的问题由3个核心错误导致,均是不符合Windows x64调用约定和C标准库函数接口规范导致:

  • 参数加载指令使用错误:pow函数接收两个double类型(双精度浮点)参数,你定义的常量也用dq(64位双精度)存储,但你用了movss(加载32位单精度浮点数)指令加载参数,导致传入pow的参数本身就是错误值。
  • 缺少阴影空间且栈对齐不符合要求:Windows x64调用约定要求调用任意函数前,必须为被调用函数预留32字节的阴影空间,且调用前栈需要满足16字节对齐,你仅调整了8字节栈空间,完全不符合规范。
  • 返回值读取寄存器错误:浮点类型的返回值不会存储在rax寄存器中,double类型的返回值固定存放在xmm0寄存器,你读取rax的值自然和预期结果不符。你之前尝试用rcx、rdx传参也是错误的,这两个寄存器仅用于传递整数/指针类型的前两个参数,浮点参数固定用xmm0~xmm3传递。

修正后的代码

extern pow
global main 
section .text 

main:
; 调整栈:预留32字节阴影空间 + 满足16字节对齐
sub rsp, 32 + 8
; 用movsd加载双精度浮点数到xmm0、xmm1
movsd xmm0, [_base]
movsd xmm1, [_exp] 
call pow
; 将xmm0中的返回值写入result
movsd [result], xmm0

add rsp, 32 + 8
ret 

section .data 
_base : dq 4.0 
_exp : dq 0.5
result : dq 0.0 

验证说明

编译命令和你之前使用的一致:nasm -fwin64 a.asm && gcc a.obj && a,运行后result变量的值会被正确赋值为2.0,符合pow(4.0, 0.5)的计算预期。

内容的提问来源于stack exchange,提问作者Νίκος Αντωνετσής

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:24:09