计算机最底层的计算机语言机器语言是如何变成物理电平信号输给CPU的呢

机器语言的1010这一堆数字怎么变成高低电平的
早些年的时候,输入程序是用纸带的,它就是一个外部存储器。纸带上按照相等的间隔划分,如果在该间隔内打孔,表示0,不打孔表示1,这就是对存储器进行编程,也就是把01数据写到纸带(存储器)中去了。计算机运行时,从纸带(存储器)上读取这些01(当然需要给计算机提供能量了,即供电),然后就可以根据这些数据进行相应的操作了。
纸带是最容易理解的存储器了。另外还有磁带,根据磁带上不同区间的磁化强度和方向不一样,可以存储信息。这些信息是怎么写进去的呢?当然是由外部磁场了,只不过它是用机器写进去的,你也可以考虑用个小磁铁,人工一点点写进入,其实没啥区别,就是没机器快、准而已。磁盘、硬盘等,都是和磁带类似的原理,用磁场存储信息。
对于一些ROM芯片,编程时可以用电荷存储信息,也可以用通断来存储信息。简单点的,就是容丝型的ROM,这种芯片刚出产时,里面所有的小金属丝都是连通的(即所有的开关都处于闭合状态,假设为1)。当对其进行编程时,可以给部分小金属丝加上较大的电流,使小金属丝熔断(就象保险丝那样,被熔断),被熔断的金属丝就相当于一个处于断开状态的开关(假设为0),就这样,把0101数据写到存储器中去了。当给编程好的存储器通电后,它就可以根据开关的状态,输出高低(即10)电平了。
对于一个锁存器,好比是通过一个继电器它用自己一个触点来维持自己的吸合,一旦该继电器吸合后,电源就通过吸合的触电继续给线圈供电,继电器就会一直处于吸合状态,直到电源中断为止。这样,就构成了一个bit的RAM,给个信号让它吸合,它就会一直吸合,给个信号叫它断开,它就一直处于断开状态。它就具有了记忆的功能,并且可受外部的控制。
光驱,电脑用来读写光碟内容的机器,也是在和笔记本便携式电脑里比较常见的一个部件。随着的应用越来越广泛,使得光驱在计算机诸多配件中已经成为标准配置。目前,光驱可分为、DVD光驱()、(COMBO)和等。
 是光驱的心脏,也是最精密的部分。它主要负责数据的读取工作,因此在清理光驱内部的时候要格外小心。
  头主要包括:激光发生器(又称激光二极管),半反光棱镜,物镜,透镜以及光电二极管这几部分。当激光头读取盘片上的数据时,从激光发生器发出的激光透过半反射棱镜,汇聚在物镜上,物镜将激光聚焦成为极其细小的光点并打到上。此时,光盘上的反射物质就会将照射过来的光线反射回去,透过物镜,再照射到半反射棱镜上。
  此时,由于棱镜是半,因此不会让光束完全穿透它并回到激光发生器上,而是经过反射,穿
过透镜,到达了光电二极管上面。由于光盘表面是以突起不平的点来数据,所以反射回来的光线就会射向不同的方向。人们将射向不同方向的定义为“0”或者“1”,接受到的是那些以“0”,“1”排列的数据,并最终将它们解析成为我们所需要的数据。
在激光头读取数据的整个过程中,寻迹和聚焦直接影响到光驱的纠错能力以及稳定性。寻迹就是保持激光头能够始终正确地对准记录数据的轨道。
  当正好与轨道重合时,寻迹误差信号就为0,否则寻迹信号就可能为正数或者负数,激光头会根据寻迹信号对姿态进行适当的调整。如果光驱的寻迹性能很差,在读盘的时候就会出现读取数据错误的现象,最典型的就是在读音轨的时候出现的跳音现象。所谓聚焦,就是指激光头能够精确地将光束打到盘片上并受到最强的信号。
  当激光束从盘片上反射回来时会同时打到4个光电二极管上。它们将信号叠加并最终形成聚焦信号。只有当聚焦准确时,这个信号才为0,否则,它就会发出信号,矫正激光头的位置。聚焦和寻道是激光头工作时最重要的两项性能,我们所说的读盘好的光驱都是在这两方面性能优秀的产品。
  目前,市面上英拓等少数高档光驱产品开始使用技术,通过螺旋螺杆传动齿轮,使得1/3时间从原来85ms降低到75ms以内,相对于同类48速光驱产品82ms的寻址时间而言,性能上得到明显改善。
  而且光驱的聚焦与寻道很大程度上与盘片本身不无关系。目前市场上不论是正版盘还是盗版盘都会存在不同程度的中心点偏移以及光介质密度分布不均的情况。当光盘高速旋转时,造成光盘强烈震动的情况,不但使得光驱产生风噪,而且迫使激光头以相应的频率反复聚焦和寻迹调整,严重影响光驱的读盘效果与使用寿命。在36X-44X的光驱产品中,普遍采用了全钢机芯技术,通过重物悬垂实现能量的转移。
  但面对每分钟上万转的高速产品,全钢机芯技术显得有些无能为力,市场上已经推出了以ABS技术为核心的英拓等光驱产品。ABS技术主要是通过在光盘托盘下配置一副钢珠轴承,当光盘出现震动时,钢珠会在离心力的作用下滚动到质量较轻的部分进行填补,以起到瞬间平衡的作用,从而改善光驱性能。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。21ic官方微信-->
后使用快捷导航没有帐号?
请完成以下验证码
机器语言的1010这一堆数字怎么变成高低电平的
&&已结帖(20)
主题帖子积分
高级工程师, 积分 5869, 距离下一级还需 2131 积分
高级工程师, 积分 5869, 距离下一级还需 2131 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级工程师, 积分 5869, 距离下一级还需 2131 积分
高级工程师, 积分 5869, 距离下一级还需 2131 积分
有点意思了,是不是编译机器代码就是把这种电路状态给确定下来,这个电路状态的能量来源就是我们写程序敲击键盘时产生的高低电平。
qcmc 发表于
楼主是个打字发电机,敲击键盘就能产生高低电平,还能把代码写入单片机
以楼主这个看过,那个读过来说,估计只有这样说才能楼主理解
主题帖子积分
实习生, 积分 12, 距离下一级还需 38 积分
实习生, 积分 12, 距离下一级还需 38 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
实习生, 积分 12, 距离下一级还需 38 积分
实习生, 积分 12, 距离下一级还需 38 积分
个人觉得楼主是搞不明白数据形式的信息(01)怎么可以和能量形式的信息(高低电平)等同吧!
一是信息组成的问题,机器语言0101是人为了更加好的描述电路中两种状态而创造的数学描述,你可以用ABAB来描述也行,你可以看作是二进制,也可以看作是状态描述,其本质是没有变的。而将状态的排列组合定义成一种信息,这就成了机器语言。就好像汉字里的笔画构成语言,英文中的字母构成语言。
二“机器语言的1010这一堆数字”这一堆数字如果是在你脑海里的话就是你脑细胞储存的状态的体现,敲进键盘时就是转化为键盘电路中的高低电平状态,进入储存器就是前面高手说的开关状态,这时你也可以理解成是机器语言0101的一堆数字。信息在这个其中都没有发生变化,变化的只是表达的形式。
主题帖子积分
资深技术员, 积分 486, 距离下一级还需 14 积分
资深技术员, 积分 486, 距离下一级还需 14 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
资深技术员, 积分 486, 距离下一级还需 14 积分
资深技术员, 积分 486, 距离下一级还需 14 积分
LZ问机器语言的1010这一堆数字是怎么变成高低电平的?
1.0和1就是表示高低电平,0和1只是只是一个符号而已,当然你可以选择其他的符号来表示。0和1是规定的表示法了!
2.我们称之为0和1的机器语言,在机器内部就是电压和电流。比如:一般可以将0~2V左右的的相对低一点的电压规定为0,将3~5V的相对高一点的电压规定为1.若越接近0v,这个0越明显;越接近5v,这个1越明显了~
3.存储器里面就是存储就是这些电气性质不等的电压,我们称之为0和1的东西,读取的时候,按照一定的算法读取,是接近高电压的是1,接近低电压的是0.
&&以上就是我个人的理解,不知道对不对,欢迎大家批评指正!
知识源于积累,成功源于执着!
主题帖子积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
看了你的帖子,我也是带着这个问题才找到这里论坛的,也认真看完了所有的回复,很多人都说,这是规定,您当您会大预言术,您说,光,就有了光?中国式的教育真可笑。也只有computer这位朋友解答到路上来了,但是也只是解释了一半问题,1010是一堆虚拟信号,如何把虚拟信号转化成实质的高低电平,所谓高低电平,你可以把它换种说法,导通和不导通,也可以说成打开闭合。很多人说到烧录,烧录只能改变一种状态,但是一条电路,我们通过编程,是可以在烧录后给多种状态的,P0^0=0;P0^0=1;一个LED灯会亮灭,说明电路状态是在发生改变的这个问题的源头在ispGDS上,也就是可编程通用数字开关,但是我是新手没搞明白这个数字开关的原理。也是卡在这里了。
主题帖子积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
看了你的帖子,我也是带着这个问题才找到这里论坛的,也认真看完了所有的回复,很多人都说,这是规定,您当您会大预言术,您说,光,就有了光?中国式的教育真可笑。也只有computer这位朋友解答到路上来了,但是也只是解释了一半问题,1010是一堆虚拟信号,如何把虚拟信号转化成实质的高低电平,所谓高低电平,你可以把它换种说法,导通和不导通,也可以说成打开闭合。很多人说到烧录,烧录只能改变一种状态,但是一条电路,我们通过编程,是可以在烧录后给多种状态的,P0^0=0;P0^0=1;一个LED灯会亮灭,说明电路状态是在发生改变的这个问题的源头在ispGDS上,也就是可编程通用数字开关,但是我是新手没搞明白这个数字开关的原理。也是卡在这里了。
主题帖子积分
初级技术员, 积分 87, 距离下一级还需 13 积分
初级技术员, 积分 87, 距离下一级还需 13 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 87, 距离下一级还需 13 积分
初级技术员, 积分 87, 距离下一级还需 13 积分
高低电平是人为规定的,只要电压进行比较就行,至于二进制和电压换算自然是模数转换
主题帖子积分
实习生, 积分 27, 距离下一级还需 23 积分
实习生, 积分 27, 距离下一级还需 23 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 27, 距离下一级还需 23 积分
实习生, 积分 27, 距离下一级还需 23 积分
主题帖子积分
助理工程师, 积分 1841, 距离下一级还需 159 积分
助理工程师, 积分 1841, 距离下一级还需 159 积分
主题帖子积分
专家等级:结帖率:93%
主题帖子积分
助理工程师, 积分 1841, 距离下一级还需 159 积分
助理工程师, 积分 1841, 距离下一级还需 159 积分
你去看看一下数字电路里面D锁存器那一部分的东西吧!!你就想象存储器中的每一位都是一个D锁存器。
new1988 发表于
我也是这样理解的。
我把存储器就当做D锁存器或者触发器!
这样就明白了。
主题帖子积分
资深技术员, 积分 489, 距离下一级还需 11 积分
资深技术员, 积分 489, 距离下一级还需 11 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
资深技术员, 积分 489, 距离下一级还需 11 积分
资深技术员, 积分 489, 距离下一级还需 11 积分
单片机内部有N多个D触发器和N多个D锁存器,还有很多其它的数字门,程序的语言编译成1010等机器码后,按顺序一个一个的写“写”入“D触发器或D锁存器”里,当需要执行时,D触发器(D锁存器)一起在晶振“时钟”的作用下,向各引脚或其它“存储等”区域做输出动作。这就是&&程序语言--机器码--执行 的执行过程。
&&此域名出售,乐得微LED QQ~1 6 2 8 4 8 5 1
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
楼主,你已经很牛了!你知道吗,至少你已经只需要从机器语言开始问起了。我还想知道高级语言(如c,c++),是怎么变成高低电平,进而引发动作的呢!关于你说的问题,有位楼层的朋友说的好,那只有去深造学一下集成电路设计了!看了这么多朋友的观点,我知道!我与楼主在这一问题上是在同一层次的。见谅了!
言至此,我也想粗谈我对你的问题的理解,为配合你,我从机器语言开始谈起!首先你必须明白根本就没有0,1这个量,这只是两种状态,你懂吗?在一般的电子,电气产品(这里提一点是电气控制部分即弱电部分)所有的能量均来自220V市电,经电源电路可以形成多路直流电压。大家都知道的5v,12v,24v,还有从多少到多少,这些电压值是根据半导体材料的耐性理论计算而来,是行业标准,就无需纠结,否则你要去学集成电路材料学了!哈哈。。那么大家都知道单片机是+5v供电的对不对。好宏观工作条件建立了对不对?下面就要说这个0,1了。
0,1在存储器中是有电量和没有电量,他是一个微观的概念。他就会和模电中说的放大电路那样进行一系列放大形成一个范围去推动后面的门电路。通通断断的,进行电路切换。单片内部包括模拟电路,数字电路。0,1的实现还是需要通过模拟的量进行变化和推动。只是你直接就奔推动的值去了。你不了解的是这个推动的0,1这个概念背后对应的电压值怎么来的。对不对?当让是根据集成电路的材料设计出来的了。很复杂。那就需要探究所有元器件的特性,再去计算了。
主题帖子积分
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
主题帖子积分
专家等级:结帖率:28%
主题帖子积分
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
建议你看下存储器的原理,数电书上:)
练好内功,摘花伤人,单片机交流群:
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
一个有意思的老帖子了。我无法准确回答lz的问题,但我可以解释楼主的问题,免得无知者乱说。
我理解lz的问题是,在现在的cpu中,再执行类似setb acc.1(换成机器码比如是01),如何就使得acc的最低位状态成为高电平了(如果你是8086的汇编学习者,这个指令可以用mov al,1代替)。cpu会认识数学的二进制数01b吗?
在打孔机时代,这个问题可以这么看:
你的01010代码,需要专职的程序录入员将0和1用打孔和不打孔的方法,转换为纸条上的一串孔洞。然后有孔的程序纸通过光照区,有孔无孔转换为光点和暗点,再通过光敏元件,转化为高低电平。以后机器中就再也不会出现0和1,只有高低电平了。
可以说,录入员之前是一个世界,高级语言也好,汇编语言也好,机器代码也好,都是0101的二进制数字世界;光敏传感器之后,都是高低电平的世界。录入员+光电检测完成了这种转换。
现在的计算机,和打孔机时代的区别,只不过是输入变成键盘了,按键接通和断开代替了光线的有和无,在每个键下面的识别电路以后,就完全是高低电平的时代了,010已经不存在了啊。01在哪里?在我们的头脑中,在程序纸上,在键盘表面,在显示器上,就是不在键盘以下的空间中。
至于setb acc.1,也就是01在硬件上对应的低高低高低高高低高低高低低高。这一串高低低高如何使得累加器最低位输出高电平,只不过是cpu中许多级的数字逻辑电路实现的,这个不是lz问题的主要所在。
至于楼主后来提到的能量来源,虚拟的数学的01010序列,转换为物理的电平,除了需要电源以外,提供转换过程的直接能量来源其实就是我的指头敲击的机械能啊,呵呵。此话为回应前面帖子中关于能量的随口而言。
这个答案也送个我的女儿,因为昨晚她问到这个问题了。
主题帖子积分
实习生, 积分 9, 距离下一级还需 41 积分
实习生, 积分 9, 距离下一级还需 41 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 9, 距离下一级还需 41 积分
实习生, 积分 9, 距离下一级还需 41 积分
楼上的答案是最恰当的!
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
很好。支持一下!!!!
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
很好。支持一下!!!!
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 15, 距离下一级还需 35 积分
实习生, 积分 15, 距离下一级还需 35 积分
很好。支持一下!!!!
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
电平只出现在端口上,数据在存储器中。不是一个概念,单片机的任务是照你说的去做,就是设置端口的高低电平。
加/解密高强度芯片,完美替代DM2016和AT88及24C0X系列
主题帖子积分
中级技术员, 积分 205, 距离下一级还需 95 积分
中级技术员, 积分 205, 距离下一级还需 95 积分
主题帖子积分
专家等级:结帖率:60%
主题帖子积分
中级技术员, 积分 205, 距离下一级还需 95 积分
中级技术员, 积分 205, 距离下一级还需 95 积分
几年没有上21IC论坛了,今天才看到大家的讨论,我想的应该和92楼说的差不多。
我们用开发环境敲代码的时候,已经通过键盘把信息存在了电脑的存储器中,在通过编译器、汇编器变成了机器码,之后把这些信息下载到烧录器中,烧录器把机器码烧到MCU中的存储器中,所以机器码101010能量的来源就是我们敲击电脑的手指头,呵呵。。
主题帖子积分
高级工程师, 积分 6966, 距离下一级还需 1034 积分
高级工程师, 积分 6966, 距离下一级还需 1034 积分
主题帖子积分
专家等级:结帖率:100%打赏:1.00受赏:3.00
主题帖子积分
高级工程师, 积分 6966, 距离下一级还需 1034 积分
高级工程师, 积分 6966, 距离下一级还需 1034 积分
数字电路从头看起,从门电路,触发器,时序电路入手。
本人求职:求什么の,算求~ |&&深圳 &&&广州 | 大哥大号 :OO
主题帖子积分
实习生, 积分 39, 距离下一级还需 11 积分
实习生, 积分 39, 距离下一级还需 11 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 39, 距离下一级还需 11 积分
实习生, 积分 39, 距离下一级还需 11 积分
CPU内部里有个步骤叫‘译码’,它就是把这些‘101010’的机器吗译成相对应的CPU动作
技术新星奖章
人才类勋章
技术导师奖章
人才类勋章
时间类勋章
沉静之湖泊
发帖类勋章
无冕之王奖章
等级类勋章
晶莹之水滴
发帖类勋章
技术高手奖章
人才类勋章
时间类勋章
时间类勋章
社区建设奖章
等级类勋章
湍急之河流
发帖类勋章
时间类勋章
时间类勋章
技术奇才奖章
人才类勋章
热门推荐 /1机器语言中的0,1状态是怎样转化为硬件上的高低电平实现的?_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
机器语言中的0,1状态是怎样转化为硬件上的高低电平实现的?
一直没搞清楚,机器语言中的0,1状态是怎样转化为硬件上的高低电平实现的~求解??觉得这才是计算机科学发展的关键 拜托了各位 谢谢
我有更好的答案
可以看一下邏輯電路,電路的通斷使不同輸入對應不同輸出,這個算是基礎了吧……采纳哦
采纳率:74%
为您推荐:
其他类似问题
机器语言的相关知识
等待您来回答电脑怎样执行编程语言的? - 知乎660被浏览70786分享邀请回答mov al, 30h
将这一行代码送入汇编器,得到对应的机器码为:0xB0 0x20
二进制的表示为:
其中 0xB0 就是我们的指令,也就是执行第 176 号指令。这条指令的意思是:从内存中指定的位置搬移数据一个字节宽度的数据到 al 寄存器。地址由紧跟在本指令后的数给出,在这里就是 0x20。指令集中的每一个指令都可以这样编码。每一条指令都定义了一系列的操作。如此,只要按照顺序的从存储器读入指令代号和数据,就可以让程序执行下去。你又要说了,那如果我有循环,有条件判断怎么办?简单。处理器为了能顺序的取指并执行,需要知道当前指令的下一条指令在哪里。为什么不是这一条指令在哪了?因为这一条指令已经取回来了,所以它在哪里就不重要了。为了记录当前指令的下一条指令的位置,处理器内部有一个存放了这个地址的电子装置,实现上它是一系列门电路组成的锁存器,叫做 IP 寄存器(也有叫做 PC 的,这里统称为 IP)。IP 的值可以在运行时被修改。那么只要提供了能够修改 IP 值的指令,就能改变程序的执行流程。可以返回到之前的某个位置,也可以一次前进到之后的某个位置。这个过程叫做“跳转”。所谓循环和判断,本质上都是判断并跳转。用一个程序来做一个直观的说明。这个程序很简单。求出一个数组中所有数的和,然后返回这个值,如果这个值是0,则返回一个 -1。和它等价的 C 代码如下,这里我们将结果返回运行时:int main(void) {
int numbers[5] = {1, 2, 3, 4, 5};
int result = 0;
for (size_t i = 0; i != 5; ++i) result += numbers[i];
return (result == 0 ? -1 : result);
编译器产生的汇编文件长什么样子呢?长这样的:CONST SEGMENT
constNumbers: 0x01, 0x02, 0x03, 0x04, 0x05
CONST ENDS
TEXT SEGMENT
numbers SIZE 20 BYTE
sub esp, 20
movaps xmm0, XMMWORD PTR constNumbers
xor eax, eax
movups XMMWORD PTR numbers[ebp], xmm0
mov DWORD PTR numbers[ebp+16], edx
mov ecx, eax
add eax, DWORD PTR numbers[ebp+ecx*4]
cmp ecx, edx
jne SHORT Loop
or ecx, -1
test eax, eax
cmove eax, ecx
_main ENDP
_TEXT ENDS
为了便于解释,这里隐去了很多细节,并且使用了很多伪代码。上面的汇编程序是不经修改是无法通过编译的。等价的二进制文件又是什么样子呢?为了方便阅读,我稍稍整理了一下,并且加上了对应的汇编代码,它长这个样子:(第8行操作数应当分为两列,这里有一个小错误。)同样的,还是省去了很多细节。绿色的部分就是机器码。我完全理解使用助记符和高级语言的重要性。否则谁能通过机器码一眼看出一段程序的含义呢?当程序装入内存以后,IP将被(另外的某个程序,可能来自操作系统,或者其它软件)设置为 1,意思是:下一条要读取的指令在 1 的位置。然后处理器就开始读入指令。为什么处理器会读入指令呢?它是收到某个信号才会读指令吗?简单的讲,处理器从上电到掉电的整个过程当中只做三件事情,那就是:从内存读取一条指令和指令携带的操作数,同时 IP + 1解码并执行指令回到 1所以不需要什么信号。在上一条指令将 IP 的值修改为 1 之后,处理器就已经完成跳转,找到程序入口了。处理器取指,读入第一条指令 0xce83。这里要插入一点,Intel 的处理器采用的是小端数据格式,就是说一个数的高位放在地址较高的地方,低位放在地址较低的位置。所以要倒过来读,在这里就不详细解释了,略过。处理器将这条啊指令送入解码器,解码的结果告诉处理器,应当执行“将 esp 寄存器中的值减去一个指定数,该数由紧随指令的连续四个字节指定”的操作。然后处理器通过数据总线连续读入四个字节,得出操作数应该是 0x14(十六进制的20)。接着就执行了这个操作,IP + 1,继续取出下一条指令。这个过程是很好理解的。总之就是这样的循环。直到断电。再注意一下行号 11 和 12 标识的代码。11 行将执行比较 ecx 寄存器中的值和 edx 寄存器内的值。根据不同的结果,12 行指令将有不同的行为:两个值相同的时候,12 行指令什么也不做,IP + 1。两个值不同的时候,12 行指令会将 Loop 标号的地址写入 IP。 IP = 9。程序走着走着就走回去了。这就是比较与跳转。简单吧。而 10 行的代码将会使 ecx 寄存器内的值增长,每次经过 10 行都 +1,随着循环的进行,程序流不断的跳转到 9 行,然后经过 10 行。在某一次经过后,ecx 等增长正好令 ecx = edx 成立。这时候 12 行将什么也不做,IP 指向 13,程序又继续进行下去了。接下来,进入处理器的层次来理解它如何工作的。在这里我们要讨论四个问题:指令是如何表示的?数据是如何取回的?指令是如何解码的?指令是如何执行的?程序运行的过程,上面已经提到过了。程序是完整的装入内存中的。运算器能够直接操作的只有存储器中的数据。他们之间的硬件连接如图所示:sorry,搞错了,是这个:图上黄色的一根粗线其实以一排并列的导线,在这里是 8 根导线并列在一起。只是看起来画在了一起,其实是互相分开的。使用 8051 及其外部扩展存储器接口电路来说明问题主要是为了简便。在不失准确性的前提下,我依然隐去一些细节,方便理解。访问存储器的过程主要关注两个问题:送出地址取回数据考虑一般的访问过程,当运算器执行如下操作时:mov al, 0xD0D0
将会发生什么呢?首先 mov 指令指定了数据搬移的操作,第二个操作数是一个立即数参数,直接给出了地址。现在就要到存储器当中去找这个地方了。处理器不能直接操作存储器的具体单元,但是它可以请存储器将对应单元中的数据准备好,然后取回来。你肯定有过取快递的经历,菜鸟驿站去过吧,门市点不会让你亲自进仓库去找快递的,但是你可以告诉快递小哥你的单号,然后他进去帮你找到,最后把包裹交给你。内存和这一个意思。处理器首先将地址放到地址总线上,地址总线就是图上 D0-D7 和 A8-A15 这15 根导线组成的。处理器将自己的端口设置成对应的值,就把地址放到了总线上。0xD0D0对应的端口状态应该是:(图有点小)然后,处理器告诉存储器,我准备好取数据了,地址在总线上,请你准备数据。具体的方式就是拉低
端口的电压到地电位(一般就是 0V)。存储器得到这个消息后,就从总线上取得地址。然后解码这个地址,找到对应的数据,假设数据是0x11吧,然后把数据再放回总线 D7-D0上。处理器在发出取指指令后会等待一段时间,然后就从总线上取回数据。取回的数据就当做存储器的回应。至于这个等待的时间具体多长,这是两个设备间相互约定好的。不需要关心。最后,将总线上取得的数据 0x11 放入 al 中,指令完成。可能有的读者就很迷惑了,为什么放到总线上就能传递数据呢。真实的情况是,总线上传递的是电压的信号。这也是为什么使用二进制方便的原因。总线就是一组导线,在这一组导线上,一一对应的连接了处理器和存储器的端口。虽然电子在导体内的移动速度很慢,但是电场的传播速度却是光速。所以当总线一端的端口建立了电位之后,另一端的电位将立刻改变。此时信号就已经从一个器件传递到了另一个。器件之间信号的传递,依赖的就是端口上电压的改变。器件对总线数据的读取,就是读取端口上电压的高低。而二进制可以使这个问题变的很简单。只要端口上能够反应电压的高和低区别就足以传递信号了,一般的,高电位的区间在 3.3V - 5.0V 之间,而低电位在 0V -
2.2V 之间。考虑到总线都是板级的传输,距离很近,总线上电场传播所需要的时间可以忽略掉。那么一组总线传播数据的速度就取决于其两端端口上电位改变的速度。这可比读卡器读卡高了不知道哪去了。也比磁盘寻道和读取快的多。在数字电路中,我们一般用 0 表示低电平,用 1 表示高电平。
上面提到过,mov 指令的编码是 0xB0。这个编码是什么意思呢?将其写作二进制会发现0xB0 =
刚刚我们已经介绍过了。0和是表示的就是电压的高低。现在一切都清楚了。数据的编码其实就说说的端口上电压的高低状态。如果处理器的输入端口在读入指令时读入的端口情况是从 D7到D0为 高低高高 低低低低。那么就读入了 。那么我们已经知道如何取数据了。取指令也是一个方法。只不过取指令的过程是自动的,指令的地址总是 IP 的值。取回的指令总是送入指令解码器当中。根据读入数据时处理器所处的不同阶段,将会给读入的数据一个不同的解释。读指令阶段就会把数据送入解码器。读数据阶段就会把数据送入另外的地方。接下来,就需要进行指令解码。指令解码本身也是一个非常大的话题,其实单独拿出来也可以写出和本篇一样长的文章了。在这里只能概略的介绍一下。处理器本身要完成某些特定的运算,在硬件上是需要某些特定结构的电路的支持的。比如你要完成一次加法,就需要一个带有加法器的电路。完成一次位移,就要有带移位寄存器的电路。简单的说,任何一条指令,都需要一组特定的电路来提供支持。但是人们通过长期的对数字电路的研究发现。几乎所有的运算,都可以通过有限的几种器件的不同组合来完成。这样的话,我们的通用运算器当中,可以包含一些要素器件,然后通过运行时改变它们的连接来实现不同的功能。这就是我们思考指令编码的方向。其实在电子式计算机刚刚诞生的时候,就已经实现基本运算器的复用了。运算中心中包含了一组基础的运算器,它们的输入输出端口上同时连接了很多组不同的电路,每执行一条指令的时候,都选择其中特定的一组电路,使其生效,而让剩下的电路失效。这样在指令执行的过程中,这一组执行电路就可以独占整个运算器。当运算结束拿到结果后,电路再将运算器释放掉。就可以准备下一次的运算了。在早期,还没有指令编码技术。要使用不同的指令,必须改变电路间的硬连接。也就是要把一组插头从这里拔下来插到另外的地方去。世界上第一台通用电子计算机
ENIAC 的操作方式就是如此。编程的方式是女工进机房去接插头。(假设我们有三条可编程指令流水线,那么如果我们想依次执行数据转移,异或,求和的操作,就需要连接 #1 的 move, #2 的 xor 和 #3 的 add)而后出现了指令编码。送入的指令被解码器解码后,自动启动一组对应的电路。这样说也许很难让人明白“自动”的含义。所以我在这里实现一个简单的编码指令处理器。在这里我们只实现 3 条指令:指令0:将输入端的数据存入寄存器 a指令1:将输入端的数据存入寄存器 b指令2:取寄存器 a 寄存器 b 中的值求和,将结果放入寄存器 a在这里我们只研究解码,不管其它的因素,这样就简化了问题。不多说,直接上图:最顶上的 instraction register 和 instraction decoder 的部分就是指令解器。首先将指令读入一个寄存器,然后解码。实际的运算器也是这样的流程。图中蓝色的就是数据总线,寄存器内的值分别是两个寄存器 Qx 端口上的值。让我们启动他它,来算一下 0x10 + 0x0F (16 + 15)是多少。上电之后,我们注意到:寄存器 a 和寄存器 b (右下两个)都被初始化为 0xFF输入端口(左下角)上的值为 0x00指令寄存器(上方)当中当前的指令为 0x0F (15号),这是一条未定义的指令,所以没有任何效果。首先我们要执行mov a, 0x10
当指令读入后,在指令输入端将会是 0x00 的状态,译码输出端口上输出全 0,指示出目前要执行0 号指令。同时选中了 0 号指令的执行电路。数据端的输入为 。mov 命令的状态下,输入选择器选择输入端口的数据放到总线上。同时,寄存器 a 被激活,将总线上的值存入:(可以看到 0x10 已经被存入寄存器了)第二条指令,我们将启动寄存器 b,然后存入数据。指令为:mov b, 0x0f
instraction decoder 的 1 号输出被选中,此时激活了 1 号指令的电路。输入端的 0x0F 被存入了寄存器 b。而寄存器 a 中的值保持不变。第三条指令,2 号指令,求值。add
没有给出操作时是因为操作是已经隐含的指明了,就是 a 和 b:译码器的 2 号输出选中了。全加器完成了运算(左侧是第四位,右侧是高四位),结果放上了总线,被锁存到了加法器的输出缓冲器当中。同一时间,双输入选择器也被激活。它截断了输入端口的连接而选择加法器输出缓冲值作为输入,将其放上了总线。寄存器 a 从总线取得数据,存入。完成了指令。看看,结果是 0x1F,恰好就是我们预期的 31。实际中的处理器的处理过程比这个复杂得多。这里为了方便理解,做了很多简化。但是概念都是相同的。处理器自动的从内存中读入指令和数据,然后解码,启动对应的电路,最后拿到结果。如此往复。到此为止,已经几乎完全说明了计算机的运算原理,以及高级语言和机器语言的关系。但是我们依然可以更进一部,探究一下数字电路的构成。编码器是怎么运行的?寄存器是怎么锁存数据的?上面一直在说解码器,那么解码器到底是什么?处理器内部的指令解码器可能非常复杂,也许是一个器件,也有可能是一组器件,或者是可编程的硬件电路(对的,硬件电路也是可以编程的,例如 FPGA)。而这里,我在上面的例子中使用的解码器:74LS42 4 Lines to 10
Lines BCD to Decimal Decoder (4线10线BCD译码器)的内部结构是这样的:可以看到,BCD 输入端(左边)输入后首先连接了非门(NOT),然后进入一个选择矩阵,最后通过三入与非门(NAND)输出。与门(AND)、或门(OR)、非门(NOT)是数字电路中,最基础的三种逻辑门电路。它们的组后构建了大量的实用器件。关于三种逻辑门,它们的特性可以使用真值表来表示:(1 代表真,0 代表假)与门:所有输入全为真,输出为真;或门:任意一个输入为真,则输出真;非门:输出总是输入的反。利用这三个门就可以做很多有趣的事情了。61366 条评论分享收藏感谢收起19452 条评论分享收藏感谢收起查看更多回答1 个回答被折叠()}

我要回帖

更多关于 底层语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信