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


    本周总结:本周的学习内容主要是庖丁解牛Linux的第一章,然后看完书后,又跟着云班课加深学习了一下第一章的内容。第一章主要讲述了linux里的汇编指令的一些指令,比如movl,pushl,popl等等,这些指令都是围绕数据结构中的栈做文章的。贯穿这一章的是esp、ebp,eip指针寄存器。简单来说,ebp就是指的栈底,esp就是指着栈顶。eip就是正在执行的指令所在的位置,然后不断重复的进行入栈出栈操作。

    C语言程序:

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

    汇编去除无关项后:

    g:
    1	pushl	%ebp
    2	movl	%esp, %ebp
    3	movl	8(%ebp), %eax
    4	addl	$3, %eax
    5	popl	%ebp
    6	ret
    f:
    7	pushl	%ebp
    8	movl	%esp, %ebp
    9	subl	$4, %esp
    10	movl	8(%ebp), %eax
    11	movl	%eax, (%esp)
    12	call	g
    13	leave
    14	ret
    main:
    15	pushl	%ebp
    16	movl	%esp, %ebp
    17	subl	$4, %esp
    18	movl	$8, (%esp)
    19	call	f
    20	addl	$1, %eax
    21	leave
    22	ret
    

    ret指令等价于

    popl %eip
    

    call指令等价于

    pushl %eip
    movl f %eip
    

    leave指令等价于

    movl %ebp,%esp
    popl %ebp
    

    解析:

    程序从15那里开始执行,此时,ebp和esp均指向栈底,标号为0,第15行,ebp 0进栈,esp-4,第16行,ebp-4,此时ebp与esp指向同一处,17行,esp再减4,18行,将立即数8存到栈里,即esp所指的位置,19行,执行call命令,将eip 20存入栈里,此时esp指向栈顶,进入f函数,7,8行过后,ebp和esp均指向栈顶,9行,esp-4,第10行,将ebp+8所在位置的立即数8存到eax里,第11行,将eax里的值8放到esp所指的位置,第12行,将eip 13存入栈里,执行g函数,经过前两步,esp,ebp均指向栈顶,第3行,将ebp+8所指未知的数8存入eax里,然后eax+3=11,第5行,ebp出栈,esp-4,ebp指针回退到上次ebp指针所指位置,然后ret,eip 13出栈,esp-4,继续执行第13行命令,然后ebp再出栈,ebp指针回退到上次ebp指针所指位置,然后第14行ret,eip 20出栈,esp-4,执行第20行命令,ebp再出栈,eax+1=12,然后leave,ret后返回值12

  • 相关阅读:
    2.vue插件总结——总有你能用上的插件
    1.前端数据可视化插件:Highcharts、Echarts和D3(区别)
    git学习地址
    node vue 微信公众号(四)配置环境 本地测试
    解决element 分页组件,搜索过后current-page 绑定的数据变了,但是页面当前页码并没有变的问题
    导入excel并进行数据提取
    后端返回字符串中带换行符,前端需转换
    正则表达式tab表示
    FormData
    interval
  • 原文地址:https://www.cnblogs.com/funmary/p/11562525.html
Copyright © 2020-2023  润新知