Mail Archives: djgpp/1996/10/29/10:50:19
| From: | devpoly AT cict DOT fr (BARDOU Jean-François) | 
| Newsgroups: | comp.os.msdos.djgpp | 
| Subject: | Inline ASM with DJGPP : should be more clear :) with this | 
| Date: | Tue, 29 Oct 1996 13:18:29 UNDEFINED | 
| Organization: | CRDP de Toulouse | 
| Lines: | 102 | 
| Message-ID: | <devpoly.117.01127EF5@cict.fr> | 
| NNTP-Posting-Host: | pc-devpoly.cict.fr | 
| Keywords: | inline asm | 
| To: | djgpp AT delorie DOT com | 
| DJ-Gateway: | from newsgroup comp.os.msdos.djgpp | 
                        
                        DJGPP and INLINE ASM
 Hello all !
 I've been messing up with DGJPP inline ASM recently (3 days to understand !!),
 and I think I should give you what I learned :)
 First of all, get Brennan tutorials on ASM with DJGPP
 ( http://www.rt66.com/~brennan/djgpp )
 It's excellent to start.
 Then you must know that :
 1- Locals variables names are unknow in inline asm, only globals vars are. 
 
        If you want to see why, try to compile your work with
                        gcc -S myfile.c   -> gives ASM version only, no link      
        instead of      gcc -o myfile.c   -> gives EXE version, after link
        
        Look at your asm function: locals vars are access with (%ebp) !
        (simply logical !)
        You should use this method (gcc -S), every time you aren't sure of the 
        asm code you write, just to be sure DGJPP understands what you want.
 2- To use locals vars in inline asm, I'll give an example:
        #include <stdlib.h>     /* for rand     */
        #include <go32.h>       /* for _dos_ds  */
        void fill_screen13( void) {
        int x, y;
        unsigned char col;
        
          while (!key[ KEY_ESC]) {
            x = rand() % 320;
            y = rand() % 200;
            col = rand() % 256;
            __asm__ __volatile__ ("
                 movw %0, %%es
                 movb %%ax, %%es:(%%edi)"
                 :                      /* no outputs           */
                 : "g" (_dos_ds),       /* put _dos_ds anywhere */
                   "D" (0xA0000+(unsigned long)(y*320+x)), 
                                        /* put offset in edi    */
                   "a" (col)            /* put col in eax       */
                 : "eax", "edi");       /* modifie eax, edi     */
            }
          }
        So you can't use directly your locals vars in the inline asm, BUT
        you can use them in the input/output field !!
 3 - To use parameters of the functions, it's the same thing :
        
        #include <stdlib.h>     /* for rand     */
        #include <go32.h>       /* for _dos_ds  */
        
        void putpixel13( int x, int y) {
        unsigned char col;
          col = rand() % 256;
          __asm__ __volatile__ ("
                movw %0, %%es
                movb %%al, %%es:(%%edi)"
                : /* no outputs */
                : "g" (_dos_ds),        /* put _dos_ds anywhere */
                  "a" (col),            /* put col in eax       */
                  "D" (0xA0000+(unsigned long)(y*320+x)) /* put offset in edi */
                : "eax", "edi");
        }
        This time we have mixed parameters AND locals vars.
        Isn't it easy ;)
 Conclusion -
 All the above examples work (for me hopefully 8) ).
 Now, I'm sure you have catched the feeling of the AT&T inline asm.
 It's really easy and it's rather like watcom inline assembly.
 Hope this helps, like it did for me... 
 L8r Denis ;)
                /*======================================*\
                ||   Guillemenot "DD" Denis             || 
                ||   Email:  devpoly AT cict DOT fr            || 
                ||   iRC  : _dd_ on #demofr, #coders    || 
                \*======================================*/
        
- Raw text -