《Linux内核分析》-X86汇编基础及实验总结

本文通过具体的C程序及其对应的汇编代码,详细解析了Linux环境下函数调用过程中的栈变化,包括函数入口与出口时寄存器的保存与恢复等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:王鹤楼
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

几个宏汇编对应的汇编指令
pushl %eax
    subl $4, %esp
    movl %eax, (%esp)
popl %eax
    movl (%esp), %eax
    addl $4, %esp
call 0x12345
    pushl %eip
    movl 0x12345, %eip
ret
    popl %eip
enter
    pushl %ebp
    movl %esp,%ebp
leave
    movl %ebp,%esp
    popl %ebp

左边main.c的C程序源代码,右边main.s是汇编main.c之后的代码

C程序与对应的反汇编程序

下面分析汇编代码main.s

17~25行是main函数
18: pushl %ebp 保存程序进入main函数之前的基地址指针寄存器内容到栈中
19: 把当前的栈指针赋值给基地址指针寄存器,即设置main函数的栈底
20: 栈指针向下移动一个位置
21: 把立即数29存到栈顶
22:调用f函数,并且把eip的下一条指令(addl $3, %eax)的地址压入栈中

8~16是f函数==>
9:保存调用此函数的基地址批针寄存器内容到栈中
10:把当前栈指针赋给栈的基地址指针寄存器,也就是设置当前函数栈的基地址
11:栈指针向下移动一个位置
12:把相对于ebp向上移偏2个地址的内容赋给eax,也就是把立即数29赋值给eax
13:把eax也就是立即数29压入栈中
14:调用f函数,同时把eip的下一条指令(leave)压入栈中

1~7是g函数
2:保存调用此函数的基地址批针寄存器内容到栈中
3:把当前栈指针赋给栈的基地址寄存器,也就是设置当前函数栈的基地址
4:把相对于ebp向上移偏2个地址的内容赋给eax,也就是立即数29
5:把1和eax寄存器的内容(29)相加赋给eax
6: 把栈顶的内容弹出来赋给寄存器ebp,然后esp减去4
7:返回语句,相当于popl %eip,程序执行中转到第15行

15:把函数f的栈的基地址赋给栈指针,然后把栈顶的内容弹出来也就是main函数的栈的基地址赋给ebp
16: 返回语句,相当于popl %eip,程序执行中转到第23句
23:调用函数f的返回结果存在eax中,把立即数3与 eax相加再存回eax
24:离开main函数

下面这张图片展示了栈的变化:
汇编程序对应的栈描述

进入每个函数开头都指有两句指令:

pushl   %ebp
movl    %esp, %ebp

作用就是保存调用函数栈的基地址,然后设置本函数栈底

退出一个函数时一般都会是如下两句

leave
ret
这两句语句对应的代码为:
movl %ebp,%esp
popl %ebp
popl %eip

以前内容就是学习《Linux内核分析》第一堂课的总结。

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值