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

如何让OpenWatcom编译的C函数将double返回值存入ST(0)?

问题:OpenWatcom编译i386 Linux程序时修改double返回值的寄存器约定

给定C函数:

double retfp(void) { return 42; }

使用OpenWatcom C编译器针对Linux i386平台编译,编译命令为:

owcc -blinux -fno-stack-check -fsigned-char -march=i386 -Os -W -Wall -Wextra -Werror -mregparm=0 -c -o retfp.owcc.obj retfp.c

当前生成的代码会将double类型返回值存入EDX:EAX寄存器,但希望像GCC那样,将返回值存入ST(0)寄存器,是否可通过OpenWatcom的命令行参数实现?

解决方案

可以通过添加-mabi=sysv编译参数实现。

OpenWatcom默认在Linux i386平台的ABI约定与GCC采用的System V i386 ABI存在差异:前者将double返回值存入通用寄存器对EDX:EAX,后者遵循System V ABI规范,使用FPU寄存器ST(0)返回浮点类型值。添加-mabi=sysv参数后,编译器会强制遵循System V i386 ABI,从而让double返回值存入ST(0),与GCC行为一致。

修改后的编译命令为:

owcc -blinux -fno-stack-check -fsigned-char -march=i386 -Os -W -Wall -Wextra -Werror -mregparm=0 -mabi=sysv -c -o retfp.owcc.obj retfp.c

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:52:34