美文网首页
C语言重点之堆栈

C语言重点之堆栈

作者: _笑口常开 | 来源:发表于2020-05-10 21:27 被阅读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    

相关文章

  • C语言重点之堆栈

    栈是什么? 栈是硬件,一种数据结构,FIFO,push,pop; 栈底固定,栈顶浮动,栈顶由高地址位向低地址位移动...

  • 堆栈(C语言)

    堆栈(顺序存储)数组方式 一个有界数组存储两个堆栈 堆栈(链式存储) 中缀表达式如何转换为后缀表达式从头到尾读取中...

  • Lua和C如何交互(一)

    要理解Lua和C的交互,先要理解堆栈和全局表两个概念 堆栈 Lua和C/C++语言交互的主要方法是一个无处不在的虚...

  • C语言重点之指针

    指针是什么?指针占用的内存空间是多少?指针变量是什么? 指针占用的内存大小——4个字节(32位系统),为什么都是4...

  • Linux内核分析:操作系统是如何工作的?

    函数调用堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 堆栈的几个重要功能 函数调用框架 传递参数...

  • C语言函数调用堆栈框架

    堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 -- 函数调用堆栈框架 -- 传递参数 -- 保存返回...

  • C语言内存及堆栈操作

    毕业了,想留的人没能留住,想要的生活也没有如约而至,也就这样了。。。 ---- 网易云热评 在程序没有执行前,有几...

  • 深入理解函数调用堆栈

    堆栈是C语言程序运行时一个必须的记录函数调用路径和参数的空间。堆栈提供函数调用框架,具有传递参数,保存函数返回地址...

  • C语言05- 指针

    C语言05- 指针 13:指针 指针是C语言中的精华,也是C语言程序的重点和难点。 13.1:指针定义与使用 指针...

  • Lua和C交互的简易教程

    Lua栈 要理解Lua和C++交互,首先要理解Lua堆栈。简单来说,Lua和C/C++语言通信的主要方法是一个无处...

网友评论

      本文标题:C语言重点之堆栈

      本文链接:https://www.haomeiwen.com/subject/irvsnhtx.html