gpt4 book ai didi

assembly - 汇编指令如何变成 CPU 上的电压变化?

转载 作者:行者123 更新时间:2023-12-03 06:45:21 25 4
gpt4 key购买 nike

在过去的 3 到 5 年里,我一直在使用 C 和 CPython。考虑一下我在这里的知识基础。

如果我要对支持它的处理器使用诸如 0x25181231343141 之类的汇编指令,那么处理器内部究竟是什么来解释此代码并将其作为电压信号分派(dispatch)?如此简单的指令将如何执行?

当我尝试考虑 MOV AL, 61h 甚至 MOV AL, 61h 中包含的众多步骤时,汇编甚至感觉像是一种高级语言。

编辑:我读了一些评论,问为什么当 x86 系列在嵌入式系统中不常见时我把它作为嵌入式。欢迎来到我自己的无知。现在我想,如果我对此一无所知,那么其他人也可能对此一无所知。

考虑到你们在回答中付出的努力,我很难选择一个最喜欢的答案,但我觉得有必要做出决定。没有伤害的感觉,伙计们。

我经常发现,我对计算机了解得越多,我意识到自己真正知道的就越少。感谢您让我对微代码和晶体管逻辑敞开心扉!

编辑#2:多亏了这个线程,我才明白为什么 XOR EAX, EBXXOR EAX, EAX 快。 :)

最佳答案

我最近开始阅读 Charles Petzold 的书,名为 Code,到目前为止,它完全涵盖了我认为您感兴趣的事物。但是在购买/借阅之前,我还没有完全通读这本书。

这是我相对简短的回答,而不是 Petzolds ……希望与您的好奇心一致。

你听说过我假设的晶体管。最初使用晶体管的方法是用于晶体管 radio 之类的东西。它基本上是一个放大器,将漂浮在空气中的微小 radio 信号送入晶体管的输入端,晶体管打开或关闭旁边电路上的电流。你用更高的功率连接那个电路,所以你可以接收一个非常小的信号,将其放大并将其馈入扬声器并收听广播电台(还有更多的事情可以隔离频率并保持晶体管平衡,但是你明白我希望的想法)。

现在晶体管的存在导致了一种将晶体管用作开关的方法,例如电灯开关。 radio 就像一个调光灯开关,您可以将其从一直打开到一直关闭的任何位置打开。非调光灯开关要么全开要么全关,开关中间有一个神奇的地方,它可以转换。我们在数字电子产品中以相同的方式使用晶体管。取一个晶体管的输出并将其馈入另一个晶体管的输入。第一个的输出肯定不是像 radio 波这样的小信号,它迫使第二个晶体管一路导通或一路关断。这导致了 TTL 或晶体管晶体管逻辑的概念。基本上你有一个晶体管来驱动高电压或称之为 1,在它上吸收零电压,我们称之为 0。然后你用其他电子设备安排输入,这样你就可以创建与门(如果两个输入是 1,则输出为 1),或门(如果一个或另一个输入为 1,则输出为 1)。反相器、NAND、门、或非门(一个或一个反相器)等。曾经有一本 TTL 手册,你可以购买 8 个左右的引脚芯片,这些芯片有一个或两个或四个某种门(NAND、NOR、 AND 等)在内部运行,每个输入有两个输入和一个输出。现在我们不需要那些,创建可编程逻辑或具有数百万个晶体管的专用芯片更便宜。但我们仍然考虑硬件设计的 AND、OR 和 NOT 门。 (通常更像 nand 和 nor)。

我不知道他们现在教什么,但概念是相同的,对于存储器,触发器可以被认为是这些 TTL 对(NANDS)中的两个,其中一个的输出连接到另一个的输入。就这样吧。这基本上是我们所说的 SRAM 或静态 ram 中的一个位。 sram 基本上需要 4 个晶体管。 Dram 或动态 ram 您自己放入计算机中的内存棒每位占用一个晶体管,因此对于初学者来说,您可以了解为什么 dram 是您购买千兆字节的东西。只要电源不熄灭,Sram 位就会记住您将它们设置为什么。一旦你告诉它,Dram 就会开始忘记你告诉它的内容,基本上 dram 以第三种不同的方式使用晶体管,有一些电容(如电容器,这里不会进入),就像一个微型可充电电池,只要你给它充电并拔下充电器,它就会开始放电。想象一下架子上的一排玻璃杯,每个玻璃杯上都有小孔,这些是你的 dram 部分,你希望其中一些是一些,所以你有一个助手填满你想成为的眼镜。那个助手必须不断地给投手注满水,然后沿着一排走,让“一”位的杯子装满水,让“零”位的杯子保持空。因此,在任何时候您想查看您的数据是什么,您都可以通过查找绝对高于中间的水位为 1 和绝对低于中间的水位为零的水位来查看和读取 1 和 0.. 所以即使打开电源后,如果助手无法将眼镜装满以区分 1 和 0,它们最终会看起来像 0 并耗尽。这是每个芯片更多位的权衡。所以这里的简短故事是,在处理器之外,我们使用 dram 作为我们的大容量存储器,并且有辅助逻辑负责将 1 保持为 1,将 0 保持为 0。但是在芯片内部,AX 寄存器和 DS 寄存器例如使用触发器或 sram 保存您的数据。对于您所知道的每一位(例如 AX 寄存器中的位),可能有成百上千或更多位用于将位进出该 AX 寄存器。

您知道处理器以某种时钟速度运行,如今大约为每秒 2 GHz 或 20 亿个时钟。想想由晶体生成的时钟,这是另一个话题,但逻辑将时钟视为一个电压,在这个时钟频率 2ghz 或其他任何(gameboy 的进步是 17mhz,旧的 ipods 大约 75mhz,原装 ibm pc 4.77mhz)。

因此,用作开关的晶体管允许我们获取电压并将其转换为我们作为硬件工程师和软件工程师所熟悉的 1 和 0,甚至可以为我们提供 AND、OR 和 NOT 逻辑功能。我们有这些神奇的晶体,可以让我们获得准确的电压振荡。

所以我们现在可以做一些事情,比如,如果时钟是一,我的状态变量说我处于取指令状态,那么我需要切换一些门,以便我想要的指令的地址,在程序计数器,在内存总线上熄灭,以便内存逻辑可以给我 MOV AL,61h 的指令。您可以在 x86 手册中查找,发现其中一些操作码位表示这是一个 mov 操作,目标是 EAX 寄存器的低 8 位,而 mov 的源是一个立即数,这意味着它在这条指令之后的内存位置。所以我们需要将该指令/操作码保存在某处,并在下一个时钟周期获取下一个内存位置。所以现在我们已经保存了 mov al,immediate 并且我们从内存中读取了值 61h,我们可以切换一些晶体管逻辑,以便该 61h 的第 0 位存储在 al 的第 0 位触发器和第 1 位到第 1 位等.

你问这一切是怎么发生的?考虑一个执行一些数学公式的 python 函数。你从程序的顶部开始,输入一些作为变量的公式输入,你可以在程序中进行单独的步骤,可能会在此处添加一个常量或从库中调用平方根函数等。在底部你返回答案。硬件逻辑以相同的方式完成,现在使用的编程语言中的一种看起来很像 C。主要区别在于您的硬件功能可能有成百上千个输入,而输出是一位。在每个时钟周期,AL 寄存器的第 0 位正在使用一个巨大的算法进行计算,这取决于您想要查看多远。想想你为数学运算调用的平方根函数,该函数本身就是其中的一个,一些输入产生输出,它可能调用其他函数,可能是乘法或除法。因此,您可能有一些地方可以将其视为 AL 寄存器位 0 之前的最后一步,其功能是:如果时钟为 1,则 AL[0] = AL_next[0];否则 AL[0] = AL[0];但是有一个更高的函数包含从其他输入计算的下一个 al 位,一个更高的函数和一个更高的函数,其中大部分是由编译器创建的,就像你的三行 python 可以变成成百上千的汇编行。几行 HDL 可以变成成百上千或更多的晶体管。硬件人员通常不会查看特定位的最低级别公式来找出所有可能的输入以及所有可能的 AND、OR 和 NOT 进行计算,而不是检查程序生成的汇编程序。但如果你愿意,你可以。

关于微编码的说明,大多数处理器不使用微编码。例如,您可以使用 x86 来了解它,因为它当时是一个很好的指令集,但从表面上看,它很难跟上现代的步伐。其他指令集不需要微编码,直接按照我上面描述的方式使用逻辑。您可以将微编码视为使用不同指令集/汇编语言的不同处理器,该语言模拟您在表面上看到的指令集。不像您尝试在 mac 上模拟 windows 或在 windows 上模拟 linux 等那样复杂。微编码层是专门为这项工作设计的,您可能会想到只有 AX、BX、CX、DX 四个寄存器,但是有里面还有很多。很自然地,一个汇编程序可以以某种方式在一个或多个内核中的多个执行路径上执行。就像闹钟或洗衣机中的处理器一样,微码程序简单小巧,可调试并烧入硬件,希望永远不需要固件更新。至少是理想的。但是就像您的 ipod 或手机一样,您有时确实需要修复错误或其他任何东西,并且有一种方法可以升级您的处理器(BIOS 或其他软件会在启动时加载补丁)。假设您打开电视 Remote 或计算器的电池盒,您可能会看到一个孔,您可以在其中看到一些裸露的金属触点,可能是三个、五个或多个。对于一些 Remote 和计算器,如果你真的想要你可以重新编程,更新固件。但通常不会,理想情况下, Remote 是完美的或完美的,足以让电视机的生命周期更长。微编码提供了在市场上获得非常复杂的产品(数百万、数亿个晶体管)的能力,并在 future 修复该领域中的大和可修复的错误。想象一下,您的团队在 18 个月内编写了一个 2 亿行的 Python 程序,并且必须交付它,否则公司将无法获得竞赛产品。同样的事情,除了可以在现场更新的代码的一小部分之外,其余的必须保持刻在石头上。对于闹钟或 toastr ,如果有错误或需要帮助的东西,您只需将其扔掉并获得另一个。

如果您翻阅维基百科或只是谷歌的东西,您可以查看指令集和机器语言,例如 6502、z80、8080 和其他处理器。可能有 8 个寄存器和 250 条指令,您可以从晶体管的数量中感觉到,与每个时钟计算触发器中每一位所需的逻辑门序列相比,250 条汇编指令仍然是一种非常高级的语言循环。你的假设是正确的。除了微编码处理器之外,这种低级逻辑不能以任何方式重新编程,您必须使用软件修复硬件错误(对于已经或将要交付且未报废的硬件)。

查一下 Petzold 的那本书,他在解释东西方面做得非常出色,远远超过我能写的任何东西。

关于assembly - 汇编指令如何变成 CPU 上的电压变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3706022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com