【问题标题】:Which x86 instruction has a 10-byte immediate?哪条 x86 指令具有 10 字节立即数?
【发布时间】:2018-07-24 13:16:24
【问题描述】:

Intel® 64 and IA-32 Software Developer's Manual, Volume 2A, Section 3.1.1.1 提到符号 ct 表示操作码后面的 10 字节值。但是,我找不到任何带有注释的指令。我是否遗漏了什么或者没有指令采用 10 字节的立即值?

【问题讨论】:

  • 我不知道有一个。没有 x86-64 jmp ptr16:64 encoding,仅适用于 16 位和 32 位模式,如 jmp ptr16:32。 x86-64 只有间接远 jmp 与 seg:offset from memory。
  • EA 和 9A 在 64 位模式下甚至不会“因 10 字节 imm 而失败”(也就是说,它们可能在无法访问的页面前 7 个字节,并且仍然因非法指令而不是访问冲突而失败)跨度>
  • t 是 80 位浮点数的数据类型。也许这个符号只是为了完整性而存在?
  • @fuz:我也在考虑 TBYTE,但这里我们并不是真正谈论 CPU 作为数据运行的常用数据类型,而是指令编码中包含的原始字节序列 -例如,甚至有一个 6 字节的值 cp;立即数使用不同的符号(ibiwidio)。顺便说一句,即使co(8 字节序列)值似乎也未使用。不过,我同意这可能只是为了完整性。
  • @fuz: felixcloutier.com/x86/MOV.html 使用io,而不是co,用于mov r64, imm64

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


【解决方案1】:

据我所知,没有这样的说明。

没有采用浮点立即数的指令,尤其是 x87 10 字节 long double,因此它绝对不是 TBYTE FP 操作数。

32 位有jmp ptr16:32call,绝对直接 远跳转,有一个6 字节的直接目标(cp)。但是 x86-64 没有 calljmp ptr16:64 的编码。 (仅从内存加载 10 字节 seg:offset 的内存间接)。

@Harold 将 64 位模式下的 EA 和 9A 操作码(直接远 jmp/调用)错误视为非法指令,即使它们在不可访问页面前 7 个字节,而不是尝试读取 10 字节立即数访问冲突的故障)


@Matteo 注意到常规立即数使用 ib / iw / id / io。 (例如,mov r64, imm64 REX.W + B8 + rd io。)英特尔的moffs MOV 形式的手册只列出了操作码,而不是 8 字节立即绝对地址格式。

无论如何cp 是一个 6 字节的 seg:ptr32 对,用于 jmp/call 编码。 cd 是一个 4 字节的 seg:ptr16。 x86 在跳转附近没有绝对的direct,所以我们看不到co 是否会用于那个。

似乎ct 只是被某个忘记jmp ptr16:64 不存在的人添加到手册中,或者他们曾经想在指令格式之外描述类似的东西。 IDK 如果它在英特尔手册的其他部分中用于描述内存中的数据,但我知道没有任何指令具有 10 字节的即时数据。

最多为 8 个,用于mov r64, imm64movabs [mem], al/ax/eax/rax(或加载表单)。许多指令也可以有一个 imm32 和一个 disp32,但这是两个不同的值。

【讨论】:

  • 但这如何使它“完整”?一种可能性是有一条未记录的指令需要 10 字节的立即数。
  • @HadiBrais:改写成我的意思。
  • 谢谢!这也是我的结论。我们可能永远不知道它最初是否打算用于从未进入官方指令集的指令。
  • @Trillian:正好又在看这个问答。请记住,AMD 设计了 ​​AMD64。当英特尔记录 IA-32e / Intel64 / 不管他们怎么称呼它时,他们大多并没有制定新的指令。英特尔当然确实对 x86 ISA 进行了新的扩展,并且在他们实现 x86-64 时,可以为 64 位模式或其他一些东西添加jmp ptr16:64 操作码。但它可能对适用于包括 AMD 在内的所有 x86-64 CPU 的东西没有任何用处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多