【发布时间】: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