Assembler in C under Linux
Marshall Perrin
mperrin@hcs.harvard.edu
Thu Dec 2 11:37:00 GMT 1999
I'm trying to port a driver for a digital signal processor card from
DOS to Linux. The DOS driver, developed by someone not me ;-), is
mostly C but has a fair amount of inline assembler. For Borland C for
DOS, this was pretty easy to do. Just
asm {
mov dx, DSP_BaseIO
add dx, reg_offset
}
etc etc.
Gcc of course chokes on the above. I've attempted to read through the gcc
documentation and figure out how to do this, but no luck. That led me
towards something like
asm("mov dx, %0" : : "d" (DSP32C_BaseIo));
asm("add dx, %0" : : "d" (reg_offset));
asm("in ax,dx");
asm("mov %0,ax" :"=d" (value) : );
And yet I get the error message "/tmp/ccAimSJo.s:818: Error:
operands given don't match any known 386 instruction" over and over again
with that approach.
Poking through the kernel source leads me to try something like
asm("mov %%edx, %0" : : "b" (DSP_BaseIo));
asm("add %%edx, %0" : : "b" (reg_offset));
asm("in %%eax,%%edx");
asm("mov %0,%%eax" :"=b" (value) : );
But that's no luck either - If I comment out the third line, that compiles,
but if the 3rd line is there I get "/tmp/ccGjg9uV.s:26: Error: bad
register name ('%%eax')", which makes little sense as I use %%eax just fine
in the other three instructions.
So, what am I doing wrong? Any help here would be greatly appreciated, whether it be
pointer to a web page, book, or some other source of information. Thanks much!
- Marshall Perrin
Harvard/Smithsonian Center for Astrophysics
More information about the Gcc-help
mailing list