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

反汇编一个简单C程序

(一)反汇编执行过程及分析

1.使用命令:gcc –S –o main.s main.c -m32,对以下程序进行反汇编。

// main.c
int g(int x)
{
    return x + 3;
}
    
int f(int x)
{
    return g(x);
}
    
int main(void)
{
    return f(8) + 1;
}

命令执行过程如下:
在这里插入图片描述生成的main.s程序如下:
在这里插入图片描述     我们在分析汇编代码时,可以把main.s简化一下,所有以".“打头的字符串(都是编译器在链接阶段所需辅助信息)不会实际执行,可以都删掉。
     在VIM中通过"g/.s*/d"命令即可删除所有以”."打头的字符串,这样代码就会更加精简:
在这里插入图片描述

(二)问题总结

     在打开反汇编出的main.s程序时,会发现这个文件是main.c生成的,但main.s汇编文件还有一些".cfi_"打头的字符以及其他以 “.” 打头的字符串,其实这些都是编译器在链接阶段所需的辅助信息。
     EIP寄存器是指向代码段中的一条条指令,即main.s中的汇编指令,从"main:"开始,它会自动加一,调用call指令它会修改EIP寄存器。EBP寄存器和ESP寄存器也特别重要,两个寄存器总是指向一个堆栈,EBP指向栈底,而ESP指向栈顶。
     以下是堆栈空间示意图,右侧数字表示内存地址,EBP和ESP寄存器都指向栈底,即指向一个4字节存储单元的下边缘2000的位置,指2000-2003这4个字节,也就是标号为0的存储单元,依此类推,标号1的存储单元为 1996-1999这4个字节。在代码执行过程中,堆栈空间和相应的EBP/ESP寄存器会不断变化。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值