第一章:对程序员来说CPU是什么
单元前问题:
- 程序是什么:
指示计算机每一步动作的一组指令 - 程序是由什么组成的:
指令和数据
(例如在C语言中:printf(“hello world”); 中,printf是指令,hello world 是数据) - 什么是机器语言:
CPU可以直接识别并直接使用的语言 - 正在运行的程序存储在什么位置:
内存
(硬盘和磁盘等媒介上保存的程序被复制到内存后才能执行) - 什么是内存地址:
内存中,用来表示命令和数据存储位置的数值
(内存中保存命令和数据的场所,通过地址来标记和指定。地址由整数值表示) - 计算机的构成元件中,负责程序的解释和运行的是哪个:
CPU
1.1CPU的内部结构解析
-
CPU所负责的就是解释和运行最终转化成机器语言的程序内容
-
CPU和内存是由许多晶体管组成的电子部件。通常成为IC(集成电路)
-
CPU包括:
- 寄存器:用来暂存指令,数据等处理对象。可当作内存的一种。
一个CPU有20-100个寄存器。 - 控制器:
把内存上的指令,数据读入寄存器。
并根据指令结构控制整个计算机。 - 运算器:
运算从内存读入寄存器的数据。 - 时钟:
发出CPU开始计时的时钟信号。
有的计算机的时钟位于CPU的外部。
它们四者之间通过电信号相互连通。
- 程序运行时会在内存中生成EXE文件的副本。
- 其实所谓的控制就是指数据运算以外的处理(主要是数据输入输出的时机控制机制)。比如内存和磁盘等媒介的输入输出、键盘和鼠标的输入,显示器和打印机的输出等,这些都是控制的内容。
1.2CPU是寄存器的集合
- CPU四个组成中,最核心的就是寄存器。因为程序是把寄存器当作对象来描述的。
- 汇编语言用助记符来编写程序。每一个原本是电器信号的机器语言指令会有一个与其对应的助记符,助记符通常为指令功能的英语单词的简写。
(mov : 数据存储, add : 相加) - 汇编语言基本上和机器语言是一一对应的。
- 汇编:讲汇编语言编写的程序转化为机器语言的过程
- 反汇编:把机器语言转化为汇编语言程序的过程。
- 有时候汇编语言也称汇编。
上述代码中eax , ebp都是变是的寄存器。
(eax:累加寄存器, ebp:基址寄存器) - 汇编语言是80836以上的CPU所使用的语言。eax, ebp都是CPU内部的寄存器的名称。内存的存储场所通过地址编号来区分,而寄存器的种类则通过名字来区分。
- 编译:讲使用的高级编程语言编写成的程序转化为机器语言的过程,其中用于转化的程序被称为编译器。
- 根据功能:可以将寄存器大致划分为8类。
寄存器中既可以是指令,也可以是数据。其中数据分为:用于运算的数值,表示内存地址的数值。
- 一般程序计数器,累加寄存器,标值寄存器,指令寄存器和栈寄存器都只有一个
其他寄存器一般都多个。
1.3决定程序流程的程序计数器
- 实际上,一个命令和数据通常被存储在多个地址上。
- 流程:
程序把程序从硬盘复制到内存 ——》 将程序计数器设置为0100 ——》开始运行 ——》 CPU每执行一条指令,程序计数器的值就增加1
(当执行的指令占据多个内存地址时,增加与指令长度相应的数值,)
1.4条件分支和循环结构
- 顺序执行:按照地址内容的顺序执行指令
- 条件分支:根据条件执行任意地址的指令
- 循环:只重复执行同一地址的指令
(若程序中存在条件分支和循环,机器语言指令就可以将程序计数器的值设置为任意地址。不是+1)。
该图显示的是把内存中存储的数值(实例中为123)的绝对值输出到显示器的程序的内存状态。
“跳转到0104地址”这个指令间接的执行了“将程序计数器设定为0104地址”
条件分支和循环中使用的跳转指令,会参照当前执行的运算结果来判断是否跳转。
无论当前累加寄存器的运算结果是负数,零还是正数,标值寄存器都会将其保存(也负责存放溢出和奇偶校验的结构)
溢出:运算的结果超出了寄存器的长度范围
奇偶校验:检验运算的结果的值是偶数还是奇数。
CPU运算时,标志寄存器的数值会根据运算结果自动设定。
条件分支在跳转指令前会进行比较运算。
上图是三十二位CPU的标志寄存器的示例。
标志寄存器的第一个字节、第二个字节、第三个自己的数值为1时,表示运算的结果分别为正数,零,负数。
CPU的比较机制:例如比较A、B。在内部做减法运算A-B。结果为正数表示A比B大,结果为0表示A与B相等。结果为负数表示A比B小。
1.5函数的调用机制
- 即使是高级语言编写的程序,函数调用处理也是通过把程序计数器的值设定成函数的存储地址来实现的。
- 函数调用与循环和分支不同的地方是:单纯的跳转指令无法实现函数的调用。函数的调用需要完成函数内部的处理后,处理流程返回到函数调用点。
- 函数的调用原点和被调用函数之间的数据传递,可以通过内存或寄存器来实现。
- 函数调用使用的是call指令,而不是跳转指令。
(在将函数的入口地址设定到程序计数器之前,call指令会把调用函数后要执行的指令地址存储在名为栈的主存内)。 - 函数处理完毕后,再通过函数的出口来执行return命令。Return命令的功能是把保存在栈中的地址设定到程序计数器中。
1.6通过地址和索引实现数组
例如查看10000000地址 ~ 1000FFFF地址时,可以将10000000存入基址寻址器,并使变址寄存器的值在00000000 ~ 0000FFFF变化。
CPU会把基址寄存器+变址寄存器的值解释为实际查看的内存地址。
变址寄存器的值就相当于高级编程语言程序中数组的索引功能。
扫描二维码关注公众号,回复:
10210185 查看本文章
![](/qrcode.jpg)
1.7CPU的处理其实很简单