什么是有效地址?

4
阅读Intel 64和IA-32体系结构软件开发人员手册时,LEA指令(load effective address)的操作部分使用了一个名为EffectiveAddress(SRC)的计算方法,但在其他地方没有定义。
“有效地址”是什么定义?EffectiveAddress(SRC)是用来做什么的?
2个回答

13

同一份文件的第3.7.5节(指定偏移量)规定:

内存地址的偏移部分可以直接指定为静态值(称为位移),也可以通过以下一个或多个组成部分进行地址计算:

  • 位移 - 8位、16位或32位的值。
  • 基址 - 通用寄存器中的值。
  • 索引 - 通用寄存器中的值。
  • 比例因子 - 值为2、4或8,乘以索引值。

由这些组件相加得到的偏移量称为有效地址。每个组件都可以具有正值或负值(二进制补码表示法),比例因子除外。

EffectiveAddress使用以下内容计算出一个有效地址

Base + (Index*Scale) + Displacement

3
请参阅x86寻址模式。它们都是base + index*scale + disp的子集,除了64位模式下的RIP相对寻址。 - Peter Cordes

0

有效地址是相对于段基地址的偏移量。当您在保护模式(32位模式)中看到像call 0x80000000这样的内容时,CPU会将0x80000000添加到由CS段寄存器指向的段的基地址。

在64位模式下,它等同于线性地址,因为分段基本上被禁用了。


“call 0x80000000” 是一个奇怪的例子,因为 x86 没有绝对直接形式的近跳转指令(call instruction),只有 “call rel32”。你是指从某个地址调用,结果 EIP=0x80000000 吗?有些汇编器会这样汇编,但这是一个不寻常的例子。此外,这也是一个更棘手的例子,因为新的 CS:EIP 的获取要等到“call”指令完成后,下一次代码获取时才会发生,而不像数据加载/存储那样立即发生。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接