这楼讲我对计算机原理的理解(建意最好有单片机和C语言的基础):
学过C语言的人对 “x = y + z - k;” 这段语句肯定很熟悉,那么CPU是怎么实现的呢,用中文来描述,就是变量y和变量z相加 得出的结果再减变量k,最后把运算结果放到变量x ,对,CPU就是按照这个步奏来实现的,
下面我们就来虚拟一个计算机系统,详细说明CPU是怎么处理 “x = y + z - k;” 的。
现在这里的计算机系统包含有CPU、ROM、RAM;
1. ROM是一个存储器,用来顺序存放运算“x = y + z - k;”的步奏(程序代码).
2. RAM也是一个存储器, 和ROM不同的是,RAM是用来存放数据变量x、y、z、k的.
3. CPU是包含控制和运算功能的一个器件,现在假定CPU里面有两个数据寄存器,分别为累加器A和R1, --------数据寄存器是什么东西有什么用,怎么用,先不用管.
首先要说明一点,变量x为RAM里的3单元,变量y为RAM里的0单元,变量z为RAM里的1单元,变量k为RAM里的2单元;
要执行“x = y + z - k;”这条C语言语句就要进行底层编程,底层编程就是像上面中文描述的过程一样,用CPU的指令来代替中文描述, 一步一步的进行运算处理, 也就是用CPU提供的指令来编程. (这一步应该叫做C编译了)
下面是用CPU指令编好的程序(其实就是“x = y + z - k;”的编译结果):
MOV A,[0];
MOV R1,[1];
ADD A,R1;
MOV R1,[2];
SUB A,R1;
MOV [3],A;
上面的程序一共有6行,然后,装入ROM,就像这个样子:
装好程序后,下面CPU开始上电~~~
CPU复位上电后程序指针是指向ROM的0地址. (当然不也能排除某些变态脑残无敌型CPU是指向XXX%$#的)
1.执行 MOV A,[0]; 此时CPU的程序指针是指向ROM的0地址, CPU把0地址里的 “MOV A,[0];” 通过ROM数据线读入CPU,这一阶段称作取指令或发射指令,取完指令了,CPU分解指令,知道这条指令名为“MOV” ,MOV也就是传送操作的意思,并且知道要把RAM “[0]”地址里的数据送往“累加器A”, CPU解读完这条指令就开始操作,这时CPU先把地址[0]送往数据指针,数据指针也就是RAM的地址,之后再把RAM里的y通过RAM数据线送往累加器A,这时累加器A的内容就为y, 最后CPU还要做一个关键的动作,就是把程序指针加1,以指向下一条指令,结果如下图所示。
2.执行 MOV R1,[1]; 此时CPU的程序指针是指向ROM的1地址, CPU把1地址里的 “MOV R1,[1];” 通过ROM数据线读入CPU,这一阶段称作取指令或发射指令,取完指令了,CPU分解指令,知道这条指令名为“MOV” ,MOV也就是传送操作的意思,并且知道要把RAM “[1]”地址里的数据送往“R1”, CPU解读完这条指令就开始操作,这时CPU先把地址[1]送往数据指针,数据指针也就是RAM的地址,之后再把RAM里的z通过RAM数据线送往R1,这时R1的内容就为z, 最后CPU还要做一个关键的动作,就是把程序指针加1,以指向下一条指令,结果如下图所示。
3.执行 ADD A,R1; 此时CPU的程序指针是指向ROM的2地址, CPU把2地址里的 “ADD A,R1;” 通过ROM数据线读入CPU,这一阶段称作取指令或发射指令,取完指令了,CPU分解指令,知道这条指令名为“ADD” ,ADD也就是加法操作的意思,并且知道要把累加器A和R1相加, CPU解读完这条指令就开始操作,累加器A作为被加数,R1作为加数,相加,运算结果送回累加器A,覆盖累加器A的内容,最后CPU还要做一个关键的动作,就是把程序指针加1,以指向下一条指令,结果如下图所示。
4.执行 MOV R1,[2]; 此时CPU的程序指针是指向ROM的3地址, CPU把3地址里的 “MOV R1,[2];” 通过ROM数据线读入CPU,这一阶段称作取指令或发射指令,取完指令了,CPU分解指令,知道这条指令名为“MOV” ,MOV也就是传送操作的意思,并且知道要把RAM “[2]”地址里的数据送往“R1”, CPU解读完这条指令就开始操作,这时CPU先把地址[2]送往数据指针,数据指针也就是RAM的地址,之后再把RAM里的k通过RAM数据线送往R1,这时R1的内容就为k, 最后CPU还要做一个关键的动作,就是把程序指针加1,以指向下一条指令,结果如下图所示。
5.执行 SUB A,R1; 此时CPU的程序指针是指向ROM的4地址, CPU把4地址里的 “SUB A,R1;” 通过ROM数据线读入CPU,这一阶段称作取指令或发射指令,取完指令了,CPU分解指令,知道这条指令名为“SUB” ,SUB也就是减法操作的意思,并且知道要把累加器A和R1相减, CPU解读完这条指令就开始操作,累加器A作为被减数,R1作为减数,相减,运算结果送回累加器A,覆盖累加器A的内容,最后CPU还要做一个关键的动作,就是把程序指针加1,以指向下一条指令,结果如下图所示。
6.执行 MOV [3],A; 此时CPU的程序指针是指向ROM的5地址, CPU把5地址里的 “MOV [3],A;” 通过ROM数据线读入CPU,这一阶段称作取指令或发射指令,取完指令了,CPU分解指令,知道这条指令名为“MOV” ,MOV也就是传送操作的意思,并且知道要把累加器A的数据送往RAM的“[3]”地址, CPU解读完这条指令就开始操作,这时CPU先把地址[3]送往数据指针,数据指针也就是RAM的地址,之后再把累加器A里的数据通过RAM数据线写入RAM, 最后CPU还要做一个关键的动作,就是把程序指针加1,以指向下一条指令,结果如下图所示。
总之MOV、ADD神马之类的指令和机器码是等同的,机器码就是用2进制来定义表示,CPU可以读取。
这U的电路和指令集都发了,下楼将解密视频上的“播放”效果~
200字以内,仅用于支线交流,主线讨论请采用回复功能。