• 2020-2021-1 20209320 《Linux内核原理与分析》第二周作业


    1.学习到的新命令

    • dd: 删除光标所在行
    • i: 进入编辑模式
    • esc:进入命令模式
    • wq:写入文件并退出

    2.esp和ebp

    esp永远指向栈顶元素。不是指向没有数据的空地址。

    push时,先减四后赋值

    ebp永远指向栈底元素。他一般存储了上一个函数的ebp。

    进入函数中,先push ebp

    再mov ebp,esp 这时俩寄存器都指向保存的上个函数的ebp的值。

    离开函数时执行leave时,他的作用与上面的相反,相当于

    mov esp,ebp  让esp指向当前的栈底

    pop ebp 将栈顶(esp指向的内存)的值给ebp这样,就恢复了上个函数调用此函数至少得值,esp因为弹栈而加四,然后指向的是返回地址。

    随后执行ret,ret指令相当于

    pop eip 即将栈顶的值(esp指向的内容)复制给eip指令寄存器。esp+4。

    3.实验过程分析

    C程序

    int g(int x)
    {
    return x + 3;
    }
    
    int f(int x)
    {
        return g(x);
    }
    
    int main(void)
    {
        return f(8) + 1;
    }
    

    汇编代码

    汇编过程分析

    汇编程序也是从main开始执行,
    18 pushl %ebp
    19 movl %esp, %ebp
    将ebp内容压入栈,然后将esp内容赋值给ebp

    20 subl $4, %esp
    21 movl $13, (%esp)
    esp向下移动四个字节,,将13放在esp指定位置里,esp向下移动一个单位

    22 call f
    相当于
    pushl %eip(*)
    movl f %eip(*)
    将eip寄存器值即23行指令地址放入esp指向位置,esp减4,进入f函数,此时eip存放行号9指令地址

    9 pushl %ebp
    将ebp内容压入栈,此时ebp指向96

    10 movl %esp, %ebp
    将esp值赋值给ebp

    11 subl $4, %esp
    esp向下移动一个单位

    12 movl 8(%ebp), %eax
    将ebp内容加8放入eax寄存器中

    13 movl %eax, (%esp)
    将eax内容放入esp指向的地址中

    14 call g
    相当于
    pushl %eip(*)
    movl g %eip(*)
    将eip寄存器值即15行指令地址放入esp指向位置,esp减4,进入g函数,此时eip存放行号2指令地址

    2 pushl %ebp
    3 movl %esp, %ebp

    4 movl 8(%ebp), %eax
    5 addl $3, %eax
    6 popl %ebp
    ebp寄存器值加8即向上移两个单位,将13放入eax寄存器中,eax值再加3,栈顶的值放入ebp,而被迫值为84

    7 ret
    相当于
    popl %eip(*)
    栈顶值给eip并弹出

    15 leave
    相当于
    movl %ebp, %esp
    popl %ebp

    16 ret

    23 addl $1, %eax
    24 leave
    eax寄存器值加1

  • 相关阅读:
    [译]javascript中的条件语句
    [译]Javascript substring实例
    [译]Javasctipt中的substring
    [译]在Javascript中将string转化成numbers
    [译]Javascript基础
    [译]我们应该在HTML文档中何处放script标签
    [译]内联Javascript vs 外置Javascript
    [译]学习Javascript的工具
    MYSQL 重新设置自增值
    LINUX下的ssh登录之后的文件远程copy:scp命令(接前文ssh登录)
  • 原文地址:https://www.cnblogs.com/dyyblog/p/13812922.html
Copyright © 2020-2023  润新知