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

实验一:反汇编一个简单的C程序

1.创建一个main.c文件

 2. 将c语言程序写入,并进行参数的修改

 3.运行gcc main.c会生成一个目标文件a.out。他是可以执行的,但是执行效果没有任何输出信息。

 4.输入echo ¥?查看一下程序的的返回值。

 

5.可以使用以下命令:gcc –S –o main.s main.c -m32 把main.c编译成一个汇编代码文件main.s。

6. 以下是完整的main.s汇编代码文件:

 

 

 

 

 


 7.简单分析汇编程序

该程序分为三部分,f函数,g函数,main主函数。简要分析一下这段汇编程序。对于汇编程序我们可以借助原C语言程序进行分析,首先执行的是main函数,pushl %ebp movl %esp, %ebp 两句的意思是保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针,subl $4,%esp movl $9, (%esp)     这两条指令的意思是栈顶指针下以4个单位,分配了一个单元,第二条指令将数值9存储到刚刚分配的个单元中。所以这两条指令的作用是将数值9压入堆栈。接下来是call f 即调用f函数,这时我们来看f函数。  前三句和main函数的前三句相同,第四句movl    8(%ebp), %eax   它的含义是将栈基指针的内容加上8对应的存储单元的内容传送给累加寄存器EAX。下一条指令再把EAX内容拷贝给栈顶指针所指的位置。call g调用g函数。pl  %ebp    这条指令相当于:movl (%esp),%ebp   add $4,%esp。实现将之前压入栈的栈基指针EBP的内容出栈到EBP中。leave是撤销函数堆栈,ret相当于c语言中的return返回程序运行值。

通过查看汇编指令我们可以知道linux是如何进行取指运行程序的。

 

 2.总结

 此实验主要是通过汇编一个简单的C语言程序并分析其汇编指令执行过程来理解“计算机究竟是如何工作的”,在指令执行过程中,很重要的一个寄存器就是EIP指令指针寄存器,它会自动地指向下一条要执行的指令地址。堆栈操作过程中非常重要的两个寄存器就是EBP基址指针寄存器和ESP栈顶指针寄存器,所有出栈入栈的操作都要靠它们来完成。汇编语言是和机器语言类似的语言,能充分体现出计算机执行指令的逻辑。计算机先将程序编译成计算机能读懂的语言,再一条条取指令来执行,直至指令执行完毕。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值