A question about register constraint of inline assembly
Lin Chun-Zhi
lcz90@cs.ccu.edu.tw
Thu Jun 2 05:23:00 GMT 2005
On 01 Jun 2005 23:23:46 -0400, Ian Lance Taylor wrote
> "Lin Chun-Zhi" <lcz90@cs.ccu.edu.tw> writes:
>
> > I got a question about register constraint in kernel source.
> > Here is the cut of bios32_service()
> >
> > 597 __asm__("lcall (%%edi); cld"
> > 598 : "=a" (return_code),
> > 599 "=b" (address),
> > 600 "=c" (length),
> > 601 "=d" (entry)
> > 602 : "" (service),
> > 603 "1" (0),
> > 604 "D" (&bios32_indirect));
> >
> > In line 602, its register constraint is a NULL string. I can't find how
> > compiler arranges the registers in gcc.info.
>
> If there are no constraints, the compiler does not constrain the
> operand. It could be anywhere. The statement will use "service",
> though; assignments to it will not be deleted.
>
> By the way, in linux-2.6.8.1 that statement looks like this:
>
> __asm__("lcall *(%%edi); cld"
> : "=a" (return_code),
> "=b" (address),
> "=c" (length),
> "=d" (entry)
> : "0" (service),
> "1" (0),
> "D" (&bios32_indirect));
>
> Ian
Thank you, Ian. I got it.
But there is another wield thing. I can't pass the compiling stage use the
code below.
int main(void)
{
int __value, __port;
asm volatile ( "movl %1,%0" : "=a" (__value), "=d" (__port)
: "" (__value), "1" (__port)
);
return 0;
}
The error message is
[root@littleroach tmp]# gcc a.c
a.c: In function `main':
a.c:10: warning: asm operand 2 probably doesn't match constraints
a.c:10: error: impossible constraint in `asm'
But the same code in the kernel works very well.
Do I miss something?
Roach
--
Open WebMail Project (http://openwebmail.org)
More information about the Gcc-help
mailing list