delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1997/10/31/14:31:38

From: jasonp AT Glue DOT umd DOT edu (Jason Stratos Papadopoulos)
Newsgroups: comp.os.msdos.djgpp
Subject: why won't this program compile?
Date: 26 Oct 1997 06:51:35 GMT
Organization: University of Maryland, College Park
Lines: 60
Message-ID: <62up9n$grf$1@hecate.umd.edu>
NNTP-Posting-Host: y.glue.umd.edu
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

I guess I should be more specific. With no optimization GAs bails out
during assembly (I think it adds extra sets of parentheses to the memory
operands in square() and then gets confused by them). However, with -O3 it
compiles fine. What gives?! 

I think the reason is that with full optimization (%0) becomes (%ebp)
-or whatever- but with anything else %0 is something like 4(%ebp) and
the assembler chokes on (4(%ebp)). 

Is this on the right track? It's certainly very strange, but for another
program I have which uses this function it won't run at all (-O2 will
compile but running the executable gives a general protection fault.

Thanks in advance,
jasonp

----------------CUT HERE INCLUDING THIS LINE-----------------------

#include <stdio.h>
#include <stdlib.h>

void square( unsigned long *a, unsigned long *b ){

   /* This function squares a 48-bit number "a" into a
      96 bit number "b", stored in binary and in little-
      endian order. */

    __asm__ ("
       movl (%0), %%eax       \n
       mull %%eax             \n
       movl %%eax, (%1)       \n
       movl 4(%0), %%eax      \n
       mull %%eax             \n
       movl %%eax, 8(%1)      \n
       movl %%edx, 4(%1)      \n
       movl 4(%0), %%eax      \n
       mull (%0)              \n
       addl %%eax, %%eax      \n
       adcl %%edx, %%edx      \n
       addl %%eax, 4(%1)      \n
       adcl %%edx, (%1)       \n"
    :
    : "g"(a), "g"(b)
    : "%eax", "%edx", "memory");
}

/*---------------------------------------------------------------------*/
int main( int argc, char *argv[] ) {
   unsigned long b[3], a[2];

   a[0]=atol(argv[1]);
   a[1]=atol(argv[2]);

   square(a,b);

   printf("%.8x %.8x %.8x\n\n", b[0], b[1], b[2]);
   return 0;
}


- Raw text -


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