出于测试目的,我编写了一些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]
但这不一样,对吗?
答案 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
。你有不获取字符串地址的地址;你只取了字符串的地址。