Mail Archives: djgpp/2000/04/25/19:25:40
From: | Richard Dawe <richdawe AT bigfoot DOT com>
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Inline asm: lcall & various binutils versions
|
Date: | Tue, 25 Apr 2000 21:48:21 +0100
|
Organization: | Customer of Planet Online
|
Lines: | 64
|
Message-ID: | <39060495.8CA597B0@bigfoot.com>
|
NNTP-Posting-Host: | modem-88.argon.dialup.pol.co.uk
|
Mime-Version: | 1.0
|
X-Trace: | newsg4.svr.pol.co.uk 956698207 17366 62.136.17.88 (25 Apr 2000 21:30:07 GMT)
|
NNTP-Posting-Date: | 25 Apr 2000 21:30:07 GMT
|
X-Complaints-To: | abuse AT theplanet DOT net
|
X-Mailer: | Mozilla 4.51 [en] (X11; I; Linux 2.2.14 i586)
|
X-Accept-Language: | de,fr
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
Reply-To: | djgpp AT delorie DOT com
|
Hello.
I'm trying to get libsocket to be buildable with the following versions of
binutils (& gcc):
binutils 2.8.1 (gcc 2.95.2)
binutils 2.9.5.1 beta (gcc 2.95.2)
cross-binutils 2.9.1.0.4 (cross-egcs 1.1.2 aka 2.91.66 19990314) on Linux
libsocket uses INT 0x2F, subfunction 0x1684 to obtain the entry point of
WSOCK.VXD. This is stored in an array of type int[2] (*). Once the
entry-point has been obtained, the VxD is called using inline assembly's
lcall mnemonic. Here's some pseudo-code:
int entrypoint[2];
get_entry_point("WSOCK.VXD", entrypoint);
__asm__("\n\
...
lcall _entrypoint \n\
...
");
get_entry_point() places ES:DI from the INT call into entrypoint[1] and
entrypoint[0] respectively.
(*) This array may be too big in total byte-size, but it works. When I
change it to a short, GPFs are generated. I wonder if this is because INT
0x2F, subfunction 0x1684 returns a selector:offset pair in protected mode,
i.e. 16-bit:32-bit, whereas it returns 16-bit:16-bit in real mode (as
listed in Ralph Brown's Interrupt List).
My first problem is this: binutils 2.8.1 & cross-binutils 2.9.1.0.4 were
happy with the 'lcall _entrypoint' syntax. binutils 2.9.5.1 beta is OK,
but warns that without a '*' the address is a relative address. With the
'lcall *_entrypoint' syntax, to use an absolute address, binutils 2.8.1
and cross-binutils 2.9.1.0.4 complain that this does not represent a known
Intel instruction (binutils 2.9.5.1 beta is happy and then code works).
What syntax should I use? Should this be a far call (i.e. lcall rather
than call)? Should I instead use a syntax like:
lcall *_entrypoint[1]:_entrypoint[0]
I guess I should I move away from a two-int structure to something like
this:
struct entrypoint {
short selector;
int offset;
};
I am hoping some of the asm wizards on this group can help me out here.
I've read the info docs for as & the asm guides I have, but I am clueless
here.
This difference in syntax acceptance is a bit of a mess really. Is there
some kind of 'gcc & binutils syntax gotchas FAQ'?
Thanks in advance for any help, bye,
--
Richard Dawe
richdawe AT bigfoot DOT com ICQ 47595498 http://www.bigfoot.com/~richdawe/
- Raw text -