14年1个月前IP:未同步
470877
75楼
这楼讲我对计算机原理的理解(建意最好有单片机和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,就像这个样子:

1.jpg


装好程序后,下面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.jpg


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.jpg

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.jpg

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.jpg

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.jpg


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,以指向下一条指令,结果如下图所示。

7.jpg



总之MOV、ADD神马之类的指令和机器码是等同的,机器码就是用2进制来定义表示,CPU可以读取。


这U的电路和指令集都发了,下楼将解密视频上的“播放”效果~
评论
文号 / 470877

千古风流
名片发私信
学术分 4
总主题 71 帖总回复 1168 楼拥有证书:学者 机友 笔友
注册于 2011/08/12 17:13:20最后登录 2022/12/22 11:43:34
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:0

个人简介

暂未填写
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的