Mail Archives: djgpp/1996/06/02/11:37:49
Xref: | news2.mv.net comp.os.msdos.djgpp:4467
|
From: | Shawn Hargreaves <slh100 AT york DOT ac DOT uk>
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Re: Need help with ASM sprite routine
|
Date: | Sat, 1 Jun 1996 21:10:57 +0100
|
Organization: | The University of York, UK
|
Lines: | 51
|
Message-ID: | <Pine.SGI.3.91.960601205941.18048C-100000@tower.york.ac.uk>
|
NNTP-Posting-Host: | tower.york.ac.uk
|
Mime-Version: | 1.0
|
In-Reply-To: | <833618156.15278.0@gememail.demon.co.uk>
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
On Sat, 1 Jun 1996, Owen wrote:
> I have written a small routine to draw sprites on to bitmap images and
> I have got it to work in C. I have tried rewritting the inner loop
> using inline assembly but I can't get it to work. When I complie the
[stuff deleted]
> __asm__ __volatile__ ("pushl %%ecx \n"
> "pushl %%ebx \n"
> "pushl %%edi \n"
> "pushl %%esi \n"
> "movl %0,%%edi \n"
> "movl %1,%%esi \n"
> "movl %2,%%ecx \n"
[stuff deleted]
> : "r" (dest_data), "r" (src_data),"r" (width));
The way you are passing the parameters to the asm code is not correct.
Think about it: you are telling gcc to put dest_data, src_data, and width
in registers (any registers it likes), and then moving them to other
registers. What would happen if it put src_data in edi? When you move %0
(the dest_data value) to %%edi it will clobber your src_data value.
You can fix this by telling gcc exactly which registers you want the
parameters in. Get rid of the push and move instructions at the top of
the function, and change the constraints to:
: "D" (dest_data), "S" (src_data), "c" (width));
"D" means put it in edi, "S" means esi, and "c" means ecx. Alternatively
you could leave gcc with the choice of register, but then you should use
the registers it picks throughout your function, not move them to
hardcoded registers of your own, ie. your function should work entirely
with the %0 and %1 values.
Finally, if you need to save and restore specific registers, rather than
pushing and popping the values it is easier to just add them to the
clobbered list at the end of the asm statement. This way gcc will take
care of them for you, but it is more efficient because they will only be
saved/restored if they contain live data.
/*
* Shawn Hargreaves. Why is 'phonetic' spelt with a ph?
* Check out Allegro and FED on http://www.york.ac.uk/~slh100/
*/
- Raw text -