Subject: Re: advice on some inline assembler code
To: None <jonb@metronet.com>
From: Ian Dall <Ian.Dall@dsto.defence.gov.au>
List: port-pc532
Date: 09/28/1998 12:53:22
Jon Buller <jonb@metronet.com> writes:
>> That's because you added _res to the list of input operands for your
>> assembler pattern. You have to add it to the list of output operands.
>> Try the following definition:
>>
>> static __inline__ int
>> tas(volatile slock_t *lock)
>> {
>> register _res;
>> __asm__("sbitb 0,%0; sfs %1" : "=m"(*lock), "r"(_res));
>> return (int) _res;
>> }
>>
>> "sfs" (Scondi, save condition as boolean) should store a "1" to _res
>> when the flag bit is set due to the "sbitb" instruction.
> Thanks again Matthias. You missed one thing though, "r" needs to
> be "=r". I had tried something similar to that before, and the
> error made me look at the VAX code, and that made me modify it to
> the top piece of code rather than the bottom. Is there anyplace
> this is documented, so a mere mortal can figure out if they need
> colons or commas seperating things, if the things should be "r",
> "=r", "=m", "=g", etc.?
Well, I assume you have read the gcc info documentation. If not, look
under "C Extensions" and "Extended Asm". I find it is not too bad, although
you need to follow the constraints cross reference to find out what all
the letters mean.
Ian