|
|
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] |
On 17/02/12 22:51, David Given wrote:
[...]
> Regarding C compilers --- has anyone ever tried Open Watcom? It claims
> to support all these weird 8086 segmentation modes, and there is a Linux
> version. It's also supposed to produce pretty decent code, which may
> well be more compact than bcc's and so save crucial kernel space. Never
> touched it myself, though.
I just had a play. Apparently Open Watcom produces OMF object files,
which none of myself, binutils-multiarch or file have ever heard of.
Rumour has it that the Open Watcom linker is capable of being scripted
--- I don't know whether this is to a useful extent.
OTOH the code is definitely good. Here's a source file:
int global;
fnord(a, b)
int a;
int b;
{
int i = a + b;
int j = global - a;
global += i;
return j;
}
(K&R C because I wanted to use the same file for Open Watcom and bcc;
Open Watcom supports ANSI. It even supports some C99.)
In fastcall mode, Open Watcom produces:
0000 @fnord:
0000 01 C2 add dx,ax
0002 8B 1E 00 00 mov bx,word ptr _global
0006 29 C3 sub bx,ax
0008 89 D8 mov ax,bx
000A 01 16 00 00 add word ptr _global,dx
000E C3 ret
In cdecl mode, it produces:
0000 _fnord:
0000 55 push bp
0001 89 E5 mov bp,sp
0003 8B 46 04 mov ax,word ptr 0x4[bp]
0006 8B 56 06 mov dx,word ptr 0x6[bp]
0009 01 C2 add dx,ax
000B 8B 1E 00 00 mov bx,word ptr _global
000F 29 C3 sub bx,ax
0011 89 D8 mov ax,bx
0013 01 16 00 00 add word ptr _global,dx
0017 5D pop bp
0018 C2 04 00 ret 0x0004
bcc produces (and you may want to brace yourselves):
_fnord:
push bp
mov bp,sp
push di
push si
dec sp
dec sp
mov ax,4[bp]
add ax,6[bp]
mov -6[bp],ax
dec sp
dec sp
mov ax,[_global]
sub ax,4[bp]
mov -8[bp],ax
mov ax,[_global]
add ax,-6[bp]
mov [_global],ax
mov ax,-8[bp]
add sp,*4
pop si
pop di
pop bp
ret
Note that that last is without optimisation; when I try -O I get an
error message about not being able to find /usr/lib/bcc/rules.start. Is
optimisation supported for the 8086? Also I notice that the bcc code
seems to be returning the value in ax, so I may not have got the calling
conventions to match.
If anyone actually wanted to use this, I suspect the easiest thing to do
would be to compile with Open Watcom, disassemble the object files and
use a script of some kind to convert them to gas syntax. Which would
suck, but is almost certainly easier than adding OMF support to dev86.
--
┌─── dg@cowlark.com ───── http://www.cowlark.com ─────
│
│ "Never attribute to malice what can be adequately explained by
│ stupidity." --- Nick Diamos (Hanlon's Razor)
Attachment:
signature.asc
Description: OpenPGP digital signature
![]() |
![]() |