LEA和MOV的指令导致相同的结果 - 为什么?

时间:2015-12-17 23:43:34

标签: assembly instructions

出于测试目的,我编写了一些x86汇编代码:

void FixedUpdate()
{
    kickTimer += Time.fixedDeltaTime;
    if (kickTimer > nextKick) {
        rb.AddForce (transform.up * thrust, ForceMode.Impulse);
    }
    if (kickTimer > nextKick + 1) {
        rb.AddForce (-transform.up * thrust, ForceMode.Impulse);
        kickTimer = 0;
        nextKick = Random.Range (MinKickTime, MaxKickTime);
    }
} 

我换了一行并写道:

lea  ebx, [esi]

并且程序完全相同。为什么呢?

esi 中,存储了字符串的地址。在第一行,我存储了字符串地址的地址,对吧?在2行中,它应该只存储字符串的地址。

Here,Amit Singh Tomar写道

mov  ebx, esi

当我阅读并将其应用于我的案例时,我有点困惑。

编辑: 我也尝试将上面的两行转换为伪C代码,它看起来像这样(我假设ebx和esi是指针):

 mov eax ,var == lea eax [var]

但这不一样,对吗?

2 个答案:

答案 0 :(得分:2)

在最初的8088/8086中,我认为没有任何区别,我想知道同样的问题。也许一个字节缩短了一个字节或者在一个较少的循环中执行。

然而,自80386以来,扩展了有效寻址模式。

mov  ebx, 8[esi*4]

有了它,lea显着更有用,因为没有单指令方式

mov  ebx, 8+ esi * 4      // illegal

但是,这非常有用和有用:

lea  ebx, 8[esi * 4]      // useful and legal

答案 1 :(得分:1)

您对伪C的翻译是正确的(假设JBoss Tools高于显示的代码)。你没有意识到的是,再次在伪C中,

unknownType *esi;

用于所有有效指针&(*x) == x 。你有获取字符串地址的地址;你只取了字符串的地址。