Sender: nate AT cartsys DOT com Message-ID: <37698C10.1EA863E2@cartsys.com> Date: Thu, 17 Jun 1999 17:00:16 -0700 From: Nate Eldredge 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> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Reply-To: djgpp AT delorie 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) 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.) 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). -- Nate Eldredge nate AT cartsys DOT com