The lea
指令(“加载有效地址”)获取第一个值的内存地址并将其与第二个值相加 - 第二个值可能会相乘。然后它将该内存地址加载到给定的寄存器中。
我举个例子来澄清一下我的困惑:
eax = 2
leal (%eax, %eax, 4), %edx
我相信这样做的结果是edx
将会有价值10
在它里面(2 + 2 * 4 == 10
). But 如果这条指令只是对整数进行算术运算,为什么它是针对内存地址的?
我读过其他回复,但他们都说内存地址是唯一涉及的内容。有人可以帮我理解什么吗leal
是在做?
LEA 之所以如此工作,是因为在最初的 8086 上,LEA 指令重用了处理器的有效地址计算硬件。有效地址硬件计算指令的内存操作数所作用的地址。由于需要执行许多不同的基本操作来计算有效地址,这意味着相对而言,需要将大量的能量打包到一个LEA
操作说明。大多数“真实”算术指令一次仅执行一项操作,并且大多数要求目标寄存器是源操作数之一。由于它可以实现少量的额外编码空间和硅面积,因此考虑到它的能力,它相当便宜。
所以像这样的指令MOV AX,[BX + SI]
(我在这里使用英特尔语法)加载AX
与存储在通过添加计算出的地址处的 16 位值BX
and SI
。指令LEA AX,[BX + SI]
loads AX
通过添加计算出的地址BX
and SI
。换句话说,LEA 指令处理内存操作数的方式与其他指令不同。它不是对内存操作数指示的地址处的内存进行操作,而是直接使用计算出的地址作为操作数。两条指令使用相同的地址编码,LEA 指令只是调整内存操作数的解释方式。
换句话说,LEA 之所以这样称呼,是因为这正是它的作用。它将内存操作数给出的有效地址加载到目标寄存器中。由于内存操作数实际上并不用作内存操作数,因此它实际上像普通算术指令一样工作。如果ADD是加法运算指令,那么LEA就是有效地址运算指令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)