Zuzu JH
Zuzu JH

Reputation: 627

Understanding gdb produced assembly

I'm trying to uderstand the assembly code for my c program that I got from gdb disassemble, can you please help me.

my c code :

#include <unistd.h>



int main(int argc, char *argv[])

{

char buff[100];

/*if no argument…*/

if(argc <2)

{

   printf("Syntax: %s <input string>\n", argv[0]);

   exit (0);

     }

  strcpy(buff, argv[1]);

  return 0;

}

and the assembly code for my main function is:

Dump of assembler code for function main:

    0x08048424 <+0>:    push   %ebp
    0x08048425 <+1>:    mov    %esp,%ebp
    0x08048427 <+3>:    and    $0xfffffff0,%esp
    0x0804842a <+6>:    add    $0xffffff80,%esp
    0x0804842d <+9>:    cmpl   $0x1,0x8(%ebp)
    0x08048431 <+13>:    jg     0x8048454 <main+48>
    0x08048433 <+15>:    mov    0xc(%ebp),%eax
    0x08048436 <+18>:    mov    (%eax),%eax
    0x08048438 <+20>:    mov    %eax,0x4(%esp)
    0x0804843c <+24>:    movl   $0x8048544,(%esp)
    0x08048443 <+31>:    call   0x8048344 <printf@plt>
    0x08048448 <+36>:    movl   $0x0,(%esp)
    0x0804844f <+43>:    call   0x8048354 <exit@plt>
    0x08048454 <+48>:    mov    0xc(%ebp),%eax
    0x08048457 <+51>:    add    $0x4,%eax
    0x0804845a <+54>:    mov    (%eax),%eax
    0x0804845c <+56>:    mov    %eax,0x4(%esp)
    0x08048460 <+60>:    lea    0x1c(%esp),%eax

where is the part the allocates the buff[100] size?

Upvotes: 2

Views: 503

Answers (3)

Jean
Jean

Reputation: 7673

The following code

int main(int argc, char *argv[])
{

char buff[100];

requests the creation of a char[100] buffer on the stack. Here is what's actually happening:

;// 1. pushing the base pointer register on the stack
0x08048424 <+0>:    push   %ebp

;// 2. Creating the stack frame. Copying the stack pointer register to the base pointer 
;// register creates a stack frame: an area on the stack where a subroutine
;// can store local data.  
0x08048425 <+1>:    mov    %esp,%ebp

;// 3. Making sure that the stack is aligned to 16 bytes.
0x08048427 <+3>:    and    $0xfffffff0,%esp

;// 4. Making room for 128 bytes (100 as requested would throw off the alignment).
;// 128 is compatible with your requests and is optimized.
0x0804842a <+6>:    add    $0xffffff80,%esp

So, here is your buffer being created, on a 16-bytes aligned stack. You asked for 100, the compiler gives you at least 100, while optimizing for speed.

Upvotes: 4

Bo Persson
Bo Persson

Reputation: 92371

I guess it's this one add $0xffffff80,%esp. Moving the stack pointer to make space available inside the function.

Upvotes: 3

ouah
ouah

Reputation: 145899

Here:

add    $0xffffff80,%esp

This substracts 128 bytes (add -128) to ESP (stack pointer register).

Upvotes: 4

Related Questions