Assembly 英特尔x86手册中是否存在直接/间接寻址模式等术语

Assembly 英特尔x86手册中是否存在直接/间接寻址模式等术语,assembly,x86,addressing-mode,Assembly,X86,Addressing Mode,为了提供一点背景知识,我想研究x86指令是如何手动编码/解码的。我遇到了ModR/M和SIB字节,似乎理解x86寻址模式是理解指令编码方案的基础 因此,我在谷歌上搜索了x86寻址模式。搜索返回的大多数博客/视频都是8086处理器的寻址模式。通过其中一些,不同的寻址模式有寄存器、直接、间接、索引、基于等。但博客在提及这些寻址模式时使用了不一致的名称。多个不同的源使用多个不同的寻址模式。英特尔手册中甚至没有提到这些不同的术语。例如,我似乎在英特尔手册中找不到任何地方,一种称为直接或间接的寻址模式。另

为了提供一点背景知识,我想研究x86指令是如何手动编码/解码的。我遇到了
ModR/M
SIB
字节,似乎理解x86寻址模式是理解指令编码方案的基础

因此,我在谷歌上搜索了x86寻址模式。搜索返回的大多数博客/视频都是8086处理器的寻址模式。通过其中一些,不同的寻址模式有寄存器、直接、间接、索引、基于等。但博客在提及这些寻址模式时使用了不一致的名称。多个不同的源使用多个不同的寻址模式。英特尔手册中甚至没有提到这些不同的术语。例如,我似乎在英特尔手册中找不到任何地方,一种称为直接或间接的寻址模式。另外,
ModRM
字节中的
Mod
位是一个2位字段,这让我想知道是否可以使用4种以上的寻址模式


我的问题是,像直接寻址模式、间接寻址模式这样的术语是“英特尔手册”中不再使用的旧术语,但被普通大众使用。如果这些术语在技术上确实存在,我可以在手册中找到它们的参考。

大多数形式的x86寻址模式都没有正式名称。除64位RIP相对寻址外,它们的格式均为
[base+index*scale+disp8/disp32]
(或其任何1或2个组件的子集)

英特尔在第1卷第3.7.5节中正式命名了寻址模式的组件。它们也使用寄存器、立即数和内存,但通常不会对不同形式的寻址模式做太多的处理

ModRM字节中的Mod位是一个2位字段,这让我想知道是否可能有4种以上的寻址模式

Mod使用disp0/8/32选择寄存器与内存。有更多模式的“退出”代码

  • 模式为无位移的
    [rbp]
    ,这意味着存在无底座的disp32。(这就是您在反汇编中看到
    [rbp+0]
    的原因:
    [rbp]
    的最佳编码是base=rbp,disp8为0。(请注意,
    [rbp]
    是帧指针时没有用。)
  • base=rsp的ModR/M编码意味着有一个SIB字节
  • 索引=RSP的SIB编码意味着没有索引。(根据前面的规则,这使得编码
    [RSP]
    成为可能,而不是不太有用的
    [RSP+RSP]

当用英语写汇编语言时,使用含义明显的术语是很自然的,包括您提到的一些术语。例如,says(我的重点):

2.3.2.4 微操作队列和循环流检测器(LSD)

…(具有索引寻址模式的微熔合UOP在SnB上的IDQ中未分层)

…对于以索引寻址为主的代码 使用基(或基+位移)寻址的重新编码算法 有时,通过保持load plus操作和存储指令的融合来提高性能

索引寻址模式包括使用
idx*scale
的任何组合,而不管它是使用基本reg还是disp32,或者两者都使用。(
idx
单独是不可编码的;
[rax*1]
实际上在某一点上编码为
disp32+idx*1
,而
disp32=0
)“带索引的任何寻址模式”或类似的,否则可能不清楚它们的确切含义。当然,可以验证解释

但他们不会过分地为事物命名。当没有明显的英语短语时,他们会写(仍在Sandybridge部分):

常见的加载延迟为五个周期。使用简单寻址时 模式,基本加上小于2048的偏移量,加载延迟可以是四个周期

在表2-19中,它们有两列,一列表示
Base+Offset>2048;
Base+Index[+Offset]
,另一个用于
Base+Offset<2048
,延迟较低1个周期(256b AVX负载除外)。(有趣的是,
[rdi+8]
的延迟比
[rdi-8]
低1c)

(从技术上讲,他们可能应该说“置换”,因为在x86术语中,整个寻址模式形成一个偏移或有效地址,当添加到段基时,它形成一个线性地址“还用于用非x86通用术语描述寻址模式的即时常量部分。幸运的是,x86分段现在不是你通常需要考虑的事情。)


在《第一卷手册》中,英特尔确实使用了您描述的一些术语。它们将仅带有位移分量的寻址模式描述为“直接”(排序),而将
[reg]
描述为“间接”,因为在谈论指令集及其支持的寻址模式时,会用到这些术语

以下寻址模式建议使用常见的 地址组件

  • 位移⎯ 一个位移本身就代表一个位移 直接(未计算)到操作数的偏移量。因为位移是 在指令中编码,这种形式的地址有时是 称为绝对地址或静态地址。它通常用于访问 静态分配的标量操作数

  • 基地⎯ 仅基表示操作数的间接偏移量

  • (索引∗ 尺度位移⎯ 这种地址模式提供了一种效率