美文网首页
程序员自我修养6-库与运行库

程序员自我修养6-库与运行库

作者: S_s_s_a53f | 来源:发表于2017-08-18 18:25 被阅读0次

    01 栈

    一个栈的实例:

    图片.png

    图中栈底的地址是0xbfffffff,而exp寄存器标明了栈顶,地址为0xbffffff4。在栈上压入数据会导致esp减小,弹出数据使得esp增大。

    一个活动记录图:

    图片.png

    图中ebp固定在图中所示的位置,不随这个函数的执行而变化,相反地,esp始终指向栈顶,因此随着函数的执行,esp会不断变化。固定不变的ebp可以用来定位函数活动记录中的各个数据。在ebp之前首先是这个函数的返回地址,它的地址是ebp-4,再往前是压入栈中的参数。

    栈的标准开头和结尾:
    开头:

    push ebp
    mov ebp,esp
    

    结尾:

    mov esp,ebp
    pop ebp
    ret
    

    02堆

    linux堆进程管理的两个系统调用:一个是brk()系统调用,另外一个是mmap()。
    brk()的作用是设置进程数据段的结束地址,mmap()向操作系统申请一段虚拟地址空间

    03运行库

    glibc入口函数:_lib_start_main
    msvc入口函数:posvi分配内存不使用malloc而使用alloca,是因为在程序的一开始堆还没有被初始化,而alloca是唯一可以不使用堆的动态分配机制。alloca可以在栈上分配任意大小 的空间(只要栈的大小允许),并且在函数返回的时候会自动释放,就好像

    相关文章

      网友评论

          本文标题:程序员自我修养6-库与运行库

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