delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1999/03/30/22:40:38

From: "Andrew Davidson" <andrew AT lemure DOT freeserve DOT co DOT uk>
Newsgroups: comp.os.msdos.djgpp
Subject: How does DJGPP store its structs?
Date: Wed, 31 Mar 1999 04:00:17 +0100
Organization: Customer of Planet Online
Lines: 46
Message-ID: <7ds34s$mpf$1@news7.svr.pol.co.uk>
NNTP-Posting-Host: modem-73.xenon.dialup.pol.co.uk
X-Trace: news7.svr.pol.co.uk 922849244 23343 62.136.26.201 (31 Mar 1999 03:00:44 GMT)
NNTP-Posting-Date: 31 Mar 1999 03:00:44 GMT
X-Complaints-To: abuse AT theplanet DOT net
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 5.00.2014.211
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2014.211
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

I need to create a rather complex structure but have, so far, been unable to
achieve this.

The structure looks like this:

typedef struct {
    unsigned char callbyte;
    signed long offset;
    unsigned char retbyte;

    // various other longs/shorts/chars etc
} scratch;

This probably needs a little explaining. Callbyte (should be located at byte
0 of a scratch structure) contains the value 0xe8 (near 32bit call with
offset - in machine code) and retbyte contains 0xc3 (return from near call
in machine code). 'offset' is then written to within the C code forming a
small section of self modifying code. This code is called by passing a
pointer to the struct to a simple 1 line asm() 'call'. My problem is that,
although I would expect callbyte, offset, and retbyte to occupy the first 6
bytes of memory, they appear to be each occupying 4 bytes for a total of 12
bytes of memory.

The structure is used in the following way within my code...

typedef struct {
    scratch *scratchmem;
    char *workmem;

    // various other longs/shorts.chars etc
} mainstruct;

mainstruct *mystruct;

I malloc memory for mystruct, scratchmem, and workmem, and I set all
appropriate variables.
I've tested the structs and all stuff done from within C code works fine.
Is this 12 byte thing the result of the way I'm trying to use the scratch
struct (from within another struct) or just a limitation of djgpp? I have a
feeling that djgpp might be trying to optimise the struct  so is there any
way I can dissable this optimisation while keeping all the other forms of
optimisation available?

Andrew


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019