第一节 计算机是如何工作的——20135203齐岳

第一节 计算机是如何工作的

By 20135203齐岳

存储程序计算机工作模型

存储程序计算机——冯诺依曼体系结构

744942-20160225220955615-845833894.jpg

  • IP:寄存器,总是指向内存的代码段。IP(16位) 32位(EIP) 64位(RIP)。

  • 内存:保存数据和指令。

  • CPU:CPU从IP指向的内存地址取指令执行,执行之后IP自加一,然后继续执行

      for(;;){
          next instruction
      }
  • API:应用程序编程接口。程序员与计算机的接口界面。
  • ABI:程序与CPU接口界面(二进制编码)。

X86汇编基础

X86寄存器

通用寄存器

744942-20160225221012146-2033236680.jpg

段寄存器
  • CS:代码段寄存器,存储指令。CPU取指令时根据CS+eip来确定指令的地址。
  • DS:数据段寄存器,存储数据段的段值。
  • SS:堆栈段寄存器,存储堆栈段的段值。
  • FS、GS、ES:附加段寄存器,存储附加数据段的内容。

常用汇编指令

  • movl

  • pushl %eax:将eax寄存器放进堆栈的栈底。

      subl $4,%esp
      movl %eax,(%esp)
  • popl %eax:将栈顶的数值放入eax里面。

      movl (%esp),%eax
      addl $4,%esp
  • call 0x12345:函数调用,调用0x12345这个地址。

      pushl %eip(*)
      movl $0x12345,%eip(*)
  • ret:将函数调用时候保存的eip出栈,执行函数调用之后的下一条指令。

      popl %eip(*)
  • enter:将栈置为空

      pushl %ebp
      movl %esp,%ebp
  • leave:撤销函数堆栈,释放内存空间

      movl %ebp,%esp
      popl %ebp

注意:( * )表示伪指令,实际上程序员不能直接修改eip,会有安全隐患

常用寻址方式

  • 寄存器寻址:%+寄存器名称,与内存无关。

      movl %eax,%edx      edx=eax;
  • 立即寻址:$+16进制的数字,将数值直接放进寄存器当中,与内存无关。

      movl $0X123,%edx    edx=123;
  • 直接寻址:一个16进制数字表示一个地址。

      movl 0x123,%edx     edx=*(int32_t*)0x123;
  • 间接寻址:寄存器的值表示一个内存地址,将这个内存地址中的值放进寄存器中。

      movl (%ebx),%edx    edx=*(int32_t*)ebx;
  • 变址寻址:括号外面的数字表示寄存器地址加一个立即数。

      movl 4(%ebx),%edx   edx=*(int32_t*)(ebx+4);

注意:AT&T汇编格式与Intel汇编格式略有不同,linux内核使用的是AT&T汇编格式。

汇编一个简单的C程序分析其汇编指令执行过程

由于理论知识在上学期的博客中详细写过,所以这里直接用课后作业来说明

C语言代码

744942-20160225221028911-814217087.jpg

汇编代码

744942-20160225221039302-1153750434.jpg

堆栈变化过程

744942-20160225221057958-2025389939.jpg

744942-20160225221109786-2108543430.jpg

744942-20160225221120974-918528430.jpg

744942-20160225221130911-745599887.jpg

执行leave语句时将esp指向ebp的位置,然后将ebp出栈从而释放函数所使用的堆栈。

执行将函数调用时候保存的eip出栈,执行函数调用之后的下一条指令。

函数返回值保存在eax当中,随着函数调用的结束它的值依次被修改。

注意:

1.函数调用堆栈是由逻辑上多个堆栈叠加起来的

2.函数的默认返回值通过eax寄存器存储返回给上一级函数

参考资料

【原创作品转载请注明出处】 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

转载于:https://www.cnblogs.com/July0207/p/5218597.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值