delorie.com/archives/browse.cgi   search  
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 -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019