如何让OpenWatcom编译的C函数在ST(0)中返回double?

toiithl6  于 2023-05-22  发布在  其他
关注(0)|答案(2)|浏览(166)

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

在EDX:EAX中有返回double的代码。但是,我想在ST(0)中得到它,就像GCC一样。这是可能的OpenWatcom,也许通过一个命令行标志?

moiiocjp

moiiocjp1#

您应该指定调用约定,以ST(0)返回浮点值,例如cdecl

double __cdecl retfp(void) {  return 42; }

反汇编程序输出:

Segment: _TEXT BYTE USE32 00000007 bytes
0000                            _retfp:
0000  DD 05 00 00 00 00                 fld             qword ptr L$1
0006  C3                                ret
...
Segment: CONST DWORD USE32 00000008 bytes
0000                            L$1:
0000  00 00 00 00 00 00 45 40                         ......E@

您也可以使用-mabi标志为owcc指定默认调用约定。

zaq34kh6

zaq34kh62#

TL;DR使用owcc -mabi=cdecl代替owcc -mregparm=0

延伸@dimich的回答:

  • owcc -mabi=...owcc =mregparm=...标志值一起确定调用约定,调用约定确定(例如)返回哪些寄存器值。
  • owcc -mabi=...标志对应于wcc386 -ec...标志,例如owcc -mabi=cdeclwcc386 -ecc相同。
  • owcc -mregparm=...标志对应于未记录的(!)wcc386 -3...标志,例如owcc -mregparm=0wcc386 -3s相同,owcc -mregparm=3wcc386 -3r相同。
  • 默认值为owcc -mregparm=3 -mabi=watcall
  • 在EDX:EAX中返回双精度浮点数,并带有owcc -mregparm=0 -mabi=pascalowcc -mregparm=0 -mabi=fortranowcc -mregparm=0 -mabi=watcallowcc -mregparm=0
  • 在ST(0)中,返回双精度浮点数owcc -mregparm=0 -mabi=cdeclowcc -mregparm=0 -mabi=stdcallowcc -mregparm=0 -mabi=fastcall-mregparm=0 -mabi=syscallowcc -mregparm=3,以及owcc -mregparm=3 -mabi=...(任何-mabi=...值)。

相关问题