C语言重点之堆栈

2020-05-10  本文已影响0人  _笑口常开

栈是什么?

栈是硬件,一种数据结构,FIFO,push,pop;

栈底固定,栈顶浮动,栈顶由高地址位向低地址位移动;

栈保存的信息有哪些?

函数的返回地址和参数; 临时变量

堆是什么?

堆内存由malloc()、realloc()函数分配,free()函数释放;

尝试用栈在不传递参数的情况下,用print()函数打印main()函数中的arr数组中的各个元素

#include <stdio.h>

void print() {
    /*
    unsigned int %rbp;
    __asm{
        movq   %rsp, %rbp
    }
    */
}

int main(int argc, const char * argv[]) {
    int a = 1;
    int b = 2;
    char c = 'c';
    int arr[] = {11, 12, 13, 14, 15, 16,17};

    print();
    return 0;
}

分别添加代码,试图学习汇编,未果

void main()
{
    return;//breakpoint
}

    0x100000fb0 <+0>: pushq  %rbp
    0x100000fb1 <+1>: movq   %rsp, %rbp
->  0x100000fb4 <+4>: popq   %rbp
    0x100000fb5 <+5>: retq   

int main()
{
    return 0;//breakpoint
}

    0x100000fa0 <+0>:  pushq  %rbp
    0x100000fa1 <+1>:  movq   %rsp, %rbp
    0x100000fa4 <+4>:  xorl   %eax, %eax
    0x100000fa6 <+6>:  movl   $0x0, -0x4(%rbp)
->  0x100000fad <+13>: popq   %rbp
    0x100000fae <+14>: retq 

int main(int argc)
{
    return 0;//breakpoint
}

    0x100000fa0 <+0>:  pushq  %rbp
    0x100000fa1 <+1>:  movq   %rsp, %rbp
    0x100000fa4 <+4>:  xorl   %eax, %eax
    0x100000fa6 <+6>:  movl   $0x0, -0x4(%rbp)
    0x100000fad <+13>: movl   %edi, -0x8(%rbp)
->  0x100000fb0 <+16>: popq   %rbp
    0x100000fb1 <+17>: retq   

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

    return 0; //breakpoint
}

    0x100000fa0 <+0>:  pushq  %rbp
    0x100000fa1 <+1>:  movq   %rsp, %rbp
    0x100000fa4 <+4>:  xorl   %eax, %eax
    0x100000fa6 <+6>:  movl   $0x0, -0x4(%rbp)
    0x100000fad <+13>: movl   %edi, -0x8(%rbp)
    0x100000fb0 <+16>: movq   %rsi, -0x10(%rbp)
->  0x100000fb4 <+20>: popq   %rbp
    0x100000fb5 <+21>: retq  

int main(int argc, const char * argv[]) {
    int a = 10;
    return 0; //breakpoint
}

    0x100000f90 <+0>:  pushq  %rbp
    0x100000f91 <+1>:  movq   %rsp, %rbp
    0x100000f94 <+4>:  xorl   %eax, %eax
    0x100000f96 <+6>:  movl   $0x0, -0x4(%rbp)
    0x100000f9d <+13>: movl   %edi, -0x8(%rbp)
    0x100000fa0 <+16>: movq   %rsi, -0x10(%rbp)
    0x100000fa4 <+20>: movl   $0xa, -0x14(%rbp)
->  0x100000fab <+27>: popq   %rbp
    0x100000fac <+28>: retq  

int main(int argc, const char * argv[]) {
    print(); //breakpoint
    return 0;
}

    0x100000f90 <+0>:  pushq  %rbp
    0x100000f91 <+1>:  movq   %rsp, %rbp
    0x100000f94 <+4>:  subq   $0x10, %rsp
    0x100000f98 <+8>:  movl   $0x0, -0x4(%rbp)
    0x100000f9f <+15>: movl   %edi, -0x8(%rbp)
    0x100000fa2 <+18>: movq   %rsi, -0x10(%rbp)
    0x100000fa6 <+22>: callq  0x100000f80               ; print at main.c:11
    0x100000fab <+27>: xorl   %eax, %eax
->  0x100000fad <+29>: addq   $0x10, %rsp
    0x100000fb1 <+33>: popq   %rbp
    0x100000fb2 <+34>: retq   

//int a = 1;
//int b = 2;
//char c = 'c';
//int arr[] = {11, 12, 13, 14, 15, 16,17};

    0x100000f90 <+0>:  pushq  %rbp
    0x100000f91 <+1>:  movq   %rsp, %rbp
    0x100000f94 <+4>:  subq   $0x10, %rsp
    0x100000f98 <+8>:  movl   $0x0, -0x4(%rbp)
    0x100000f9f <+15>: movl   %edi, -0x8(%rbp)
    0x100000fa2 <+18>: movq   %rsi, -0x10(%rbp)
->  0x100000fa6 <+22>: callq  0x100000f80               ; print at main.c:11
    0x100000fab <+27>: xorl   %eax, %eax
    0x100000fad <+29>: addq   $0x10, %rsp
    0x100000fb1 <+33>: popq   %rbp
    0x100000fb2 <+34>: retq   

int a = 1;
    //int b = 2;
    //char c = 'c';
    //int arr[] = {11, 12, 13, 14, 15, 16,17};

    0x100000f80 <+0>:  pushq  %rbp
    0x100000f81 <+1>:  movq   %rsp, %rbp
    0x100000f84 <+4>:  subq   $0x20, %rsp
    0x100000f88 <+8>:  movl   $0x0, -0x4(%rbp)
    0x100000f8f <+15>: movl   %edi, -0x8(%rbp)
    0x100000f92 <+18>: movq   %rsi, -0x10(%rbp)
    0x100000f96 <+22>: movl   $0x1, -0x14(%rbp)
->  0x100000f9d <+29>: callq  0x100000f70               ; print at main.c:11
    0x100000fa2 <+34>: xorl   %eax, %eax
    0x100000fa4 <+36>: addq   $0x20, %rsp
    0x100000fa8 <+40>: popq   %rbp
    0x100000fa9 <+41>: retq 

int a = 1;
int b = 2;
    //char c = 'c';
    //int arr[] = {11, 12, 13, 14, 15, 16,17};

    0x100000f80 <+0>:  pushq  %rbp
    0x100000f81 <+1>:  movq   %rsp, %rbp
    0x100000f84 <+4>:  subq   $0x20, %rsp
    0x100000f88 <+8>:  movl   $0x0, -0x4(%rbp)
    0x100000f8f <+15>: movl   %edi, -0x8(%rbp)
    0x100000f92 <+18>: movq   %rsi, -0x10(%rbp)
    0x100000f96 <+22>: movl   $0x1, -0x14(%rbp)
    0x100000f9d <+29>: movl   $0x2, -0x18(%rbp)
->  0x100000fa4 <+36>: callq  0x100000f70               ; print at main.c:11
    0x100000fa9 <+41>: xorl   %eax, %eax
    0x100000fab <+43>: addq   $0x20, %rsp
    0x100000faf <+47>: popq   %rbp
    0x100000fb0 <+48>: retq  

int a = 1;
int b = 2;
char c = 'c';
    //int arr[] = {11, 12, 13, 14, 15, 16,17};

    0x100000f80 <+0>:  pushq  %rbp
    0x100000f81 <+1>:  movq   %rsp, %rbp
    0x100000f84 <+4>:  subq   $0x20, %rsp
    0x100000f88 <+8>:  movl   $0x0, -0x4(%rbp)
    0x100000f8f <+15>: movl   %edi, -0x8(%rbp)
    0x100000f92 <+18>: movq   %rsi, -0x10(%rbp)
    0x100000f96 <+22>: movl   $0x1, -0x14(%rbp)
    0x100000f9d <+29>: movl   $0x2, -0x18(%rbp)
    0x100000fa4 <+36>: movb   $0x63, -0x19(%rbp)
->  0x100000fa8 <+40>: callq  0x100000f70               ; print at main.c:11
    0x100000fad <+45>: xorl   %eax, %eax
    0x100000faf <+47>: addq   $0x20, %rsp
    0x100000fb3 <+51>: popq   %rbp
    0x100000fb4 <+52>: retq 

int a = 1;
int b = 2;
char c = 'c';
int arr[] = {11, 12, 13, 14, 15, 16,17};

    0x100000ee0 <+0>:   pushq  %rbp
    0x100000ee1 <+1>:   movq   %rsp, %rbp
    0x100000ee4 <+4>:   subq   $0x50, %rsp
    0x100000ee8 <+8>:   movq   0x111(%rip), %rax         ; (void *)0x00007fff94177d40: __stack_chk_guard
    0x100000eef <+15>:  movq   (%rax), %rax
    0x100000ef2 <+18>:  movq   %rax, -0x8(%rbp)
    0x100000ef6 <+22>:  movl   $0x0, -0x34(%rbp)
    0x100000efd <+29>:  movl   %edi, -0x38(%rbp)
    0x100000f00 <+32>:  movq   %rsi, -0x40(%rbp)
    0x100000f04 <+36>:  movl   $0x1, -0x44(%rbp)
    0x100000f0b <+43>:  movl   $0x2, -0x48(%rbp)
    0x100000f12 <+50>:  movb   $0x63, -0x49(%rbp)
    0x100000f16 <+54>:  movq   0x73(%rip), %rax
    0x100000f1d <+61>:  movq   %rax, -0x30(%rbp)
    0x100000f21 <+65>:  movq   0x70(%rip), %rax
    0x100000f28 <+72>:  movq   %rax, -0x28(%rbp)
    0x100000f2c <+76>:  movq   0x6d(%rip), %rax
    0x100000f33 <+83>:  movq   %rax, -0x20(%rbp)
    0x100000f37 <+87>:  movl   0x6b(%rip), %ecx
    0x100000f3d <+93>:  movl   %ecx, -0x18(%rbp)
->  0x100000f40 <+96>:  callq  0x100000ed0               ; print at main.c:11
    0x100000f45 <+101>: movq   0xb4(%rip), %rax          ; (void *)0x00007fff94177d40: __stack_chk_guard
    0x100000f4c <+108>: movq   (%rax), %rax
    0x100000f4f <+111>: movq   -0x8(%rbp), %rdx
    0x100000f53 <+115>: cmpq   %rdx, %rax
    0x100000f56 <+118>: jne    0x100000f64               ; <+132> at main.c
    0x100000f5c <+124>: xorl   %eax, %eax
    0x100000f5e <+126>: addq   $0x50, %rsp
    0x100000f62 <+130>: popq   %rbp
    0x100000f63 <+131>: retq   
    0x100000f64 <+132>: callq  0x100000f6c               ; symbol stub for: __stack_chk_fail
    0x100000f69 <+137>: ud2    
上一篇 下一篇

猜你喜欢

热点阅读