指令集架构的定义是什么?

2023-12-12

我试图弄清楚指令集架构 (ISA) 到底是什么。根据我所读到的内容,我有两种解释。

我的第一个解释是,ISA 是所有寄存器、汇编指令和伪指令、汇编指令以及构成汇编语言的指令格式的集合,可用于对实现指令集的处理器进行编程。

我的第二种解释是 ISA 是计算机字和汇编指令之间的双射映射。例如,指令add $s0, $t0, $t1,计算值$t0 + $t1并将其存储在$s0,对应于单词000000 bin($t0) bin($t1) bin($rd) 00000 10000, where bin($reg)是寄存器的二进制表示$reg(本例中使用的是MISP)。

我不认为这些解释是相互排斥的,因为它们可以共存,假设为给定 ISA 用汇编语言编写的程序将被组装为实现 ISA 的所有处理器的相同机器代码;然而,我也不认为这是显而易见的,因为如果 ISA 仅仅指的是汇编语言的结构(正如我的第一个解释所暗示的),那么相同的程序可以根据处理器被组装成两种不同的机器代码表示形式。

有人可以澄清这个词到底是什么吗指令集架构包含?


指令集架构名义上定义了机器可以执行的每条指令,以及效果、条件和可能的异常等。

指令是根据其操作的数据来定义的,这些数据称为操作数。通常,指令会聚集成组,从而允许可能的操作矩阵,即opcodes和操作数(包括寻址方式)。 MIPS I-Type、J-Type 是这些块的示例,称为格式。

指令是 ISA 的关键。例如,如果没有指令可以引用该寄存器(例如作为操作数),则提供寄存器是没有意义的。这可能就是我们称之为指令集架构的原因,因为我们都是通过指令定义的视角来实现寄存器和行为的。

指令集架构定义了机器码处理器的行为,以及给定某些状态和要执行的指令的处理器的行为。

机器代码中的指令是二进制数字串,CPU 解释又执行。

在机器代码中,没有汇编指令、标签、变量名等……;这些都是汇编语言的产物。在机器代码中,如果您愿意的话,表示 CPU 操作的指令(包含操作码和操作数)和数据的二进制数字串都被 CPU 简单地视为数字(位串)。

汇编语言几乎可以 1:1 转换为机器代码指令,尽管指令、宏、伪指令、数据和其他东西使得这更像是近似值而不是事实。

通常,芯片制造商会定义汇编语言以及指令集架构,但是汇编语言并不是 ISA 的必要条件。 ISA 的真正含义是理解哪些数字(位串)对处理器有什么意义。

事实上,芯片制造商和/或其他人(例如微软、Linux)通常也会定义一个应用程序二进制接口,其中包括一个调用约定帮助软件消费者编写可互操作的软件。

计算机字和汇编指令之间的双射映射

是和否:是,如果汇编指令是指每个可能指令的操作和行为的定义。

我想说的是机器代码的位串之间的映射和处理器如何解析编码的详细定义以及它们的作用,即它们对计算机状态的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指令集架构的定义是什么? 的相关文章

  • 为什么在强度降低乘法和循环进位加法之后,这段代码的执行速度会变慢?

    我正在读书阿格纳 雾 https en wikipedia org wiki Agner Fog s 优化手册 https en wikipedia org wiki Agner Fog Optimization 我遇到了这个例子 doub
  • 68HC11计算sin(x)的汇编代码

    68HC11 使用泰勒级数或查找表计算正弦值的汇编代码是什么 显示值只能是整数 查找表如何工作 在这种情况下 如何使用它来实现泰勒级数 http en wikipedia org wiki Taylor series 如果您正在寻找浮点解决
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li
  • 如何将 x86 GCC 风格的 C 内联汇编转换为 Rust 内联汇编?

    我在 C 中有以下内联汇编 unsigned long long result asm volatile byte 15 byte 49 shlq 32 rdx orq rdx rax a result rdx return result
  • 缓存一致性是否始终可以防止读取过时的值?失效队列允许吗?

    在 MESI 协议中 仅当将缓存行保持在独占 修改状态时才写入缓存行 要获取独占状态 您可以向持有同一高速缓存行的所有核心发送无效请求 但是是否存在一种微架构 其中某些内核会在实际使缓存线无效之前做出确认响应 如果确实如此 那不是违反了缓存
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • SIMD 和 VLIW 指令是一样的吗?

    SIMD 单指令多数据 和 VLIW 超长指令字 到底有什么区别 其中一个是另一个的子集吗 或者它们是两个完全不同的东西 完全不相关且正交 一台机器可以有一个或两个 或者两者都没有 SIMD 指令可以作为扩展添加到 VLIW ISA 但 V
  • 何时可以重用avx指令中的源寄存器

    在 avx 指令中用作源的寄存器何时可以在指令开始处理后重用 例如 我想使用vgatherdps该指令消耗两个 ymm 寄存器 其中之一是位移索引 我意识到vgatherdps由于数据的局部性较差 因此需要花费大量时间来收集 位移索引寄存器
  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • 超标量和 VLIW

    我想问一些关于ILP的问题 超标量处理器是标量处理器和矢量处理器的混合体 那么我可以说矢量处理器的架构遵循超标量吗 同时处理多个指令不会使体系结构超标量 因为流水线 多处理器或多核体系结构也可以实现这一点 这意味着什么 我读过 超标量 CP
  • 标志寄存器中保留/未定义位的用途是什么?

    在 Z80 8080 8085 和 8086 处理器的标志寄存器中 被记录为 保留 或 未定义 的位 1 3 5 的用途是什么 这些位未使用 也就是说 没有指令明确地将它们设置为任何值 设计人员认为 5 6 个标志就足够了 他们只是将标志寄
  • IDA pro asm 指令更改

    我只是想知道我怎样才能 更改IDA视图A中的asm指令 如何编辑指令 对于 实例 jnz 到 jmp 如何插入新指令 call func1 调用 func2 插入到现有的 代码 我知道如何制作 diff 文件 我知道如何在我的 DLL 上应
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C

随机推荐