www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1998/08/19/10:09:54

From: GAMMELJL AT SLU DOT EDU
Date: Wed, 19 Aug 1998 09:08:57 -0500 (CDT)
Subject: assembly language subroutines
To: djgpp AT delorie DOT com
Message-id: <01J0S6CR6YJM94G7O9@SLU.EDU>
Organization: SAINT LOUIS UNIVERSITY St. Louis, MO
MIME-version: 1.0

The C++ compiler seems to have a slightly different programming
style than george DOT foot AT merton DOT oxford DOT ac DOT uk.

Here is how the gnu compiler programs a subroutine which has two
arguments, both of which are arrays.  The C++ version of sub is:
            sub(unsigned int *z1,unsigned int *z2)
              {i=666;  //a line to mark beginning of code
               .C++ CODE
               return 0;    //xorl %eax,%eax marks end of code
              }

.globl _sub__FPUiT0
_sub__FPUiT0:
        pushl %ebp       The first eight lines are straightforward
        movl %esp,%ebp   but I do not relate them well to the
        subl $40,%esp    lines after xorl %eax,%eax below.
        pushl %edi       Will be used for origin of one of the arrays.
        pushl %esi       Will be used for origin of the other array.
        pushl %ebx       Will be used to number elements of the arrays.
        movl 8(%ebp),%edi  Origin of z1 stored in edi.
        movl 12(%ebp),%esi Origin of z2 stored in esi.
        movl $666,_i       Marks beginning of C++ code.
        .followed by lines of assembly language
        .easily recognizable as arising from CODE.
        .
        .    The stack is addressed frequently using N(%ebp)
        .where N is a negative multiple of 4 (-40<=N<=-4)
        .
        .ebp is not changed during the program.
        .esp is not changed during the program.
        .
        xorl %eax,%eax       Marks the end of the C++ code.
        leal -52(%ebp),%esp  My question is: What is going on 
        popl %ebx            in these remaining lines?
        popl %esi            I understand the 3 popl, but not 
        popl %edi            the "leal -52 etc." and the "leave"  
        leave                or why the order of the commands is 
        ret                  what it is.  Notice that there is no 
        .align 2             popl %ebp.  What does "leave" do? 

A simpler example has the following source code:

sub2(int a,int b)
  {i1=666;               //int i1 is a global variable
   return a+b;}

For sub2 gnu compiler produces:

.globl _zadd__FUiUi
_zadd__FUiUi:
	pushl %ebp
	movl %esp,%ebp
        movl $666,_i1        Marks beginning of C++ code.
	movl 8(%ebp),%eax
        addl 12(%ebp),%eax   Marks end of C++ code
	leave
	ret

The gnu compiler does not restore esp (no reason to: it was never
changed) or (unless leave does it) ebp.  But if sub2 is used many
times in the code so that ebp is pushed many times, isn't there a
danger of stack overflow (or memory leak)?  George Foot is always
careful to popl %ebp at the end of the subroutine after restoring
esp (if it has been changed with a subl $4,%esp as on page 4 of
his notes,for instance) with movl %ebp,%esp. George Foot's
programming style is straightforward.  Why the difference in
the two styles?




- Raw text -


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