x86 操作码是任意的吗?

2023-11-23

x86 操作码是任意的吗?

有没有理由hlt是 0xf4 并且nop是0x90吗?


该架构的早期版本(8008,8080)是使用极少量的晶体管/逻辑门来实现的。

当时,我确信设计者以易于解码的方式选择了操作码和指令格式(例如,最少的门数)。这些说明往往很简单,格式也很规则。

(我知道我在 1970 年代设计了 16 位 CPU。Intel 可能做得更好,但他们总是很匆忙。我的 CPU 坚持认为 4 位操作码 0000 和 1111 无效并导致陷阱;这阻止了在大多数情况下,数据会被意外执行,因为整数值往往全为零或最高位为 1)。

成功和竞争需要不断发展和添加新功能。发明/添加新指令使 CPU 能够更快更好地完成任务的压力始终存在:浮点、32 位数据、更多寄存器、SIMD 操作、加密……

随着新一代处理器的出现,以及更大的晶体管预算,当设计人员试图添加新指令时,发生了两件事:

  • 现有的指令集已经定义了一堆模式,并且这些模式无法更改。因此,设计新的操作码、指令格式和操作数,必须塞进指令集中的“漏洞”中。这迫使各种指令使用特殊的位组合
  • 更多晶体管的出现意味着解码复杂的位模式不再是一个问题,因此选择奇怪的位组合并对其进行解码非常简单。

通过十几代 CPU 重复这个过程,直到到达现代,拥有数十亿个晶体管芯片。现在添加的指令变得更加奇特,模式也变得更加复杂。它可以看起来任意;事实并非如此,但它的设计也不够干净。

现代 x86 芯片对指令格式的处理非常令人惊叹,但它确实有效。

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

x86 操作码是任意的吗? 的相关文章

  • 添加饱和 32 位有符号整数内在函数?

    有人可以推荐一种使用 Intel 内在函数 AVX SSE4 添加饱和 32 位有符号整数的快速方法吗 我查看了内在指南并发现 mm256 adds epi16但这似乎只添加 16 位整数 我没有看到 32 位有任何类似的东西 其他电话似乎
  • 汇编:使用数据段寄存器(DS)

    目前我正在学习 x86 汇编 因为我喜欢微控制器编程 所以我熟悉汇编 目前我一直在到处寻找这个问题的答案 但似乎找不到它 DS寄存器 我知道它应该指向我程序中的全局数据 但我不知道知道它到底是如何工作的 我正在使用 NASM 在大多数简单的
  • 返回地址预测堆栈缓冲区与堆栈存储的返回地址?

    一直在阅读 Agner Fog 的 Intel AMD 和 VIA CPU 的微架构 他在第 34 页描述了 返回地址预测 http www agner org optimize microarchitecture pdf http www
  • int 13h 42h 不会在 Bochs 中加载任何内容

    我将引导加载程序从 CHS 更改为 LBA 因此我更换了int 13h 02h with int 13h 42h 它在 QEMU 中工作正常 但是 我在 Bochs 和我的笔记本电脑上运行它时遇到问题 我将引导加载程序写入 USB 闪存驱动
  • 是否可以调用驻留在 exe 中的非导出函数?

    我想调用驻留在第 3 方 exe 中的函数并获取其结果 好像有should是一种方法 只要我知道函数地址 调用约定等 但我不知道如何 有谁知道我会怎么做 我意识到任何解决方案都是非标准的黑客 但有must成为一种方式 我的非恶意用例 我正在
  • 在LPC2148 ARM处理器上创建中断向量的汇编代码

    我最近刚刚开始使用 LPC2148 ARM 处理器 我试图理解一些有关创建中断向量的汇编代码 这是代码 Runtime Interrupt Vectors Vectors b start reset start ldr pc undf un
  • 段寄存器如何参与内存地址转换?

    到目前为止我所学到的有关细分的知识 虚拟地址包含段选择器和偏移量 段选择器与GDTR配合使用 查找段描述符的线性地址 段描述符保存有关所选段的信息 包括其线性地址 所以 我的问题是 根据我所读到的内容 虚拟地址被加载到段寄存器中 然后以某种
  • (nasm x86实模式)如何在引导加载的扇区中写入/读取字符串?

    我正在使用 NASM 为 x86 实模式编写一个最小操作系统 用于教育目的 我想使用 512 字节引导扇区加载包含操作系统其余部分的更大扇区 我已经成功创建了一个加载另一个扇区的引导扇区 但我似乎无法在加载的扇区中写入 读取字符串 这是我的
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 使用 GNU C 内联汇编在 VGA 内存中绘制字符

    我正在学习使用 C 和内联汇编在 DOS 中进行一些低级 VGA 编程 现在我正在尝试创建一个在屏幕上打印出字符的函数 这是我的代码 This is the characters BITMAPS uint8 t characters 464
  • 是否有必要每个机器码只能映射到一个汇编代码?

    假设这两者本质上是相同的 push 1 and 0x1231 这表示每个汇编指令都映射到一个机器代码 但是否每个机器码只能映射到一个汇编代码呢 MIPS汇编语言有几个 伪指令 例如 move 在内部只是一个带有隐式 0 操作数的 add
  • 查找用户输入中的第一个和最后一个大写字母

    输入将从 a z 或 A Z 中获取 并且输入以星号结束 我们需要将输入字符的第一个和最后一个大写字母作为输出 另外 我们应该显示每次输入的内容 注意 我们逐个字符地获取输入 而不是作为字符串 测试用例1 输入 aAbCcP 输出 AP 测
  • 从 64 位 nasm 代码接收 32 位寄存器

    我正在学习 64 位 nasm 我通过执行以下操作来汇编 nasm 文件 该文件仅包含 64 位寄存器 nasm f elf64 HelloWorld nasm o HelloWorld o 并链接它执行以下操作 ld HelloWorld
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • 我可以使用 AVX FMA 单元进行位精确的 52 位整数乘法吗?

    AXV2 doesn t have any integer multiplications with sources larger than 32 bit It does offer 32 x 32 gt 32 http www felix
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 当跳转在 32 字节上不完全对齐时,使用 MITE(传统管道)代替 DSB(微指令缓存)

    这个问题曾经是这个 现已更新 问题 https stackoverflow com questions 59883527 unrolling 1 cycle loop reduces performance by 25 on skylake
  • Nasm 点状标签

    我对 TASM 很熟悉 但对 NASM 不太了解 我读过 NASM 允许使用本地标签 这些标签在名称前用点表示 例如 代码 loop some code jmp loop 定义一个名为 loop的局部标号 引用的地址在后面的jmp指令中使用
  • 使用8086汇编语言画圆[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我试图使用 8086 汇编器画一个圆 我尝试利用中点圆算法 https en wikipedia org wiki Midpoin
  • 问题与 Assembly x86-32 RET n 指令有关

    我知道 Ret n 的含义 但我无法弄清楚它在维护程序运行时堆栈方面的作用 我在那里有点困惑 ret 和栈有关系吗 ret n就好像ret add esp n 您可以将其用于 caller pops 调用约定 Plain ret就好像pop

随机推荐

  • ImageMagick.NET 异常

    我得到了FileNotFoundException当尝试使用 ImageMagick NET 时 取自源代码中的 bin 文件夹 http imagemagick codeplex com releases view 30302 我得到的确
  • chrome.storage 设置\获取说明

    我想在我的扩展中保存信息 我用Chrome storage sync这样做 但是当我保存后立即阅读时 我无法正确检索该值 大概是做了什么蠢事吧 我尝试清除本地存储chrome storage sync clear但这没有帮助 我的保存功能是
  • 使用 .htaccess 密码保护单个文件

    我尝试使用 htaccess 对单个文件进行密码保护 但是 当访问该文件时 浏览器只会重定向到网站的主页 我的 webroot 上有 htpasswd 我的 htaccess 文件如下
  • 在 SQL Server 2005 中,如何设置整数列以确保值大于 0?

    这可能是一个简单的答案 但我找不到它 我有一个包含整数列的表 我想确保插入行时该列中的值大于零 我可以在代码方面执行此操作 但认为最好在桌面上强制执行它 Thanks 我上次的评论是错误的 现在一切都很好 您可以在列上使用检查约束 IIRC
  • 隐藏 ag-grid 中的列名称?

    是否可以隐藏 ag grid 中的第一行 列定义 我只想显示表中的数据并排除列标题 你可以加headerHeight组件上的属性并将其设置为 0 这将隐藏标头 就像这样
  • R:shapefile 上的梯度图

    我目前有一个英国的形状文件 并绘制了英国不同地区的物种数量 到目前为止 我刚刚绘制了 3 个物种种群水平 并将它们着色为红色 高 橙色 中 绿色 低 但我想做的是绘制一个渐变图 而不是仅受 3 种颜色的限制 到目前为止 我有一个名为 计数
  • VS2010 中的 Magick++ - 无法解析的外部符号

    我正在尝试在 VS2010 中使用 ImageMagick Magick 进行 C 项目 我从这里安装了库 klick 然后在我的项目中 我将 c program files ImageMagick 6 6 6 Q16 include 添加
  • 为什么 PHP 认为 0 等于字符串?

    我有以下代码 item price 0 Code to get item information goes in here if item price e item price 1 其目的是将商品价格初始化为 0 然后获取有关它的信息 如果
  • 为 MKOverlayView 制作动画

    我有一个 MKOverlayView 它将动画雷达数据显示为一系列图像 我遇到的问题是雷达图像被 MapKit 切成图块 为了交换图像 我有一个计时器 它调用更新函数 该函数在叠加层中设置当前图像 然后调用以下命令 myRadarOverl
  • 涉及具有易失性变量的表达式的简单语句的正确行为?

    考虑以下陈述 volatile int a 7 a statement A volatile int b a b statement B volatile int c a c statement C 现在 我一直试图在标准中找到一个点 告诉
  • JAXB 在全局范围内将空字符串编组为 Null

    我的问题非常类似于当字符串为空但不为空时 如何防止在 JAXB 中编组空标签 不同之处在于 我无法将注释添加到 package info java 因为我们所有的 JAXB 类型都是从每次构建的模式生成的 如果可能的话 我也更愿意不更改 J
  • 如何在 Node 中逐行读取 stdin

    我正在寻找使用命令行调用来处理带有节点的文本文件 例如 node app js lt input txt 文件的每一行都需要单独处理 但处理后输入行可能会被忘记 使用标准输入的数据监听器 我将输入流按字节大小分块 因此我进行了设置 proc
  • 如何将焦点添加到 WPF 中的可编辑组合框

    我在 wpf 中使用可编辑的组合框 但是当我尝试从 C 代码设置焦点时 它只显示选择 但我想选择编辑选项 光标应显示以供用户输入 你可以试试这个代码 var textBox comboBox Template FindName PART E
  • Django + MySQL - 管理站点 - 添加用户 - 操作错误 - 保存点不存在

    我们试图拥有一个自定义的用户模型和行为 但后来我们注意到 即使是默认 Django 安装通过 Django 管理员添加新用户时出现问题 即使在其他 Django 版本中也会出现此问题 在 Django 中尝试过 1 8 以及最新的 Djan
  • 使用“SELECT”调用函数

    我偶尔会遇到这样的例子SELECT INTO FROM DUAL用于调用函数 例如 SELECT some function INTO a variable FROM DUAL 使用 而不是 a variable some function
  • 访问自动属性 ​​- C#

    自动属性被添加到 net 3 中的语言中 无论如何 使用以下代码创建一个 私有 字段 public string foo get set 是否有可能真正获得对此私有字段的任何形式的引用 我想做类似的事情 public string foo
  • 为什么 Rust 链接器在增量构建时没有更快?

    我是 Rust 的新手 我试图理解为什么 Rust 不能更快地构建 我特别讨论的是最常见的情况 其中我对一个源文件做了一个小更改 然后我需要等待几秒钟cargo build做它的工作 即使我的应用程序代码非常小 如果我添加对 MySQL 和
  • TreeMap 按值排序

    我想编写一个比较器 它可以让我按值而不是默认的自然顺序对 TreeMap 进行排序 我尝试了这样的事情 但无法找出出了什么问题 import java util class treeMap public static void main S
  • 如何使用Powershell或其他工具(递归)获取所有AD用户组?

    我试图在我使用的 Powershell 中获取用户所属的所有组 甚至是嵌套的组 重复地 Get ADUser
  • x86 操作码是任意的吗?

    x86 操作码是任意的吗 有没有理由hlt是 0xf4 并且nop是0x90吗 该架构的早期版本 8008 8080 是使用极少量的晶体管 逻辑门来实现的 当时 我确信设计者以易于解码的方式选择了操作码和指令格式 例如 最少的门数 这些说明