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,也许通过一个命令行标志?
2条答案
按热度按时间moiiocjp1#
您应该指定调用约定,以ST(0)返回浮点值,例如
cdecl
:反汇编程序输出:
您也可以使用
-mabi
标志为owcc
指定默认调用约定。zaq34kh62#
TL;DR使用
owcc -mabi=cdecl
代替owcc -mregparm=0
。延伸@dimich的回答:
owcc -mabi=...
和owcc =mregparm=...
标志值一起确定调用约定,调用约定确定(例如)返回哪些寄存器值。owcc -mabi=...
标志对应于wcc386 -ec...
标志,例如owcc -mabi=cdecl
与wcc386 -ecc
相同。owcc -mregparm=...
标志对应于未记录的(!)wcc386 -3...
标志,例如owcc -mregparm=0
与wcc386 -3s
相同,owcc -mregparm=3
与wcc386 -3r
相同。owcc -mregparm=3 -mabi=watcall
。owcc -mregparm=0 -mabi=pascal
、owcc -mregparm=0 -mabi=fortran
、owcc -mregparm=0 -mabi=watcall
、owcc -mregparm=0
。owcc -mregparm=0 -mabi=cdecl
,owcc -mregparm=0 -mabi=stdcall
,owcc -mregparm=0 -mabi=fastcall
,-mregparm=0 -mabi=syscall
,owcc -mregparm=3
,以及owcc -mregparm=3 -mabi=...
(任何-mabi=...
值)。