2 added 743 characters in body
source | link

I have a simple c++ code as the following:

#include <iostream>

int main() {
    int a = 5;
    int *b = (int *) malloc(40);
    return 0;
}

Setting a breakpoint using GDB on line 5 and running disas will output the following:

Dump of assembler code for function main():
   0x0000000100000f60 <+0>: push   %rbp
   0x0000000100000f61 <+1>: mov    %rsp,%rbp
   0x0000000100000f64 <+4>: sub    $0x10,%rsp
   0x0000000100000f68 <+8>: mov    $0x28,%eax
   0x0000000100000f6d <+13>:    mov    %eax,%edi
   0x0000000100000f6f <+15>:    movl   $0x0,-0x4(%rbp)
   0x0000000100000f76 <+22>:    movl   $0x5,-0x8(%rbp)
=> 0x0000000100000f7d <+29>:    callq  0x100000f90
   0x0000000100000f82 <+34>:    xor    %ecx,%ecx
   0x0000000100000f84 <+36>:    mov    %rax,-0x10(%rbp)
   0x0000000100000f88 <+40>:    mov    %ecx,%eax
   0x0000000100000f8a <+42>:    add    $0x10,%rsp
   0x0000000100000f8e <+46>:    pop    %rbp
   0x0000000100000f8f <+47>:    retq  

Here are my questions:

1- Is all the stack needed for my app within this output? if I'm not mistaking the stack is pointed by rbp and moves down?

2- b is on the heap correct? I can see the address of it using x b.

3- Why does x a result in an error Cannot access memory at address 0x5? is it because 5 isn't actually anywhere on the memory? I can see it's part of the instruction movl $0x5,-0x8(%rbp)

Edit (more questions):

4- I have read that int a = 5; means variable a is created on the stack (memory) with the value 5, is this correct? when I look at the generated assembly, the value 5 is directly within the instruction set (movl $0x5,-0x8(%rbp), there is no reference to a memory location. If it IS on the memory then how can I see it's memory address? if it is NOT then why do I read that a is on the stack (memory)?

5- I know heap is also on the memory, is it visible from the above assembly?

6- I guess my biggest confusion and question is the relation between memory management and generated assembly, can I always point out what/where the heap/stack are given a assembly code? if not what else is needed?

I have a simple c++ code as the following:

#include <iostream>

int main() {
    int a = 5;
    int *b = (int *) malloc(40);
    return 0;
}

Setting a breakpoint using GDB on line 5 and running disas will output the following:

Dump of assembler code for function main():
   0x0000000100000f60 <+0>: push   %rbp
   0x0000000100000f61 <+1>: mov    %rsp,%rbp
   0x0000000100000f64 <+4>: sub    $0x10,%rsp
   0x0000000100000f68 <+8>: mov    $0x28,%eax
   0x0000000100000f6d <+13>:    mov    %eax,%edi
   0x0000000100000f6f <+15>:    movl   $0x0,-0x4(%rbp)
   0x0000000100000f76 <+22>:    movl   $0x5,-0x8(%rbp)
=> 0x0000000100000f7d <+29>:    callq  0x100000f90
   0x0000000100000f82 <+34>:    xor    %ecx,%ecx
   0x0000000100000f84 <+36>:    mov    %rax,-0x10(%rbp)
   0x0000000100000f88 <+40>:    mov    %ecx,%eax
   0x0000000100000f8a <+42>:    add    $0x10,%rsp
   0x0000000100000f8e <+46>:    pop    %rbp
   0x0000000100000f8f <+47>:    retq  

Here are my questions:

1- Is all the stack needed for my app within this output? if I'm not mistaking the stack is pointed by rbp and moves down?

2- b is on the heap correct? I can see the address of it using x b.

3- Why does x a result in an error Cannot access memory at address 0x5? is it because 5 isn't actually anywhere on the memory? I can see it's part of the instruction movl $0x5,-0x8(%rbp)

I have a simple c++ code as the following:

#include <iostream>

int main() {
    int a = 5;
    int *b = (int *) malloc(40);
    return 0;
}

Setting a breakpoint using GDB on line 5 and running disas will output the following:

Dump of assembler code for function main():
   0x0000000100000f60 <+0>: push   %rbp
   0x0000000100000f61 <+1>: mov    %rsp,%rbp
   0x0000000100000f64 <+4>: sub    $0x10,%rsp
   0x0000000100000f68 <+8>: mov    $0x28,%eax
   0x0000000100000f6d <+13>:    mov    %eax,%edi
   0x0000000100000f6f <+15>:    movl   $0x0,-0x4(%rbp)
   0x0000000100000f76 <+22>:    movl   $0x5,-0x8(%rbp)
=> 0x0000000100000f7d <+29>:    callq  0x100000f90
   0x0000000100000f82 <+34>:    xor    %ecx,%ecx
   0x0000000100000f84 <+36>:    mov    %rax,-0x10(%rbp)
   0x0000000100000f88 <+40>:    mov    %ecx,%eax
   0x0000000100000f8a <+42>:    add    $0x10,%rsp
   0x0000000100000f8e <+46>:    pop    %rbp
   0x0000000100000f8f <+47>:    retq  

Here are my questions:

1- Is all the stack needed for my app within this output? if I'm not mistaking the stack is pointed by rbp and moves down?

2- b is on the heap correct? I can see the address of it using x b.

3- Why does x a result in an error Cannot access memory at address 0x5? is it because 5 isn't actually anywhere on the memory? I can see it's part of the instruction movl $0x5,-0x8(%rbp)

Edit (more questions):

4- I have read that int a = 5; means variable a is created on the stack (memory) with the value 5, is this correct? when I look at the generated assembly, the value 5 is directly within the instruction set (movl $0x5,-0x8(%rbp), there is no reference to a memory location. If it IS on the memory then how can I see it's memory address? if it is NOT then why do I read that a is on the stack (memory)?

5- I know heap is also on the memory, is it visible from the above assembly?

6- I guess my biggest confusion and question is the relation between memory management and generated assembly, can I always point out what/where the heap/stack are given a assembly code? if not what else is needed?

1
source | link

Analyzing stack and heap using GDB and C++

I have a simple c++ code as the following:

#include <iostream>

int main() {
    int a = 5;
    int *b = (int *) malloc(40);
    return 0;
}

Setting a breakpoint using GDB on line 5 and running disas will output the following:

Dump of assembler code for function main():
   0x0000000100000f60 <+0>: push   %rbp
   0x0000000100000f61 <+1>: mov    %rsp,%rbp
   0x0000000100000f64 <+4>: sub    $0x10,%rsp
   0x0000000100000f68 <+8>: mov    $0x28,%eax
   0x0000000100000f6d <+13>:    mov    %eax,%edi
   0x0000000100000f6f <+15>:    movl   $0x0,-0x4(%rbp)
   0x0000000100000f76 <+22>:    movl   $0x5,-0x8(%rbp)
=> 0x0000000100000f7d <+29>:    callq  0x100000f90
   0x0000000100000f82 <+34>:    xor    %ecx,%ecx
   0x0000000100000f84 <+36>:    mov    %rax,-0x10(%rbp)
   0x0000000100000f88 <+40>:    mov    %ecx,%eax
   0x0000000100000f8a <+42>:    add    $0x10,%rsp
   0x0000000100000f8e <+46>:    pop    %rbp
   0x0000000100000f8f <+47>:    retq  

Here are my questions:

1- Is all the stack needed for my app within this output? if I'm not mistaking the stack is pointed by rbp and moves down?

2- b is on the heap correct? I can see the address of it using x b.

3- Why does x a result in an error Cannot access memory at address 0x5? is it because 5 isn't actually anywhere on the memory? I can see it's part of the instruction movl $0x5,-0x8(%rbp)