刚刚注册了这个博客园,尽量保持每日一更(*/ω\*)
今天看了po学院的教学视频,了解了程序是什么,如何在CPU当中工作的等各种之前未曾想过的问题,特此记录,以防忘记
首先我们学习程序与CPU之前需要了解这么几个问题:
1.什么是程序?
2.程序是由什么组成?
3.什么是机器语言?
3.运行中的程序存储在什么位置?
4.什么是内存地址?
5.程序的解释和运行的计算机部件叫什么?
我们带着问题来学习,将会有很大的效果
首先我们需要了解CPU是什么?
CPU(Central Processing Unit)是*处理器的缩写,听名字很牛X,实际上它还真的很牛X,CPU是电脑中重要组件之一,电脑中可以没有显卡,可以没有风扇,可以没有网线,但没有CPU,整个计算机将无法运行,CPU可以简单理解为是用来控制计算机运行的工具
当然,我们既然是要成为CTF竞赛王者的男人,光知道这些宽泛的东西还是远远不够的,我们还需要了解CPU其内部还有哪些东西
CPU里面包含:1.寄存器
2.控制器
3.运算器
4.时钟
寄存器:是短暂存储一些值的地方,可以理解为它是用来存储电脑中数据的地方
这里我们需要额外了解一下,我们的程序是分为两个部分的,一个是指令(算法),一个是数据,数据则是我们寄存器需要存储的东西
可以简单理解为寄存器就是我们电脑当中的内存,当然这是绝对错误的
控制器:是用来控制寄存器读取,写出,更换等操作的硬件,
运算器:顾名思义,运算器是我们的逻辑运算单元,辅助单元,协助寄存器和控制器来达到运算的效果
时钟:它是推动我们CPU其他三个硬件的硬件,可以理解为它是我们CPU当中的发动机,时钟是通过频率来计算(GHz),1GHz=10亿次每秒,也就是说我们可以每秒计算10亿次
作为日后需要编写程序的程序员,寄存器是我们需要重点了解的,也是我们软件工程师唯一能够接触到的,CPU可以理解为是寄存器的集合
说了这么多,那么程序员编写出的程序是如何一步一步的放到CPU当中实现运行的呢?
上面讲过,程序是由数据和指令构成的,也就是说,程序在写完之后,他仅仅是代码,代码对于计算机来说毫无意义,因为机器根本读不明白你的代码,这样,我们就需要一个叫做编译器的东西,他充当了你和机器之间的翻译功能,例如,C语言写Hallo world:printf("hallo world");,这串代码计算机是看不明白的,我们的编译器可以将这串代码翻译成计算机能够读懂的二进制语言(在以后的课程会提到),并将其转换成.exe格式的文件,这样一来,通过windows内所拥有的加载程序,将写出的程序放入到CPU里,就可以达到这么一个运行的操作啦
简单理解就是:代码->exe->加载->CPU
这样一来,我们就涉及到了编程语言的两种类型,一类是高级语言,一类是低级语言,高级语言使我们人类能够看得懂弄的明白的,而低级语言则是机器能够读懂并运行的
高级语言有着两种发展方向,一个是更好记忆,一个是指令更少
高级语言需要通过编译器转化才能够被机器运行
编译后生成可执行文件(如EXE)
执行EXE文件后WINDOWS会将数据加载到内存上
CPU通过寄存器,运算器,控制器,时钟来与内存进行交互
到这里,我们对于CPU的了解已经超越了75%的小白了,但可不要沾沾自喜,距离我们的目标CTF大神可仅仅完成了百分之1不到,之前说了,作为程序员最需要了解的便是寄存器了,下面我们来重点介绍下CPU当中的寄存器是如何工作的
CPU当中的寄存器包含以下种类:
累加寄存器:记录计算之后的数据,用于运算,算数
标志寄存器:记录计算之后的数据是否溢出,帮助CPU进行逻辑判断
程序计数器:存储下一条指令在内存当中的地址,记录下一条指令的值
基址寄存器:存储当前数据内存开始的位置
变址寄存器:存储基址寄存器的相对位置
通用寄存器:顾名思义,什么都可以用
指令寄存器:CPU内部使用,存储当前指令
栈(zhan)寄存器:记录我的起始位置
以上,便是我对CPU的所有理解,CPU内的所有硬件各司其职,缺一不可,寄存器这方面比较难,但是对于一个合格的软件工程师来说则是必不可少的基础知识
本文章由小神龙编写,转载请注明出处