阅读Intel 64和IA-32体系结构软件开发人员手册时,LEA指令(load effective address)的操作部分使用了一个名为
“有效地址”是什么定义?
EffectiveAddress(SRC)
的计算方法,但在其他地方没有定义。“有效地址”是什么定义?
EffectiveAddress(SRC)
是用来做什么的?EffectiveAddress(SRC)
的计算方法,但在其他地方没有定义。EffectiveAddress(SRC)
是用来做什么的?同一份文件的第3.7.5节(指定偏移量)规定:
内存地址的偏移部分可以直接指定为静态值(称为位移),也可以通过以下一个或多个组成部分进行地址计算:
- 位移 - 8位、16位或32位的值。
- 基址 - 通用寄存器中的值。
- 索引 - 通用寄存器中的值。
- 比例因子 - 值为2、4或8,乘以索引值。
由这些组件相加得到的偏移量称为有效地址。每个组件都可以具有正值或负值(二进制补码表示法),比例因子除外。
EffectiveAddress使用以下内容计算出一个有效地址:
Base + (Index*Scale) + Displacement
有效地址是相对于段基地址的偏移量。当您在保护模式(32位模式)中看到像call 0x80000000
这样的内容时,CPU会将0x80000000添加到由CS段寄存器指向的段的基地址。
在64位模式下,它等同于线性地址,因为分段基本上被禁用了。
base + index*scale + disp
的子集,除了64位模式下的RIP相对寻址。 - Peter Cordes