2017-2018-1 20179209《Linux内核原理与分析》第二周作业

  • 本周课业主要通过分析汇编代码执行情况掌握栈的变化。本人本科时期学过intel 80X86汇编语言,所以有一定基础;在Linux中32位AT&T风格的汇编稍微熟悉就可以明白。所以我学习的重点放在了栈变化上。
    首先是编写简单的C源程序:
    1249712-20171008193525668-797634444.png

       反汇编之后得到汇编代码:

    1249712-20171008193637231-917239801.png

1249712-20171008193644246-1037648035.png

    接着实验的重点来了,我每执行两个指令都会解释当前运行情况以及栈的变化:
     pushl    %ebp
     movl     %esp, %ebp

1249712-20171008194213293-718962478.png
把ebp当前的指向的地址压栈;把esp的地址给了ebp。

     subl     $4,%esp
     movl    $88,(%esp)

1249712-20171008194548184-1345307039.png
把esp向下移动一格,并把88压栈;
我在思考是否这两条指令可以用pushl $88代替?
call f
1249712-20171008195055090-834823776.png
call命令可以分成两个命令来执行分别是保存当前eip地址以及跳转,这里不再赘述。

     pushl    %ebp
     movl    %esp,%ebp

1249712-20171008195327059-467133548.png
这一步骤类似main函数 第一二个指令。

     subl    $4,%esp
     movl    8(%ebp),%eax

1249712-20171008195627293-45283391.png
这两条命令的关键是把88这个值加到eax寄存器中。所以执行完后eax的值变成了88.

    movl    %eax,(%esp)
    call    g

1249712-20171008200523574-980908154.png
这里把eax中的值也存到了栈中,然后调用g函数。

    pushl    %ebp
    movl    %esp,%ebp

1249712-20171008200817153-1956509905.png

    movl    8(%ebp),%eax
    addl    $33,%eax

1249712-20171008200941637-195054539.png

    popl    %ebp
    ret

1249712-20171008201033793-1018006501.png
这里调用第一个ret函数,这个过程类似中断,这一步骤相当于恢复上一个现场。

    leave

1249712-20171008201203106-597154946.png
leave 函数相当于movl %esp,%ebp和popl %ebp

    ret

1249712-20171008201546809-349622783.png

    addl    $11,%eax

1249712-20171008201706731-545744430.png
运行结束后:
1249712-20171008201725465-1701320789.png
通过整个过程的追踪遍历,我更加清晰地明白了栈的工作过程。这个过程自己看再加上自己写出来,我一共推导了3遍。我觉得这对我以后学习系统调用和中断也有很大的帮助。至于上面思考的问题,能不能用一个命令代替两个命令,我觉得可以,因为intel 80X86中的push可以直接对立即数进行压栈。

转载于:https://www.cnblogs.com/genius-sen/p/7638399.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值