程序是怎么跑起来的

1、对程序员来说CPU是什么呢?

内存是保存命令和数据的场所,通过地址来标记和指定。地址由整数值表示。

CPU很内存是由许多晶体管组成的电子部件,通常称为IC(Integrated Circuit,集成电路)。CPU的内部由寄存器、控制器、运算器、和时钟四个部分组成,各个部分之间由电流信号相互连通。寄存器可用来暂存指令数据等处理对象。控制器负责把内存上的指令、数据读入寄存器、并更具指令的执行情况来控制计算机;运算器负责运算从内存读入寄存器的数据。时钟负责发出CPU开始计数的时钟信号。那么对于程序员来说CPU是什么呢?CPU是各种功能的寄存器的集合器。其中,程序计数器,累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个、其他的寄存器会有多个。
1.3决定程序流程的程序寄存器
CPU每执行一个指令,程序计数器的值就会自动加一,(当执行的指令占据多个内存地址时,增加与指令长度相同的数值),然后,CPU的控制器就会参照程序计数器的数值,从内存中读取命令并执行。也就是说,程序计数器决定着程序的流程。
1.4程序分支和循环机制
程序的流程分为顺序执行,条件分支,和循环三种,顺序执行是按照地址内容的顺序执行指令。条件分支是指更具条件执行任意地址的指令。循环是指重复执行同一个地址的指令。条件分支和循环使用的跳转指令,会参照当前执行的运算结果来判断是否挑战。
 无论当前累加寄存器的运算结果是负数,0,正数,标志寄存器都会将其保存(也负责存放溢出,和奇偶校验的结果),CPU在进行运算的时候,标志寄存器的数值会更具结果自动设定。条件分支在跳转指令前会进行比较运算。至于是否执行跳转指令,则由CPU在参考 标志寄存器的数值后进行判断。标志计算器的第一个字节,第二个字节,第三个字节的值为1时,表示运算结果分别为正数,0,负数。

CPU执行比较的机制很有意思。比如,假设要比较累加寄存器中存储的XXX值和通用寄存器中存储的YYY值,执行比较的指令后,CPU的运算装置就会在内部(暗中)进行XXX-YYY的减法运算。而无论减法运算的结果是正数,0,负数都会保存在标志寄寄存器中。

1.5函数的调用机制

不过,这和条件分支、循环的机制有所不同、因为单纯的跳转指令无法实现函数的调用。函数的调用需要在完成函数内部的处理之后,处理流程在返回到函数调用点(函数调用指令的下一个地址)。那么怎么办才好呢?


机器语言的call指令和return指令能够解决这个问题。建议大家把二者结合起来记忆:函数调用使用的是call指令,而不是跳转指令。在将函数的入口地址设定到程序计数器之前,call指令会把调用函数要执行的指令地址在名为栈的主存内。函数处理完毕之后,在通过函数的出口来执行return命令。return命令的功能是把保存在栈中的地址设定到程序计数器中如下图所示:


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

我们通过基址寄存器和变址寄存器可以对主内存上特定的诶村区域进行划分,从而实现类似与数组的操作。

首先,我们用十六进制数将计算机内存上00000000~FFFFFFFF的地址划分出来。那么,范式该范围的内存区域,只要有一个32位寄存器,即可查看全部的内存地址。但是若果想要向数组那样分割特定的内存区域已达到连续查看的目的,使用俩个寄存器会更加方便些。列如,产看10000000地址~1000FFFF地址时,如图1-9所示,

扫描二维码关注公众号,回复: 1030480 查看本文章


将10000000存入基址寄存器,并使变址寄存器的值在00000000~0000FFFF变化,CPU则会把基址寄存器+变址寄存器的值解释为实际产看的内存地址。变址寄存器相当于高级编程语言中程序中数组的索引功能。

1.7CPU的处理其实很简单

机器语言指令的主要类型和功能如下:

类型 功能
数据转送指令 寄存器和内存、内存和内存、寄存器和外围设备之间的数据读写操作
运算指令 用累加寄存器执行算数运算、逻辑运算、比较运算和移位运算
跳转指令 实现条件分支、循环、强制跳转指令
call/return指令 函数的调用/返回调用前的地址

(1)外围设备指的是连接到计算机的键盘、鼠标、显示器、设备装置、打印机等。

第二章 数据是用二进制数表示的

6、翻转部分图形模式时,使用的是什么逻辑?

XOR运算。XOR运算之翻转与1相对应的位。NOT运算是翻转所有的位。

2.1用二进制数标书计算机信息的原因

想必大家都知道计算机内部是由IC这种电子部件构成的。第一章介绍的CPU(微处理器)和内存也是IC的一种。IC有几种不同的形状,有的像一条黑色蜈蚣,在其俩侧有数个乃至数百个引脚;有的像茶花用的针盘,引脚在IC内部并排排列着。IC的所有引脚,只有直流电压0V或者5V俩种状态。也就是IC的一个引脚,只能表示俩个状态。

IC的这种特性,决定了计算机的信息数据只能用二进制来处理。由于1位(一个引脚)只能表示俩个状态,所以二进制的急速方式变成了0、1、10、11、、100。。。。之中形式。虽然二进制数并不是专门为IC设计的,但是和IC的特性非常吻合。计算机处理信息的最小单位是一位,就相当于二进制中的一位。位的英文bit是二进制数(binary digit)的缩写。

二进制数的位数一般是8位,16位,32位。。。。也就是8的倍数,这是因为计算机所处理的信息的基本单位是8位二进制数。8位二进制数被称为一个字节。位是最小单位,字节是基本单位。内存和磁盘都是使用字节单位来存储和读写数据,使用位则无法读取数据 ,因此字节是信息的基本单位。

2.5逻辑右移和算术右移的区别

当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0,类似与霓虹灯往右滚动的效果。这称为逻辑右移。

将二进制数作为带符号的数值进行运算时,移位后要在最高位填充移位移位前符号位的值(0或者1);注意这里的高位布置是指最高位。就可以正常的实现1/2,1/4.。。。如果是正数,只需要在最高位补0.

现在我们来看一个右移的列子:

将-4(=11111100)右移俩位。这时,逻辑右移的情况下结果就会变成00111111,十进制是63,显然不是-4的1/4.而算术右移就会变成11111111,用补数表示就是-1.即-4的1/4。


符号扩充:是指在保持值不变的前提下将其转换为16位和32位的二进制数。将01111111这个正的8位二进制转换成时16位二进制数时,很容易就能得出0000000001111111这个正确结果,但是像11111111这样的补数来表示的数值,该如何处理呢?其实很简单,将其表示成1111111111111111也就可以了。也就是不管正数还是用补数表示的负数,都只需要用符号位的值(0,或者1)填充高位即可。这就是符号扩充的方法。

3.5 计算机运算出错的原因

计算机之所以会出现运算错我,是因为“有一些十进制数的小数无法转化为二进制数”。列如,十进制数0.1,就无法用二进制数正确表示,小数点后面即使有几百位无法表示。接下来。我们来看一下不能正确表示的原因。

小数点后4位用二进制数表示时的数值范围为0.0000~0.1111.因此,这里只能表示0.5,0.25,0.125、0。0625这四个二进制数小数点后面的位权组合而成(相加总和)的小数。将这些数值组合后嫩能够表示的数值,即为表3-1中所示的无需的十进制数。

。因此这些中间的小数,就无法用小数点后四位数的二进制数来表示。同样0.0625的下一位数一下子变成了0.125.这时,如果增加二进制数小数点的个数也会增加,单不管增加多少位,怎么想家都无法得到0.1这个结果。在遇到循环小数时,计算机会根据变量的数据类型所对应的长度将数值从中间截断或者四舍五入。

4.1内存的物理机制

内存实际上是一种名为IC的电子元件。虽然内存IC包括DRAM(Dynamic Random Access Memory )动态随机存储器,SRAM(Static Random Access Memory)(静态随机存储器),ROM,等多种形式,但是从外部来看,其基本机制都是一样的。内存IC中有点源,地址信号,数据信号,控制信号等用于输入输出的大量引脚(IC引脚),通过为其制定地址(Address)l来进行数据的读写。


将电晕啊连接到VCC和GND后,就可以给其他引脚传递比如0或者1这样的信号。那么这个内存IC能存储多少数据呢?数据信号引脚有D0~D7共八个,表示一次可以输入或者输出8位(1字节)的数据。此外,地址信号引脚有A0~A9共十个,表示可以指定1024个地址。而地址是用来表示数据的存储场所,因此我们可以的出这个内存IC中可以储存1024=1k,所以改内存的IC的容量就是1kb.

现在计算机至少有512M内存。就相当于512000个1KB的内存IC。发当然,一台机器不可能放入如此多的内存IC。通常情况下,计算机使用的内存IC中会有更多的地址信号引脚,这样就能在一个内存IC中存储数十兆字节的数据。因此,只用数个内存,就可以达到512MB的容量。


通过上图可知:内存IC的物理就只很简单,总体来讲,内存IC内部有大量可以存储8位数据的地方,通过地址指定这些场所,之后就可以进行数据的读写。

猜你喜欢

转载自blog.csdn.net/lxn18392641463/article/details/80211767