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

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

实验过程

  • 首先创建main.c文件,然后使用vim编辑代码。
    在这里插入图片描述

  • 然后使用如下命令编译成汇编代码文件main.s。

$ gcc –S –o main.s main.c -m32

在这里插入图片描述

  • main.s删除“.”字符开头后的代码
    在这里插入图片描述

分析main.s的汇编代码

g:
	pushl	%ebp//ebp入栈
	movl	%esp, %ebp//ebp=esp,生成新的堆栈空间
	movl	8(%ebp), %eax//将变址寻址ebp+8所指向内存的值存入eax
	addl	$19, %eax//将eax的值加19
	popl	%ebp//ebp出栈,esp减去4,指向上一个位置
	ret//返回,继续执行下一条指令
f:
	pushl	%ebp//ebp压栈,esp指向下一个位置
	movl	%esp, %ebp//将ebp指向esp的位置
	subl	$4, %esp //esp减4,即指向下一个位置
	movl	8(%ebp), %eax//ebp向上移动两位,eax=8
	movl	%eax, (%esp)//eax内容存入esp指向的内存
	call	g//eip入栈,调用g
	leave//包括movl %ebp,%esp和popl %ebp两条指令
	ret//返回,继续执行下一条指令
main:
	pushl	%ebp//ebp压栈
	movl	%esp, %ebp//将ebp指向esp所指向的栈地址。
	subl	$4, %esp//esp指向的位置向下移动一格
	movl	$19, (%esp)//立即数19放到esp所在位置
	call	f//执行pushl eip和movl f eip两个动作,eip压栈,ebp指向下一个位置,eip指向f。
	addl	$1, %eax
	leave//堆栈回到main函数最初的状态
	ret//退出main

总结

通过本次的学习和实验,对于C语言程序在计算机上具体是怎么工作的有了一个比较清晰的认识,了解到寄存器的作用和汇编指令的执行过程,遇到的问题是对于堆栈的理解不强,但通过实验加深了认识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值