Linux内核分析(堆栈)

来源:互联网 发布:ip地址绑定mac地址 编辑:程序博客网 时间:2024/06/05 05:05

网易云课堂的第一周笔记
刘森林
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”

  1. 汇编语言的寻址模式

movl %eax,%edx edx=eax 寄存器寻址 registermode(相当于c地址指针赋值)

movl $0x123, %edx edx=0x123 立即寻址 immediate(相当于直接赋值地址值给c指针)

movl 0x123,%edx edx=(int)0x123 直接寻址 direct(相当于获取地址指针的内容,* 操作)

movl (%ebx),%edx edx=(int)ebx 间接寻址 indirect(相当于地址指针赋值后取值)

movl 4(%ebx),%edx edx=(int)(ebx +4) 变址寻址 displaced(相当于地址指针增加后,赋值后取值)

  1. 和堆栈操作相关的重要指令
    和堆栈操作相关的重要指令
  2. 在云课堂实验楼做反汇编实验

在CODE文件夹中创建main.c的C语言文件
这里写图片描述

将C语言文件转换为汇编语言
gcc –S –o main.s main.c -m32
这里写图片描述
删去链接用的多余的代码,剩下纯汇编代码

_g:      pushl   %ebp      movl    %esp, %ebp      movl    8(%ebp), %eax //压入ebp地址,改变ebp,然后把8赋予eax    addl    $3, %eax  //往eax加3    popl    %ebp  //把exp的值给ebp,相当于ebp值回地址B    ret  //ret后,eip指向leave指令的地址,esp加四_f:      pushl   %ebp      movl    %esp, %ebp  //这里压入之前ebp地址    subl    $4, %esp      movl    8(%ebp), %eax  //把8的值移动加入到eax寄存器里面    movl    %eax, (%esp)  //把eax的值传给exp所指的空间    call    _g      leave  //运行f函数的leave指令,有两个过程先movl %ebp,%esp,然后popl %ebp    ret  _main:      pushl   %ebp  //堆顶压入了ebp的值    movl    %esp, %ebp  //改变ebp的值使得其指向esp    andl    $-16, %esp   //与 0xfffffff0 与运算,使得它对齐寻址空间,加快cpu处理速度    subl    $16, %esp  //esp向下移动4位    call    ___main      movl    $8, (%esp)      call    _f  //调用_f 函数,由于eip不可以直接修改,只能调用 call    addl    $1, %eax  //    leave      ret //把esp上指的内容给会eip,函数返回

通过实验理解了冯诺依曼结构的存储程序计算机的工作方式,cpu从代码段取指令,然后执行。了解了堆栈的工作方式。

0 0