硬件指南 » 教程 » 什么是 op_code?
如果你还是不知道 什么是 op_code?,在这里我们将为您进行讲解,同时您还将了解到这些相当神秘且在某些处理器中引起热议的未记录的隐藏代码。
什么是 op_code?
Un op_code 或操作码 它只不过是一条指令,允许 CPU 在接收到该指令时执行操作,并将该操作应用于操作数(即数据)。
也就是说,它可以理解为CPU可以解释的二进制代码,用于执行硬件任务和运行软件。所有的op_codes或 指令将在 CPU ISA 中定义,因此另一台机器或不同的 ISA 无法理解它们。
因此, 程序 它们由程序员创建(编译后为二进制格式),由一系列指令和数据组成,这些指令和数据将被加载到 RAM 中,然后由 CPU 访问并按顺序执行。指令有其操作码 (op_code),该操作码将被解释以告诉执行单元如何处理数据或操作数。
例如,它们可以指示位移位、逻辑运算、算术运算等。这就是它的工作原理,我想我们之前已经解释过了,所以很清楚……
OP_CODE 如何工作?
这样 CPU 就可以 接收和处理信息 为了执行程序,需要这些基本命令或指令,它们将以二进制格式呈现,以便于理解。然而,在编程过程中,为了提高抽象程度并方便程序员操作,如果想在较低级别工作,可以使用高级语言或汇编语言。在汇编语言中,这些指令将以助记符的形式表示,以便于记忆,而不是像机器码那样以二进制格式表示。
我不会详细介绍 RISC 类架构和微操作等,因为那将是另一篇文章的主题。
一旦程序员写完 你的程序的源代码您可以使用编译器将其转换为 CPU 可以理解的二进制可执行文件。这将生成一个(或多个)包含数据(变量、常量等)和二进制指令的可执行文件。当此应用在操作系统上运行时,CPU 将负责处理它。
如何逐步在 Amazon Fire 上安装 Google Play 商店现在,当一个程序或进程被操作系统调度程序加载到 RAM 中时,它只包含执行所需的指令和操作数,但首先它们必须通过控制单元,这些操作码将通过微码进行解释,并转换成控制信号,以向执行单元指示操作数在哪里以及它们必须对操作数做什么才能获得所需的结果。
通过 解码器,CPU就能从收到的指令中获取这些控制信号,这就是它的工作原理。
测量内存电压时,这些数据和指令也可以以十六进制格式查看,并使用特定程序进行分析。也可以通过反汇编来分析程序。
操作码的类型
几 操作码的类型 我们可以根据它们的功能进行分组。例如,我们可以找到以下内容:
数据转移:顾名思义,这类指令用于将数据从源位置传输到目标位置。通常,这类代码可以在内存层次结构的不同区域中进行搜索,并可以根据 CPU 允许的寻址模式进行操作。
算术: 可以想象,这些指令用于对操作数执行算术运算。例如,ALU 单元可用于对二进制位执行加法、减法、乘法或除法。
逻辑: 在ALU中对操作数的二进制位进行逻辑运算,例如AN、OR、XOR等。
转变:这些可能与前两个类似,但可以在 ISA 支持的数据类型之间执行转换。
控制: 这些其他类型的指令非常重要,它们直接作用于 CPU 的 PC(程序计数器)寄存器。该寄存器指向下一条要执行的指令,因此程序会按顺序逐条执行。然而,这些代码可以改变 PC 寄存器,例如产生条件跳转、循环等。它们还可以处理系统调用、子程序返回等。
输入/输出:在这种情况下,它们用于执行输入和输出操作。I/O 系统充当内存,使用可读地址表示输入外设,使用可写地址表示输出外设。所有这些都经过映射,以便 CPU 能够控制各种外设。
Synopsys.ai Copilot:加速芯片设计的生成式 AI 副驾驶什么是非法操作码?(未记录的指令)
Un 非法操作码,也称为未记录的指令,或者说垃圾操作码,正如我们在前几节中讨论过的,只不过是一条 CPU 指令,但它并没有出现在任何 CPU 设计者或制造商的官方手册中。这相当神秘,并导致一些用户对处理器的扫描结果产生怀疑,因为他们会搜索这些未记录的指令。事实上,你可以在 GitHub 上找到一个程序来执行此类搜索……
这些 op_codes 或未记录的指令 它们可能完全无害但它们也可能被熟悉它们的人设计的代码所利用,尽管这些代码并非出于恶意。尽管它们没有文档记录,也未被任何商业编译器使用,但它们确实有用。
在任何 CPU 中发现未记录的指令并不罕见,也没有手册中未显示或程序员无法使用或对他们不透明的寄存器,并且设计人员保留这些寄存器用于不详细的任务或考虑将在新一代中实现的未来功能,或用于在工程样品中进行测试。
小德历史
最早检测到的未记录的操作码之一是在 20 世纪 90 年代。 1970年代,在诸如 Intel 8086、Zilog Z80 和 MOS Technology 6502 等流行的 CPU 中。我们还可以提到德州仪器的 TM9900 等。
在其中一些 旧 CPU这些操作码是由于晶体管的布线或互连而存在的,允许执行设计者未预期的其他操作。在更现代的设计中,也存在一些设计者故意引入的未记录指令,供自己使用。
在某些架构上,这些非法操作码仅仅是错误处理程序的陷阱。然而,未经验证或意外的代码可能仍然存在于某些 CPU 上。此外,自然而然地,许多用户开始开发 他最偏执的一面 他们怀疑他们可能也是为了某事而来,而且对安全不太有利……
在 CPU 设计中,例如 Intel 80186、80286 或 Motorola 68000与其他情况不同,未记录的指令并不多,鲜为人知或使用。此外,如果CPU设计合理,当它遇到这些非法代码时,应该会触发异常或故障条件,从而终止包含此未记录代码的应用程序,并防止进一步的问题发生。
自动更新驱动程序的工具幸运的是,如果这些非法操作码中的任何一个导致任何反复的故障,它们可以使用 固件更新或 微码.
在当前形势下,尽管英特尔等公司否认或保证不会出现此类指令,但许多调查仍然发现 模糊测试技术在英特尔和 AMD 的最新 CPU 以及其他产品(例如苹果的 M 系列(参见 AMX))中都发现了一些未记录的指令。
一些未记录的指令可能是某个系列或 ISA 的一部分,并被从其派生的所有处理器继承,其他指令仅适用于某些微架构或实现。
未记录的指令的影响
其中 效果 在这些未记录的操作码或指令中,我们有:
有些可能只是偶然发生的,不会产生任何有用的效果。有些甚至可能产生不良影响,执行后会产生错误。
它们还可以用来加速一些关键任务。
另一个常见的效果可能是实施保护芯片免遭逆向工程或过去常见的 CPU 克隆。
另一方面,它们也可能比这更加隐蔽,在某些情况下会被用来危害安全,尽管到目前为止还没有观察到这种类型。
它们甚至可能在芯片测试或调试期间执行某些功能。
另一方面,应该注意的是,这些未记录的指令也可能意味着 其他风险因为如果这些代码没有记录在案或不为人所知,它们可能会在未来的实现或 CPU 变更中造成问题。例如,在 Apple II 中,当 Apple IIc 出现时,一些电子游戏无法运行,因为它们使用了 6502 的一个变体,即 65c02,而这个变体消除了这些代码。
如今,许多人出于纯粹的好奇心,或为了发现潜在的 bug 或漏洞,会扫描 CPU 中这些未记录的指令。在其他情况下,它们只是被用来设计 模拟器 所述 CPU 并创建精确的系统……