从程序生成机器代码时,它如何转换为硬件级操作?

Day*_*ake 6 hardware assembly programming-languages

就像说指令是这样的100010101 1010101 01010101 011101010101.现在,这是如何转化为从内存中删除内容的实际工作?存储器由HOLD数据的实际物理晶体管组成.导致他们丢失数据的原因是一些外部信号?

我想知道该信号是如何产生的.就像一些二进制数字如何改变物理晶体管的状态一样.是否存在超出机​​器代码的级别,程序员无法明确看到它?我听说过在硬件级别处理代码的微代码,甚至低于汇编语言.但我仍然不明白.谢谢!

old*_*mer 10

我建议阅读Petzold的书"Code".如果没有物理/电子知识,它会尽可能地解释这些事情.

内存中的每个位,在功能级别,保持为零或一个(不允许进入与讨论无关的异常),您无法删除可以将其设置为零或一个或组合的内存.删除或删除的任意定义只是一个定义,擦除内存的软件只是告诉内存保持擦除的值.

有两种基本类型的ram,静态和动态.正如他们的名字所暗示的那样,只要你不移除力量,静态ram将保持其值直到改变.动态存储器更像是一个可充电电池,你有很多逻辑,你没有看到汇编器或微码或任何软件(通常),使充电电池充电,空电池充电.想想一堆水杯,每一个都有点.静态记忆眼镜保持水,直到清空,没有蒸发,没有.用水的眼镜可以说是没有零的那些(任意定义).当你的软件想要写一个字节有很多逻辑的,它解释该指令和命令写入内存,在这种情况下,是填满或命令时清空眼镜或读取的眼镜当值的小帮手命令.在动态记忆的情况下,眼镜底部有小孔,并且不断地缓慢地让水排出.因此,持有一个眼镜的眼镜必须重新填充,因此辅助逻辑不仅响应读取和写入命令,而且还定期沿着眼镜行走下来并填充眼镜.为什么你会为那些不可靠的记忆而烦恼?对于sram而言,它需要两倍(四倍?)多的晶体管.两倍的热量/功率,两倍的大小,两倍的价格,增加的逻辑,它仍然更便宜,使用德州大容量存储器.处理器中使用的位代表寄存器和其他东西是基于sram的静态.大容量内存,即系统内存的千兆字节,通常是动态的.

在处理器/计算机所做的大部分工作是由该指令在微码的罕见情况下设置或微电子完成(86家庭/被微代码,但是当你在所有类型的处理器,微控制器驱动大部分的日常您触摸它们的项目通常不会进行微编码,因此大多数处理器都没有进行微编码.就像你需要一些工作人员来帮助你将C转换成汇编程序,以及汇编成机器代码一样,有一些逻辑可以将机器代码转换为芯片各部分和芯片外部外围设备的命令.下载llvm或gcc源代码,以了解正在编译的程序的百分比与进行编译所需的软件数量进行比较.您将了解需要多少个晶体管才能将8或16或32位指令转换为某些硬件的某种命令.

我再次推荐Petzold的书,他在教授计算机如何工作方面表现出色.

我还建议编写一个模拟器.你已经完成了汇编程序,所以你理解了那个级别的处理器,在处理器的同一个汇编程序引用中通常也定义了机器代码,所以你可以编写一个程序来读取机器代码的位和字节并实际执行功能.一条指令mov r0,#11你的模拟器程序中有一些变量用于寄存器0,当你看到那条指令时,你将值11放在该变量中并继续.我会避免使用x86,使用更简单的图片12,msp430,6502,hc11,甚至是我使用的拇指指令集.我的代码不一定非常漂亮,更接近蛮力(毫无疑问仍然是马车).如果阅读本文的每个人都采用相同的指令集定义并编写模拟器,那么您可能会拥有与编写模拟器的人一样多的不同实现.同样,对于硬件,您获得的内容取决于实施设计的团队或个人.因此,解析和执行机器代码不仅涉及很多逻辑,逻辑可以而且确实因实现而异.一个x86到下一个可能类似于重构软件.或者由于各种原因,团队可以选择一个do-over并从头开始使用不同的实现.实际上它是在旧逻辑的中间块中重新使用与新逻辑相关联的地方.

微编就像一辆混合动力汽车.Microcode只是另一个指令集,机器代码,需要大量的逻辑来实现/执行.它在大型处理器中购买的是微码可以在现场进行修改.与编译器不同的是,你的C程序可能没问题,但编译器+计算机作为一个整体可能是错误的,通过在编译器中修复,这是软的,你不必更换计算机,硬件.如果可以在微代码中修复错误,那么他们将以这样的方式对其进行修补:启动时BIOS将重新编程芯片中的微代码,现在您的程序运行正常.没有晶体管被创建或销毁,也没有添加线,只是可编程部件发生了变化.Microcode本质上是一个仿真器,但它是一个非常适合指令集的仿真器.当Linus在那里工作时谷歌transmeta和那里正在进行的工作.微处理器在该处理器上更加明显.

我认为回答你的问题的最好方法是,除了晶体管如何工作之外,还要看一下编译器中采用相对简单的编程语言并将其转换为汇编程序的软件/源的数量.或者看看像qemu这样的模拟器以及实现能够运行程序的虚拟机所需的软件数量.芯片和主板上的硬件数量与此相当,不包括存储器中的晶体管,需要数百万到数百万个晶体管来实现通常几百个不同指令或更少的指令.如果你编写一个pic12模拟器并感受到任务,那么考虑6502将采用什么,然后是z80,然后是486,然后考虑四核英特尔64位可能涉及的内容.处理器/芯片的晶体管数量经常被广告/吹嘘,所以你也可以从中看到你从汇编程序中看不到多少.


JYe*_*ton 6

如果你从理解电子学开始,并从那里开始工作(而不是从复杂的代码下来),它可能会有所帮助.

让我们暂时简化一下.想象一下带有电源,开关和灯泡的电路.如果通过闭合开关完成电路,则灯泡亮起.您可以将电路的状态视为1或0,具体取决于它是完成(关闭)还是不完成(打开).

非常简单,如果用晶体管替换开关,现在可以用来自单独电路的电信号控制灯泡的状态.晶体管接受1或0并将完成或打开第一个电路.如果将这些简单电路组合在一起,就可以开始创建并开始执行逻辑功能.

记忆基于类似的原则.

从本质上讲,计算机背面的电源被计算机组件分解成数十亿个小块.这种行为和活动是由提出微处理器和电路的工程师的设计和计划指导的,但最终它是由程序员(或用户)精心策划的.