Sender: nate AT cartsys DOT com Message-ID: <376AA084.C3776B20@cartsys.com> Date: Fri, 18 Jun 1999 12:39:48 -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> <37698C10 DOT 1EA863E2 AT cartsys DOT com> <01beb9a0$5cbdc880$LocalHost 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: > > Nate Eldredge 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