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