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,提问作者Νίκος Αντωνετσής
相关产品推荐
相关产品推荐

