——读书笔记与个人梳理

前言:
这本书的主题是以图文的形式解释了“程序”所能够涉及到的硬件(cpu、内存、硬盘、I/O)以及软件(汇编、编译器),详细描述了硬件与软件结合的方式。主要围绕CPU,描述了cpu是如何利用自身的寄存器,寄存器又如何与内存交流的,硬盘上的内容又是怎么样被加载并且运行的;而后描述了操作系统在其中扮演的角色;最后通过汇编,把以上内容都串联起来,让大家看到cpu是怎么样一步一步完成一个程序的。

cpu、内存、硬盘、指令及他们的关系。

cpu:cpu是核心大脑,由它处理几乎所有的计算机指令,它的组成(寄存器、运算器、控制器、时钟),对于程序员来说,它最重要的组成部分是寄存器,我们把cpu看做寄存器的集合体,运算器和控制器是使得寄存器变化的“机械手”,我们只需要知道:控制器是控制寄存器里面的数值的进出的(邮递员),而运算器负责进入寄存器的数值的运算(计算器)。它们很重要,但不是我们关心的。
     寄存器的主要种类:前五个一般是一个,后面有多个(这个说法貌似不是很符合时代)
  • 程序计数器:存储下一条指令的地址,在cpu执行一条指令之后,会自动变化,动态的变化执行了的字节数
  • 标识寄存器:存储运算完的cpu状态,比如cmp eax,10 它比较eax寄存器和10的大小,结果放在标志寄存器里,jl等指令会根据标志寄存器的值继续执行。
  • 累加寄存器:
  • 栈寄存器:esb,栈指针寄存器,esb的值保存的是当前栈顶的地址
  • 指令寄存器(程序员不需要了解)
  • 基址寄存器(和变址一起如同数组一样操作内存)
  • 变址寄存器
  • 通用寄存器
以上内容不一定特别符合时代,但是足够了解一些计算机运行原理。
内存:内存是直接与cpu交流的存储设施,比如ADD eax,[0x1A]这样的汇编指令,是将eax寄存器里面的值与内存地址[0x1A]里面的数值相加,结果放在eax寄存器中。
硬盘:硬盘也是存储设施,但它和内存有着本质区别,从物理上说,内存RAM需要持续供电,只有供电才能存储,硬盘则不需要供电,但是速度比内存慢。从计算机原理上说,内存是与cpu直接交流的存储单元,而硬盘不能(可能某些情况可以,目前还不清楚,但是即使可以应该也与计算无关),硬盘上的数据和指令,必须加载到内存,才能被cpu使用

它们之间的关系:cpu内存以及指令之间的关系我们只从汇编的角度来进行解析,至于cpu自身是怎么运作的我们不予理睬,只要明白cpu是怎么执行机器语言的就可以了。
接下来我对书中提到的汇编代码作一些说明和整理,通过这些来说明cpu内存以及指令之间的关系。



mov eax, dword ptr [ebp-8]   ...把数值从内存复制到eax
add eax, dword ptr [ebp-0Ch] ...eax的数值与内存地址是“ebp-0Ch”上的数值相加,结果放到eax中
mov dword ptr [ebp-4], eax   ...把eax的数值存储到内存地址ebp-4地址上

#dword ptr 是指double word ptr 是两个字长长度的指针

如上代码段所示cpu执行时按照,命令  参数 ...(逗号隔开) 的形式。将内存中的数据由控制器复制寄存器中,然后由运算器负责处理add命令完成运算,最后再由控制器存入内存中。从上面的代码中可以清楚的看到指针的“最终形态”。

总结
cpu、内存、硬盘、指令直接关系总结如下:
1、编译:写入的代码由编译器编译后形成本地代码(native code),可以直接可以被cpu执行。
2、硬盘阶段:编译完成的native code 以文件为单位存入硬盘中,硬盘中的代码等待执行的触发调节。
3、等待执行:我们编写的代码要被调用时(比如双击了某个exe文件),硬盘里的native code被操作系统加载到内存中,至于怎么加载,大概也是cpu执行了操作系统的native code,通过i/o从硬盘写入内存,不同的操作系统实现方式应该是不同的。
4、执行阶段:native code进入内存之后指令寄存器开始工作,cpu开始执行如上面代码块格式的指令们,从而胁从寄存器和内存来把数据转来转去。或者会调用操作系统的native code来使用io等等

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值