众所周知,计算机内部运行着二进制代码,针对硬件部分来说,为什么计算机能够把二进制码读懂,控制计算机的硬件部分?
其实计算机就是个巨大的状态机!
计算机不能读懂机器码!它只会执行!
机器码只是些0和1的组合,这些组合对应着各种寄存器或者某些逻辑电路的状态。设置这种状态的机器码叫做CPU指令,不过也许叫做opcode更精确。
但是值得注意的是0和1与高低电平的关系。0和1本身并非客观存在,而是对于某种客观存在的主观抽象。换句话说,0和1只是高低电平的代名词。在计算机里,它们就是高低电平的抽象。它们只是用来表示高低电平的。所以不是先有0和1,而是先有高低电平。然后为了表示上的方便,用0和1去代替高低电平。所有0和1的地方,都可以机械地用高、低电平去进行替换!至于0、1与高电平、低电平的对应关系,不是绝对的,只要一致就行了。举例:十进制数“5”用二进制来表示则是“0101”,假设高电平用1来表示,低电平用0来表示,那么5的二进制表示也可以写成 “低电平 高电平 低电平 高电平”或者“低高低高”,但显然“0101”更方便。
CPU“内置”指令集,这些指令集其实是一些硬件结构来的。只要传递一个指令(0和1的组合),CPU就会依赖于它的电路来解码(高低电平),然后操作对应的寄存器或者某些电路,然后这一时刻的CPU就是某一个状态,这个状态会依据输入的指令和当前状态来迁移到下一个状态,至于如何迁移,这就是指令对应的电路的设计了。另一些“电路”负责从内存中取下一条指令。
这一切都是数电的逻辑而已,压根不需要学模电。自己用一些数字电路芯片接线就可以搭出一个逻辑电路,就是性能低了点而已。CPU就是这么“搭”出来的,不过是用硬件描述语言而不是直接手工接线。
实际上,利用Verilog HDL 等硬件描述语言再加上FPGA 芯片,自己也可以实现一个CPU,具体可以参考MIPS CPU的规格说明和指令集。另外也有开源的好像叫做Open RISC R1200吧,我忘了。这个CPU的性能比自己用数电芯片手工接线的要快,不过还是比不上桌面CPU。但原理基本是一样的。
--------------------没人给我评论。。。我就再补充一点点吧----------------------首先我们要理解问题。问题是“为什么计算机能读懂机器码”。这里有几个关键的概念:“计算机”、“能”、“读”、“懂”、“机器码”。
问为什么能之前,要记得先问是不是能。计算机是不是能读懂机器码?
那我们要先定义什么是“懂”。什么程度才算“懂”。这里我就简单理解为“理解机器码的含义”。有时候我们是不需要懂的,例如为什么1+1=2,我们不需要懂,但是仍然可以计算出1+1=2,因为这是规则,规定好的。因为我也可以规定1+1=3,1+1+1=2,反正就是个符号。我规定了3就是两个手指头,2就是三个手指头,这样也可以的。
然后,什么是计算机,下面图灵机部分我会说。
接着是“读”,计算机的底层结构是一些门电路,也就是说,输入高电平(或低电平)会输出高电平(或低电平)。这就是所谓的读。
那么什么是机器码,上面也说了,机器码是只是高低电平的抽象表示。
那么这个问题,可以等价地转换为其他的问题,例如:“为什么图灵机能读懂0和1的组合?”这是从高级别的抽象层次去理解问题的。还可以是“为什么门电路能读懂高低电平?”要从哪个层次去理解问题,就看你的需求了。
@那儿有个活人 提到了那本书。确实很经典。但计算机的根本,要从图灵机的原理说起,网上有一篇文章是关于图灵机的,说得很好,一时间找不到,找到了再补充。
图灵机你可以简单地理解为一台机器,有输入端和输出端,内部能存储一些状态,内置了一些状态迁移的规则。其实就是状态机啦。输入端(输出端)能读取(输出)1或0的串。输入的0或1的组合,可以改变及机器内部的状态。然后根据输入和内部状态,去查规则表,输出另一些0或1的串。
根据这个思想,这种状态机,自己用个switch语句就能写出来,或者用查表法,别笑,虚拟机就是这么搞出来的。当然我们也能用门电路搭建出来。但是效率比较低,而且挺复杂的,如果你不搞EE,只是CS方向的话,模电原理可以忽略不计,我们用现成的数电芯片来搭建,常用的就是74系列的芯片,它们集成了一些逻辑门,用起来方便一点。逻辑门应该不用我多说了吧,这些在布尔代数里都有相应的抽象概念。就是与或非之类的。
这些芯片有一些管脚,一些输入管脚,一些输出管脚,有一张真值表,输入一些高低电平的组合,就会根据真值表,输出另外一些高低电平的组合。如果把几个这样的芯片组合起来,根据它们的真值表,设计好自己的状态集以及状态迁移规则,就会得到一个状态机。我读大学的时候,就曾经在实验室中,拿了好几个这样的芯片,把实验台的接线孔都快用完了,实现了一个完整的数字钟。
这个数字钟的输入端是用钮子开关来做的。也就是说,人机交互的接口是这个钮子开关,钮子开关的开合改变了输入端口的高低电平,几个钮子开关的状态的排列组合,就是所谓的指令集。但人不擅长2进制,2进制的指令也不好记,如果我们在人机接口加个中间层,把手动输入变成中间层的输出,就可以极大地增强这台机器的抽象能力。如果我们把这些2进制指令给个名称,那就是简陋版的汇编语言。这个中间层可以是简陋的T9键盘,方便设置数字钟的数字。我们可以在人和中间层之间添加任意多个中间层,中间层越多,抽象能力越强,当然性能也就越低。这也说明了为什么虚拟机就是比物理机要慢一些,高级语言写的程序理论上就是比低级语言写的程序慢一些。因为抽象能力越强,需要做的状态转换就越多。有些状态是冗余的。只是为了方便人的使用而做的“语法糖”(这里借用了语法糖一词)。
我们还可以将一些指令做成独立的硬件结构,例如加法器,我们在算术上是怎么进行二进制加法运算的,就可以如法炮制在这些逻辑电路中。当我们根据一个冯诺依曼体系结构构建了必要的模块,组合起来之后,它就是一台计算机。
说到这里,其实应该很容易明白了,还是那句话,计算机不懂机器码,它内部有几张“真值表”,这些真值表组合成了状态转换规则。计算机只是负责根据输入的高低电平,“查表”转换输出高低电平而已。
如果你真的要从EE的角度去理解为什么能计算机能读懂机器码,那么你还得恶补以下模电的知识。以及@那儿有个活人 提到的那本书。
图灵机的参考资料:http://www.swarma.org/vm/articles/turing.pdf
楼上其实没理解题主的意思,因为我曾经和题主一样疑惑过,思考过.题主想问的是:软件与硬件是如何交流的?要解决这个疑惑,最好的方法是去读一下这本书《编码:隐匿在计算机软硬件背后的语言》,当然,作为这道题目的答案,其实大家初中都学过了,那就是电磁感应.
软件与硬件是如何交流的?
《编码:隐匿在计算机软硬件背后的语言》
电磁感应
单从硬盘来粗略地说,软件的形式就是磁盘上磁场的不同,硬盘磁头划过磁盘,就感应出了不同的电流.然后再想想电灯,有电流就是亮,没电流就是不亮,所有的一切《编码:隐匿在计算机软硬件背后的语言》都写下来了,真的是相当复杂
上面说了硬盘这部分,下面说说cpu这部分.cpu总的来说就是不同的输入产生不同的输出.而门电路就是这其中的关键.比如说灯泡的开关是人为控制的,而在cpu中,晶体管就是开关,但是晶体管是如何像开关那样工作的?晶体管(transistor)是一种固体半导体器件,所谓半导体就是在有些电压值下它是导体,有些电压值下它是绝缘体,这不就能控制电流的有无了嘛
依次学习:电路分析模拟电路数字电路集成电路单片机微机原理
以硬件视角,二进制是高低电势而已
5的二进制是0101?
有部电影貌似去年得奥斯卡了,叫《模仿游戏》,里面介绍图灵的,楼主需要了解啥是图灵机。http://baike.baidu.com/link?url=ftj9gjrjb_xhsJ-geyfjBEHQ_qT5H-TUUSm1WjU_rXxSZKLHylKN6uwVrpMYzCr3nCAWFiS_d5LX9JbAlqvPIK
有本书叫code - the hidden language of hardware and software, 讲的就是这个事情,处理器的目的就是能处理人按规则编排好的二进制数,书中构建了一个原始的能处理二进制的电路。
这要从模电,数电说起
假想你现在在一个迷宫之中。给你一串二进制代码,0代表左转,1代表右转。根据二进制代码的提示,你顺利走到迷宫的其中一个终点,打开宝箱,获得指令mov...
mov
处理器也是类似的,不过更复杂。。。
其实看到这个问题的第一眼,我就想到了 minecraft 里有人做的加法器、计算器、八位(?)CPU来着 :-D
这样子想:问:为什么人可以吃饭? 答:因为人有消化系统啊。问:那为什么有消化系统啊? 答:进化过来的啊。问:怎么进化过来的? 答:可自我复制分子 => 人,就这样。问:为什么计算机可以理解机器码啊? 答:因为有众多芯片和使用协议组织这些机器码啊。问:他们是怎么组织的啊? 答:你可以问问电报是怎么工作的…问:电报是怎么工作的啊? 答:用摩斯密码呗,其实就是一份协议。问:用摩斯密码电报是怎么工作的? 答:按不同的电波接收频率代表不同字。问:那电报机是怎么理解摩斯密码的? 答:电报机不理解,理解的是人,人规定了怎么收发问:那是怎么规定的? 答:那你吃饭是谁规定的?问:那—— 答:你TM有完没完??!!问:我TM还是不明白计算机如何理解机器码啊? 答(扶一扶眼镜):好吧,计算机组成可以归为三类下类东西:回路,回路上的逻辑控非门,高低电势。 一般计算机电路内的信息都是二进制表示的,而多个0 1 就可以组成机器码,机器码的组成其实就是过个高低电势的组成。高低电势可以让逻辑控非门开或者关(0或者1),然后很多的回路和逻辑控非门就会组成非常多的线路(流水线),机器码经过这些线路会被改变或衍生新的机器码,反过来回路和逻辑控非门也可以根据机器码开或者关或者生成更加复杂的线路(流水线)。问:话!你学模电的啊? 答:没有,我猜是这样子的。
推荐看《编码的奥秘》,由浅入深,反正是后面很多东西我是跳过的。因为越来越深。居然看不懂了。
这不是一个阅读性书籍,需要静下心里慢慢研读。有时间我会再看一遍。
代码-机器码-高低电平
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(13)
其实计算机就是个巨大的状态机!
计算机不能读懂机器码!它只会执行!
机器码只是些0和1的组合,这些组合对应着各种寄存器或者某些逻辑电路的状态。设置这种状态的机器码叫做CPU指令,不过也许叫做opcode更精确。
但是值得注意的是0和1与高低电平的关系。0和1本身并非客观存在,而是对于某种客观存在的主观抽象。换句话说,0和1只是高低电平的代名词。在计算机里,它们就是高低电平的抽象。它们只是用来表示高低电平的。所以不是先有0和1,而是先有高低电平。然后为了表示上的方便,用0和1去代替高低电平。所有0和1的地方,都可以机械地用高、低电平去进行替换!至于0、1与高电平、低电平的对应关系,不是绝对的,只要一致就行了。举例:十进制数“5”用二进制来表示则是“0101”,假设高电平用1来表示,低电平用0来表示,那么5的二进制表示也可以写成 “低电平 高电平 低电平 高电平”或者“低高低高”,但显然“0101”更方便。
CPU“内置”指令集,这些指令集其实是一些硬件结构来的。只要传递一个指令(0和1的组合),CPU就会依赖于它的电路来解码(高低电平),然后操作对应的寄存器或者某些电路,然后这一时刻的CPU就是某一个状态,这个状态会依据输入的指令和当前状态来迁移到下一个状态,至于如何迁移,这就是指令对应的电路的设计了。另一些“电路”负责从内存中取下一条指令。
这一切都是数电的逻辑而已,压根不需要学模电。自己用一些数字电路芯片接线就可以搭出一个逻辑电路,就是性能低了点而已。CPU就是这么“搭”出来的,不过是用硬件描述语言而不是直接手工接线。
实际上,利用Verilog HDL 等硬件描述语言再加上FPGA 芯片,自己也可以实现一个CPU,具体可以参考MIPS CPU的规格说明和指令集。另外也有开源的好像叫做Open RISC R1200吧,我忘了。这个CPU的性能比自己用数电芯片手工接线的要快,不过还是比不上桌面CPU。但原理基本是一样的。
--------------------没人给我评论。。。我就再补充一点点吧----------------------
首先我们要理解问题。问题是“为什么计算机能读懂机器码”。
这里有几个关键的概念:
“计算机”、“能”、“读”、“懂”、“机器码”。
问为什么能之前,要记得先问是不是能。
计算机是不是能读懂机器码?
那我们要先定义什么是“懂”。什么程度才算“懂”。这里我就简单理解为“理解机器码的含义”。
有时候我们是不需要懂的,例如为什么1+1=2,我们不需要懂,但是仍然可以计算出1+1=2,因为这是规则,规定好的。因为我也可以规定1+1=3,1+1+1=2,反正就是个符号。我规定了3就是两个手指头,2就是三个手指头,这样也可以的。
然后,什么是计算机,下面图灵机部分我会说。
接着是“读”,计算机的底层结构是一些门电路,也就是说,输入高电平(或低电平)会输出高电平(或低电平)。这就是所谓的读。
那么什么是机器码,上面也说了,机器码是只是高低电平的抽象表示。
那么这个问题,可以等价地转换为其他的问题,例如:
“为什么图灵机能读懂0和1的组合?”
这是从高级别的抽象层次去理解问题的。
还可以是“为什么门电路能读懂高低电平?”
要从哪个层次去理解问题,就看你的需求了。
@那儿有个活人 提到了那本书。确实很经典。
但计算机的根本,要从图灵机的原理说起,网上有一篇文章是关于图灵机的,说得很好,一时间找不到,找到了再补充。
图灵机你可以简单地理解为一台机器,有输入端和输出端,内部能存储一些状态,内置了一些状态迁移的规则。其实就是状态机啦。输入端(输出端)能读取(输出)1或0的串。输入的0或1的组合,可以改变及机器内部的状态。然后根据输入和内部状态,去查规则表,输出另一些0或1的串。
根据这个思想,这种状态机,自己用个switch语句就能写出来,或者用查表法,别笑,虚拟机就是这么搞出来的。当然我们也能用门电路搭建出来。但是效率比较低,而且挺复杂的,如果你不搞EE,只是CS方向的话,模电原理可以忽略不计,我们用现成的数电芯片来搭建,常用的就是74系列的芯片,它们集成了一些逻辑门,用起来方便一点。逻辑门应该不用我多说了吧,这些在布尔代数里都有相应的抽象概念。就是与或非之类的。
这些芯片有一些管脚,一些输入管脚,一些输出管脚,有一张真值表,输入一些高低电平的组合,就会根据真值表,输出另外一些高低电平的组合。如果把几个这样的芯片组合起来,根据它们的真值表,设计好自己的状态集以及状态迁移规则,就会得到一个状态机。我读大学的时候,就曾经在实验室中,拿了好几个这样的芯片,把实验台的接线孔都快用完了,实现了一个完整的数字钟。
这个数字钟的输入端是用钮子开关来做的。也就是说,人机交互的接口是这个钮子开关,钮子开关的开合改变了输入端口的高低电平,几个钮子开关的状态的排列组合,就是所谓的指令集。但人不擅长2进制,2进制的指令也不好记,如果我们在人机接口加个中间层,把手动输入变成中间层的输出,就可以极大地增强这台机器的抽象能力。如果我们把这些2进制指令给个名称,那就是简陋版的汇编语言。这个中间层可以是简陋的T9键盘,方便设置数字钟的数字。我们可以在人和中间层之间添加任意多个中间层,中间层越多,抽象能力越强,当然性能也就越低。这也说明了为什么虚拟机就是比物理机要慢一些,高级语言写的程序理论上就是比低级语言写的程序慢一些。因为抽象能力越强,需要做的状态转换就越多。有些状态是冗余的。只是为了方便人的使用而做的“语法糖”(这里借用了语法糖一词)。
我们还可以将一些指令做成独立的硬件结构,例如加法器,我们在算术上是怎么进行二进制加法运算的,就可以如法炮制在这些逻辑电路中。当我们根据一个冯诺依曼体系结构构建了必要的模块,组合起来之后,它就是一台计算机。
说到这里,其实应该很容易明白了,还是那句话,计算机不懂机器码,它内部有几张“真值表”,这些真值表组合成了状态转换规则。计算机只是负责根据输入的高低电平,“查表”转换输出高低电平而已。
如果你真的要从EE的角度去理解为什么能计算机能读懂机器码,那么你还得恶补以下模电的知识。以及@那儿有个活人 提到的那本书。
图灵机的参考资料:http://www.swarma.org/vm/articles/turing.pdf
楼上其实没理解题主的意思,因为我曾经和题主一样疑惑过,思考过.
题主想问的是:
软件与硬件是如何交流的?
要解决这个疑惑,最好的方法是去读一下这本书
《编码:隐匿在计算机软硬件背后的语言》
,当然,作为这道题目的答案,其实大家初中都学过了,那就是电磁感应
.单从硬盘来粗略地说,软件的形式就是磁盘上磁场的不同,硬盘磁头划过磁盘,就感应出了不同的电流.
然后再想想电灯,有电流就是亮,没电流就是不亮,所有的一切《编码:隐匿在计算机软硬件背后的语言》都写下来了,真的是相当复杂
上面说了硬盘这部分,下面说说cpu这部分.
cpu总的来说就是不同的输入产生不同的输出.而门电路就是这其中的关键.比如说灯泡的开关是人为控制的,而在cpu中,晶体管就是开关,但是晶体管是如何像开关那样工作的?
晶体管(transistor)是一种固体半导体器件,所谓半导体就是在有些电压值下它是导体,有些电压值下它是绝缘体,这不就能控制电流的有无了嘛
依次学习:
电路分析
模拟电路
数字电路
集成电路
单片机
微机原理
以硬件视角,二进制是高低电势而已
5的二进制是0101?
有部电影貌似去年得奥斯卡了,叫《模仿游戏》,里面介绍图灵的,楼主需要了解啥是图灵机。
http://baike.baidu.com/link?url=ftj9gjrjb_xhsJ-geyfjBEHQ_qT5H-TUUSm1WjU_rXxSZKLHylKN6uwVrpMYzCr3nCAWFiS_d5LX9JbAlqvPIK
有本书叫code - the hidden language of hardware and software, 讲的就是这个事情,处理器的目的就是能处理人按规则编排好的二进制数,书中构建了一个原始的能处理二进制的电路。
这要从模电,数电说起
假想你现在在一个迷宫之中。给你一串二进制代码,0代表左转,1代表右转。根据二进制代码的提示,你顺利走到迷宫的其中一个终点,打开宝箱,获得指令
mov
...处理器也是类似的,不过更复杂。。。
其实看到这个问题的第一眼,我就想到了 minecraft 里有人做的加法器、计算器、八位(?)CPU来着 :-D
这样子想:
问:为什么人可以吃饭? 答:因为人有消化系统啊。
问:那为什么有消化系统啊? 答:进化过来的啊。
问:怎么进化过来的? 答:可自我复制分子 => 人,就这样。
问:为什么计算机可以理解机器码啊? 答:因为有众多芯片和使用协议组织这些机器码啊。
问:他们是怎么组织的啊? 答:你可以问问电报是怎么工作的…
问:电报是怎么工作的啊? 答:用摩斯密码呗,其实就是一份协议。
问:用摩斯密码电报是怎么工作的? 答:按不同的电波接收频率代表不同字。
问:那电报机是怎么理解摩斯密码的? 答:电报机不理解,理解的是人,人规定了怎么收发
问:那是怎么规定的? 答:那你吃饭是谁规定的?
问:那—— 答:你TM有完没完??!!
问:我TM还是不明白计算机如何理解机器码啊? 答(扶一扶眼镜):好吧,计算机组成可以归为三类下类东西:回路,回路上的逻辑控非门,高低电势。 一般计算机电路内的信息都是二进制表示的,而多个0 1 就可以组成机器码,机器码的组成其实就是过个高低电势的组成。高低电势可以让逻辑控非门开或者关(0或者1),然后很多的回路和逻辑控非门就会组成非常多的线路(流水线),机器码经过这些线路会被改变或衍生新的机器码,反过来回路和逻辑控非门也可以根据机器码开或者关或者生成更加复杂的线路(流水线)。
问:话!你学模电的啊? 答:没有,我猜是这样子的。
推荐看《编码的奥秘》,由浅入深,反正是后面很多东西我是跳过的。因为越来越深。居然看不懂了。
这不是一个阅读性书籍,需要静下心里慢慢研读。有时间我会再看一遍。
代码-机器码-高低电平