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

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

实验过程:

1、编写简单C语言程序

在这里插入图片描述

2、调用命令对C语言程序进行反汇编操作

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

在这里插入图片描述
可以看到反汇编成功,创建了main.s文件

3、使用vim查看反汇编main.s文件

在这里插入图片描述
在这里插入图片描述

4、反汇编文件main.s分析

对应c语言文件中的三个函数:int g()、int f()、int main(),反汇编代码同样也分为g、f和main部分。
在分析前首先对汇编语言部分做个笔记

其中有四个寄存器:

NameValue
ebp堆栈基指针,该指针永远指向系统栈最上面一个栈帧的底部
esp堆栈底指针,该指针永远指向系统栈最上面一个栈帧的栈顶
eip指令指针
eax累加寄存器

以下将从过程来分析,首先是main函数

main
main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$4, %esp
	movl	$5, (%esp)
	call	f
	addl	$2, %eax
	leave
	ret

main函数作为入口函数,所以eip的值为11

	pushl	%ebp

(1)将堆栈基指针压入栈中

	movl	%esp, %ebp

(2)将堆栈底指针赋值给堆栈基指针

	subl	$4, %esp

(3)堆栈顶指针地址减去立即数4,相当于指针向下移动一个单元

	movl	$5, (%esp)

(4)将立即数5放置在堆栈顶指针对应地址的内存上

	call	f

(5)调用f函数,call f整体操作可以分解为,存储当前命令指针位置,并跳跃到f函数所在处

	push eip
	movl f, eip

此时来到了f函数的部分(具体在f函数细讲)
(6)回到main函数部分后,累加寄存器加上立即数2

	addl	$2, %eax

(7)此操作将esp和ebp指针都指向main函数的最初位置

	leave

(8)回到更上一层的堆栈

	ret
f函数
f:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$4, %esp
	movl	8(%ebp), %eax
	movl	%eax, (%esp)
	call	g
	leave
	ret

在main函数调用f函数后
(1)将堆栈基指针压入栈中

	pushl	%ebp

(2)将堆栈顶指针的值赋值给堆栈基指针,使得堆栈基指针指向堆栈顶指针指向的地方

	movl	%esp, %ebp

(3)堆栈顶指针减去立即数4,使得该指针指向下一个存储单元

	subl	$4, %esp

(4)将堆栈底指针所指向的上两个单元(变址寻址)对应的内容存入累加器中

	movl	8(%ebp), %eax

(5)将累加器中的内容赋值给堆栈顶指针对应的内存中

	movl	%eax, (%esp)

(6)和main函数中的call f一样调用g函数,整体也可以分解成push和movl两个步骤

	call	g

(7)此操作将esp和ebp指针都指向f函数的最初位置

	leave

(8)回到更上一层的堆栈

	ret
g函数
g:
	pushl	%ebp
	movl	%esp, %ebp
	movl	8(%ebp), %eax
	addl	$7, %eax
	popl	%ebp
	ret

(1)将堆栈底指针压入堆栈

	pushl	%ebp

(2)将此时的堆栈顶指针赋值给堆栈底指针

	movl	%esp, %ebp

(3)将堆栈底指所对应上两个单元的内容赋值给累加寄存器,此时eax=5

	movl	8(%ebp), %eax

(4)累加寄存器加上立即数7,此时eax=12

	addl	$7, %eax

(5)堆栈底指针出栈,堆栈顶指针指向上个单元内存

	popl	%ebp

(6)回到上一层堆栈

	ret

总结

从这一份简单的C语言程序反汇编所得到的代码中,可以基本看到在汇编语言层面,计算机运作主要围绕esp、ebp、eip和eax几个寄存器展开。例如简单的函数调在汇编层面就需要先压栈存储当前指令位置,赋值指令位置,执行完函数后弹出堆栈,是的指令寄存器的值回到原来的点。再比如,esp和ebp在汇编中运用的更加频繁,这两个指针与当前指令执行时密切相关,由于地址在存储时是递减的,所以能看到很多词esp-4得到下一个单元地址的操作。总的来说汇编有很多理解空间,帮助学习计算机的底层知识。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值