【问题标题】:What is the maximum length an Intel 386 instruction without any prefixes?没有任何前缀的 Intel 386 指令的最大长度是多少?
【发布时间】:2016-03-07 06:03:48
【问题描述】:

我已阅读this answer,但我需要知道不使用任何指令前缀的 Intel 386(它是 32 位而不是 64 位)上最长的指令长度是多少。

根据手册,大概是12:

  • 操作码:2 个字节
  • MOD/Rm:1 字节
  • SIB:1 个字节
  • 位移:4 个字节
  • 立即数:4 个字节
  • 总数:12

这是正确的答案吗?

【问题讨论】:

  • @user3386109:因为我不知道如何在不使用前缀的情况下构建 15 字节指令。 15 是上限,但我不认为是不允许前缀时最严格的上限。
  • 指令前缀是指令的一部分,实际上是操作码、Mod/RM 和/或 SIB 字节的附加位。您不能忽略或拒绝它们,就像它们不重要一样。
  • @RossRidge:我没有说它们不重要,但是可以想象一个不支持前缀的 x86 ISA 子集的实现。
  • @Ari 我不能。如果没有操作数大小前缀,您会丢失许多 SIMD (SSE) 指令和大多数 16 位(或 32 位)指令。如果没有 REX 前缀,您将丢失所有 64 位指令。没有段覆盖实模式不起作用,线程本地存储也不起作用。如果没有 REP 前缀,您将丢失字符串指令和更多 SIMD 指令。
  • 您希望假设的程序跳转到 16 位代码段执行 16 位操作,然后返回到 32 位代码段执行 32 位操作?这比仅使用多个 8 位指令更糟糕(尽管可能需要访问必须在单个指令中访问的 16 位和 32 位设备寄存器。)Windows NT、Windows 95 和 Linux 等操作系统支持 ' 386 个 CPU。你还没有说清楚为什么你的问题实际上是有用的。这似乎是一个没有实际应用的毫无意义的思想实验。

标签: assembly x86 intel machine-code instruction-set


【解决方案1】:

在 80386 上,这将是 11 个字节:

  • 操作码:1 个字节
  • MOD/RM:1 字节
  • SIB:1 个字节
  • 位移:4 个字节
  • 立即数:4 个字节

2 字节的操作码使用 0Fh 指令前缀,这显然是一个前缀。

【讨论】:

  • 您可以争辩说“转义字节”是操作码的一部分,而不是可选的前缀。 Intel Atom 在具有 3 个以上前缀的 insn 上解码缓慢,计算转义字节。但是,英特尔 Silvermont 是个例外:“与英特尔和 AMD 的大多数其他处理器不同,Silvermont 不仅包括此限制中的标准前缀,还包括转义字节,例如 0F”,根据 Agner Fog 的微架构文档。所以 Silvermont 很奇怪,大多数 CPU 都不会将 0F0F 38 算作前缀。称它们为“转义字节”似乎很明智。
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多