delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1999/06/18/15:40:24

Sender: nate AT cartsys DOT com
Message-ID: <376AA084.C3776B20@cartsys.com>
Date: Fri, 18 Jun 1999 12:39:48 -0700
From: Nate Eldredge <nate AT cartsys DOT com>
X-Mailer: Mozilla 4.08 [en] (X11; I; Linux 2.2.10 i586)
MIME-Version: 1.0
To: djgpp AT delorie DOT com
Subject: Re: AT&T style asm problem
References: <01beb90f$e47e8f20$d1b2f1c3 AT scarfboy DOT tip DOT nl> <37698C10 DOT 1EA863E2 AT cartsys DOT com> <01beb9a0$5cbdc880$LocalHost AT scarfboy DOT tip DOT nl>
Reply-To: djgpp AT delorie DOT com

Bart Alewijnse wrote:
> 
> Nate Eldredge <nate AT cartsys DOT com> wrote in article
> <37698C10 DOT 1EA863E2 AT cartsys DOT com>...
> > Bart Alewijnse wrote:
> > >
> > > Okay.. I'm modifying a sprite compiler for use in djgpp, and I dunno
> how to
> > > do the following.
> > >
> > > I currently have
> > > fprintf(outfile," \"movb 0x%02X, 0x%X(%%%%edi,,)\\n\\t\" \n", byte1,
> > > offset);
> > >
> > > that's in my C code. (extended asm, and the four %'s become two in the
> > >  file that's  written to.)That resoves to
> > >         "movb 0x12, 0x11D3(%%edi,,) \n\t"
> > >
> > > The idea and the problem is the
> > > immed32(basepointer,indexpointer,indexscale)
> > > format. I dunno how to use it... (I never have before) edi contains the
> > > base screen
> > > pointer. Offset, which becomes the immed32 integer, is obviously the
> > > offset. What
> > > format do I use now? (I filled in constants for ease of reading)
> > > movb 0x12, 0x11D3(%%edi,$0,$0) ?
> > > movb 0x12, 0x11D3(,,%%edi) ?
> > > movb 0x12, 0x11D3($0,%%edi,$0) ?
> >
> > The effective address for `disp(base,index,scale)' is
> >
> > disp + base + (index * scale)
> Yup. Got that much. That's why I tried putting zeroes in there. As to the
> last two, well, I was desperate (and still am...)
> 
> > Where disp is a constant, base and index are registers, and scale is the
> > number 1, 2, 4 or (I think) 8.  (You don't need the $ delimiter in a
> > memory operand.)
> Ah.
> 
> > Any of these can be omitted, and you need not include the delimiters for
> > omitted ones if they are at the end.  So:
> >
> > disp
> > (base)
> > disp(base)
> > disp(base,index)  # scale assumed to be 1
> >
> > but
> >
> > disp(,index,scale) # must include the leading comma when omitting base
> >
> > are all valid.
> >
> > In your case, `0x1ed3(%edi)' is what you want, though `0x1ed3(,%edi)' or
> > `0x1ed3(,%edi,1)' would also work (though I think they might be larger
> > opcodes).
> The first does NOT work. eg. "movb 0x1e, 0x604c(%%edi) \n\t"
> (two %'s 'cos of extended asm, I hand it edi, it's the base screen pointer)
> gives a 'operands given don't match any known 386 instruction' error.
> 
> (I should capitalize those hex letters.)
> 
> The second (,%%edi) and third (,%%edi,1) do the same thing. Could it be
> that
> there's no such opcode with edi in it?
> 
> AAAAAAAAAAAAARGH!!!! I just realized a big mistake. The $.
> The bloody $. Okay. "movb $0x1e, $0x604c(%%edi) \n\t"
> Still no go. Same problem. As with your second solution,
> and your third. You want the source code with this?

No $ in the second one.

movb $0x1e, 0x604c(%%edi)

The $ is only used for an immediate operand which stands alone.

-- 

Nate Eldredge
nate AT cartsys DOT com

- Raw text -


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