《程序是怎么跑起来的》第一章 CPU

预习问题

1,程序是什么?
答:指示计算机每一步动作的一组指令,行事的先后次序

2,程序由什么构成?
答:指令和数据,如printf(“hello”); printf是指令,hello是数据

3,什么是机器语言?
答:CPU可以直接识别并使用的语言,CPU能够直接识别并执行的只有机器语言,使用C,JAVA等语言编写的程序,最终都会转化成机器语言

4,正在运行的程序存储在什么位置?
答:内存,磁盘和硬盘等媒介上保存的程序被复制到内存后才能运行

5,什么是内存地址?
答:内存中,用来表示命令和数据存储位置的数值,通过地址来标记和指定,地址由整数值表示

6,计算机的构成元件中,负责程序的解释和运行的是哪个?
答:CPU,根据程序的指令来进行数据运算,并控制整个计算机的设备,常见的奔腾(Pentium)是CPU的一种

CPU的功能是解释和运行程序,CPU是中央处理器的缩写,相当于计算机的大脑,内部由数百万至数亿个晶体管构成

在这里插入图片描述

1.1 CPU的内部结构解析

CPU和内存是由许多晶体管组成的电子部件,通常称为IC 集成电路。CPU的内部由寄存器,控制器,运算器,时钟组成,各部分之间由电流信号相互连通

寄存器:可用来暂存指令,数据等处理对象,可以将其看作内存的一种。根据种类的不同,一个CPU内部会有20-100个寄存器

控制器:负责把内存上的指令,数据等读入寄存器,并根据指令的执行结果来控制整个计算机

运算器:负责运算从内存读入寄存器的数据

时钟:负责发出CPU开始计时的时钟信号,有些时钟位于CPU外部。时钟的频率越高,CPU的运行速度越快

通常所说的内存指的是计算机的主存储器,简称主存。主存通过控制芯片和CPU相连,主要负责存储指令和数据。主存中每个字节都有一个地址编号。CPU可以通过该地址读取主存中的指令和数据,也可以写入数据。主存中存储的指令和数据会随计算机关机而清除

当程序启动后,根据时钟信号,控制器会从内存中读取指令和数据。通过对这些指令加以解释和运行,运算器就会对数据进行运算,控制器根据运算结果来控制计算机

所谓的控制就是指数据运算以外的处理,比如内存和磁盘等媒介的输入控制,键盘和鼠标的输入,显示器和打印机的输出,这些都是控制的内容

在这里插入图片描述

1.2 CPU是寄存器的集合体

对程序员来说,CPU是具有各种功能的寄存器的集合体,程序员是把寄存器作为对象来描述的。内存的存储场所通过地址编号来区分,而寄存器的种类通过名字来区分

汇编语言采用助记符来编写程序的,汇编语言基本与机器语言是一一对应的,通常将汇编语言编写的程序转化成机器语言的过程称为汇编,将机器语言转化成汇编语言的过程称为反汇编

机器语言级别的程序是通过寄存器来处理的,使用高级语言编写的程序会在编译后转化成机器语言,然后通过CPU内部的寄存器进行处理

在这里插入图片描述
寄存器可以大致分为八类,寄存器中存储的内容可以是指令也可以是数据。数据分为 ‘用于计算的数值’ 和 ‘表示内存地址的数值’,CPU中每个寄存器的功能都是不同的

程序计数器,累加寄存器,标志寄存器,指令寄存器和栈寄存器都只有一个,其它的寄存器一般有多个

1.3 决定程序流程的程序计数器

用户发出启动程序的指示后,Windows等操作系统把程序从硬盘复制到内存后,会将程序计数器设定为0100,然后程序开始运行。CPU每执行一个指令,程序计数器的值就会自动加1。CPU的控制器会参照程序计数器的数值,从内存中读取命令并执行,即程序计数器决定程序的流程

123与456相加示例:
在这里插入图片描述

1.4 条件分支和循环分支

程序的流程分为顺序执行,条件分支,循环

顺序执行即按照地址内容的顺序执行指令,每执行一个指令,程序计数器的值自动加1
条件分支指根据条件执行任意地址的指令
循环指重复执行同一地址的指令

当程序中存在条件分支和循环时,机器语言的指令就可以将程序计数器的值设定为任意地址,这样程序可以返回到上一个地址重复执行指令或跳转到任意地址。条件分支和循环中使用跳转指令,会参照当前执行的运算结果来判断是否跳转。

求123的绝对值示例:
在这里插入图片描述

标志寄存器的作用
无论当前累加寄存器的运算结果是负数,零还是正数,标志寄存器都会将其保存(也负责存放溢出和奇偶校验的结果)
CPU在进行运算时,标志寄存器的数值会根据运算结果自动设定,运算结果的正,负,零,这三种状态由标志寄存器的三个位表示

执行比较指令时,CPU的运算装置在内部进行XXX-YYY的减法运算,无论结果是正数,0,还是负数,都会存在标志寄存器中,通过标志寄存器的三种状态表示比较结果

1.5 函数的调用机制

函数调用处理也是通过把程序计数器的值设定成函数的存储地址来实现的。但这和条件分支,循环的机制有所不同,因为单纯的跳转指令无法实现函数的调用。函数调用完处理完后,处理流程需要返回到函数的调用点(函数调用指令的下一个地址)

函数调用使用的是call指令,而不是跳转指令。在将函数的入口地址设定到程序计数器之前,call指令会把调用函数后要执行的指令地址存储在名为的主存内。函数处理完后,再通过函数出口来执行return命令,return命令的功能是把保存在栈内的地址设定到程序计数器中

调用函数示例:
在这里插入图片描述

1.6 通过地址和索引实现数组

通过基址寄存器变址寄存器可以对内存上特定的内存区域进行划分,从而实现类似于数组的操作
在这里插入图片描述
CPU会把基址寄存器+变址寄存器的值解释为实际查看的内存地址。变址寄存器的值就相当于高级编程语言程序中数组的索引功能

1.7 CPU的处理其实很简单

实际上CPU可以进行的处理非常少
在这里插入图片描述
外围设备包括:键盘,鼠标,显示器,打印机等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值