2022-2023-1 20222808《Linux内核原理与分析》第二周作业

实验一 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

使用touch命令创建main.c,并使用vim编辑
在这里插入图片描述

输入示例代码并做小幅修改,并输入:wq保存并退出
在这里插入图片描述

使用$ gcc –S –o main.s main.c -m32将代码编译成汇编代码并写入main.s
在这里插入图片描述
查看main.s
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用g/.s*/d命令获得更纯净的汇编代码
在这里插入图片描述

分析汇编代码执行过程

main函数

指令作用
pushl %ebpEBP寄存器的值压栈
movl %esp,%ebpEBP寄存器指向标号1的位置
subl $4,%espESP寄存器向下移动一个标号
movl $6, (%esp)把立即数7放入ESP寄存器指向的位置
call fEIP寄存器跳转到f函数的位置
addl $3,%eaxEAX寄存器加立即数3
leave撤销main函数的堆栈
ret函数返回

f函数

指令作用
pushl %ebpEBP寄存器的值压栈
movl %esp, %ebpEBP寄存器指向标号4的位置
subl $4,%espESP寄存器减4,指向标号5的位置
movl 8(%ebp), %eaxEBP寄存器加8
movl %eax,( %esp)将EAX寄存器中存储的立即数8放到ESP寄存器现在所指位置上
call g调用函数g
leave撤销f函数的堆栈
ret函数返回

g函数

指令作用
pushl %ebpEBP寄存器的值压栈
movl %esp, %ebpEBP寄存器指向标号7的位置
movl 8(%ebp), %eaxEBP寄存器加8,指向标号5的位置,将标号5的内容放到EAX寄存器中
addl $17,%eax把立即数17加到EAX寄存器中
pool %ebp把标号7的内容放回到EBP寄存器
ret函数返回

总结

本周的实验一是通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的。
在本实验中我学会了使用gcc -S -o * * -m32命令将一个C程序编译成汇编语言并写入指定文件,并通过分析汇编代码更深刻的理解了代码运行的过程。代码工作过程中会使用到EBP基址指针寄存器和ESP栈顶指针寄存器来进行堆栈操作,所有出栈入栈的操作都要靠这两个寄存器完成。
计算机的工作过程本质上就是执行程序的过程,而程序是由若干条指令组成的,计算机逐条执行程序中的指令,就可完成一个程序的执行,从而完成一项特定的工作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值