Linux内核分析(堆栈)

网易云课堂的第一周笔记
刘森林
原创作品转载请注明出处
《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. 和堆栈操作相关的重要指令
    Linux内核分析(堆栈)_第1张图片
  2. 在云课堂实验楼做反汇编实验

在CODE文件夹中创建main.c的C语言文件
Linux内核分析(堆栈)_第2张图片

将C语言文件转换为汇编语言
gcc –S –o main.s main.c -m32
Linux内核分析(堆栈)_第3张图片
删去链接用的多余的代码,剩下纯汇编代码

_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从代码段取指令,然后执行。了解了堆栈的工作方式。

你可能感兴趣的:(教学,linux,kernel,栈)