刚刚注册了这个博客园,尽量保持每日一更(*/ω\*)

今天看了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内的所有硬件各司其职,缺一不可,寄存器这方面比较难,但是对于一个合格的软件工程师来说则是必不可少的基础知识

本文章由小神龙编写,转载请注明出处

小白的CTF学习之路1——程序与CPU的更多相关文章

  1. 小白的CTF学习之路2——二进制数据基础与运算(上)

    今天的第二更,被我拖到了傍晚,嘿嘿,二进制这方面让本就数学不好的我很头疼,所以研究了一段时间 在学习之前我们先了解几个问题: 32位是几个字节? 01011100对于十进制是多少? 00001111向 ...

  2. 小白的CTF学习之路8——节约内存的编程方式

    今天第二更,废话不说上干货 上一章我们学习了内存和cpu间的互动方式,了解到内存的空间非常有限,所以这样就需要我们在编程的时候尽可能的节省内存空间,用最少的空间发挥最大的效果,以下是几种节约内存的方法 ...

  3. 小白的CTF学习之路7——内存与硬盘

    前天去网吧跟朋友包宿,导致昨天一整天都报废,今天早上研究了一下nethunter导致手机成功变砖,感冒不停地咳嗽,这些理由应该足够我前两天拖更了吧,下面开始正题 磁盘学习路线 虚拟缓存 虚拟内存 节约 ...

  4. 小白的CTF学习之路5——内存的逻辑结构

    很衰的一天,各种意料之外的问题,但都挡不住我每日一更的步伐 内存的逻辑结构大致分为以下几种: 数组 栈与队列 链表 二叉树 以上,数组,栈,链表是我这章要说明的 在学习前需要了解的两个问题: 1.内存 ...

  5. 小白的CTF学习之路6——阶段测评

    刚才考了自己一次,下面我把题和答案放到下面 CPU中不含有以下选项中的  C A:     运算器 B:      寄存器 C:     内存 D:     时钟 这是一道送分题,CPU包含以下几种原 ...

  6. 小白的CTF学习之路4——内存

    明天要进行二模考试了,沉住气,加油,能过 内存是学C路上必不可少的一环,一定要非常认真的去学 内存的物理结构: ROM:只读内存——早期的手机 RAM:读写(数据断点既消) DRAM:经常更新 SRA ...

  7. 小白的CTF学习之路3——二进制数据基础与运算(下)

    处理了二进制的整数运算,下面我们来进行令人绝望的浮点数运算 我们先来看一下float事列程序: #include<"stdio.sh"> int main() { fl ...

  8. 新手小白的Linux学习之路

    大家好,我是一个零基础的新手小白,在此和大家分享一下新手小白的学习之路.欢迎各位大神指教!谢谢 Linux简介: Linux操作系统诞生于1991年10月,由芬兰赫尔辛基大学的在校生Linus Tor ...

  9. 小白的mapbox学习之路-显示地图

    刚接触mapbox,只是简单记下自己的学习之路,如有错误,欢迎大神指正 1-头部引入链接 2-body中定义一个div块,用来显示地图 3-在script中创建一个map对象,并设置相关参数 mapb ...

随机推荐

  1. Angular2中使用ngx-translate进行国际化

    转自 https://blog.csdn.net/u014291497/article/details/61233033 相较于angularjs中的ng-translate, angular2也有适 ...

  2. 阿里Java开发手册

    1.1 命名风格 (1)常量命名全部大写,单词间用下划线隔开. (2)抽象类命名以Abstract或Base开头:异常类命名以Exception结尾:测试类命名以它要测试的类名开始,以Test结尾. ...

  3. 总结:Java 集合进阶精讲1

    知识点:Java 集合框架图 总结:Java 集合进阶精讲1 总结:Java 集合进阶精讲2-ArrayList 集合进阶1---为集合指定初始容量 集合在Java编程中使用非常广泛,当容器的量变得非 ...

  4. Lepus监控之Oracle配置

    1.安装cx_Oracle a.官网下载客户端组件包 oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpmoracle-instantclien ...

  5. ef join查询

    temp = temp.OrderByDescending(s => s.CreateTime).Skip((param.PageIndex - ) * param.PageSize).Take ...

  6. Bootstrap关闭当前页

       function doBack() {        var index = parent.layer.getFrameIndex(window.name);        parent.lay ...

  7. IntelliJ IDEA 调试技巧

    程序员的工作内容,有不少的时间是用在调试代码上.可以说不是在调试代码,就是即将调试代码. 掌握调试代码的一些技巧,在使用IDE提供的debugger时会快速定位问题的方式. 1.多线程调试 在多线程应 ...

  8. json字符串装List<Object>

    List<SearchParam> ts = (List<SearchParam>) JSONArray.parseArray(jsonStr, SearchParam.cla ...

  9. git保存用户名和密码

    git保存用户名和密码 简介:tortoiseGit(乌龟git)图形化了git,我们用起来很方便,但是我们拉取私有项目的时候,每次都要输入用户名和密码很麻烦,这里向大家介绍怎么避免多少输入 试验环境 ...

  10. HttpWebResponse远程服务器返回错误: (500) 内部服务器错误 的解决办法

    在工作中用C#开发了一个小程序,不断访问去请求一个网站的页面,在循环过程中有时会报“远程服务器返回错误: (500) 内部服务器错误”,有时不会,出现的时机也不太一样.开始以为是网站的问题,后来网站是 ...