“Linux内核分析”实验报告(一)分析汇编代码理解计算机是如何工作的

计算机的工作原理

计算机在运行时,CPU根据IP存放的指令地址先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去,这个过程中IP自动指向下一条指令。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。 程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作原理。这一原理最初是由美籍匈牙利数学家冯.诺依曼于1945年提出来的,故称为冯.诺依曼原理。

汇编代码

C程序代码命名为main.c,然后执行一条命令生成对应的汇编代码:

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

其中-S选项表示在生成汇编代码,-o选项表示输出编译结果,即输出汇编代码至main.s文件中,-m32则表示生成32位的汇编代码

说明汇编语言的执行过程

先从main 函数开始解释

1:

pushl %ebp

压栈操作,把ebp的值入栈,此时esp减4;

2:

movl %esp, %ebp

寄存器操作,表示把esp中的值赋给ebp;

3:

subl $4, %esp

表示把esp中的值减4;

4:

movl $22, (%esp)

表示把22存入esp指向的内存块中;

5:

call f

call f 可分为两步;

(1)pushl %eip
(2)movl $0x....,%eip

其中第一小步是把eip中的地址入栈,此时esp减4,第二小步是把地址 $0x...(f函数的栈基地址) 赋给eip,下一次执行的指令就开始从f函数开始;

6:

pushl %ebp
movl %esp, %ebp

这两句的意思是 保存上一个函数的栈顶指针,把ebp指向当前esp指向的地址作为新函数的栈顶指针;

7:

subl $4, %esp
movl 8(%ebp), %eax

这两句的意思是栈底指针esp减4,然后把(%ebp+8)地址中的内容赋予eax中;

8:

movl %eax, (%esp)

将eax中的值存储到esp指向的位置,即把22保存到esp指向的地址中;

9:

call g

10:

pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax

第三句的意思就是把22 放到eax中;

11:

addl $10, %eax

用10加上eax的内容再赋给eax;

12:

popl %ebp

出栈操作,把出栈的数据赋给ebp;

13:

ret

ret的意思是``` popl %eip

14:

leave ret

leave可以分为两行汇编代码

movl %ebp,%esp popl %ebp

把当前函数的栈顶地址赋给栈底指针esp,取回上一层函数的栈顶地址;
ret实现返回main函数的功能;

15:

addl $1,%eax

给eax中的值加1

16:

leave ret ``` 总结

通过分析C程序编译后的汇编代码,学习了汇编代码,熟悉和认识了计算机的工作流程,并认识到在函数调用中,栈起了很重要的作用。

转载于:https://my.oschina.net/doumenghan/blog/644008

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值