Assembly LEA在内部做什么?

Assembly LEA在内部做什么?,assembly,x86,Assembly,X86,说LEA指令可以用来做算术 据我所知,不是: inc eax mov ecx, 5 mul ecx mov ebx, eax 我只会写 lea ebx, [(eax + 1) * 5] LEA版本只是一条指令,而不是4条指令。然而,我不明白如果没有inc和mul,LEA是如何做算术的 LEA版本在任何方面都更快,还是LEA只是在后台运行原始指令 编辑:这个问题不是关于LEA的目的,而是它如何在内部工作 我不明白没有INC和MUL,LEA是怎么做算术的 关键是LEA只能做某些类型的算术:在计算

说LEA指令可以用来做算术

据我所知,不是:

inc eax
mov ecx, 5
mul ecx
mov ebx, eax
我只会写

lea ebx, [(eax + 1) * 5]
LEA版本只是一条指令,而不是4条指令。然而,我不明白如果没有
inc
mul
,LEA是如何做算术的

LEA版本在任何方面都更快,还是LEA只是在后台运行原始指令

编辑:这个问题不是关于LEA的目的,而是它如何在内部工作

我不明白没有INC和MUL,LEA是怎么做算术的

关键是LEA只能做某些类型的算术:在计算诸如数组访问之类的内存地址时有用的排序

可以将CPU看作是具有用于这种地址计算的专用电路,而LEA则是使用该电路的指令

您可以在中了解x86寻址模式。它显示了可以使用LEA执行的计算类型


简而言之,它是一个寄存器乘以1/2/4/8,再加上一个寄存器,再加上一个常数。使用LEA计算
(eax+1)*5
的唯一原因是它相当于
eax*4+eax+5
。例如,如果您试图计算
(eax+1)*6
,LEA将没有任何帮助,而通用的MUL和ADD仍然可以正常工作。

LEA
在内部不使用
MUL
,因为它中的所有乘法都可以通过简单的移位完成。你的“简单”方法在技术上是
leaebx[eax+eax*4+5]
。它的作用与
&array[i]完全相同。field
在C程序中的作用。换句话说,生成一个指向元素类型为struct的数组元素的指针,例如,当需要将其作为参数传递给函数时,该指针是通用的。x86指令集是在研究了语言编译器产生的机器代码之后制定的,语言编译器是第一个认为大多数代码是用高级语言而不是汇编语言编写的处理器。还制作了ebp寄存器和古怪的指令,如进入和离开。该指令由AGU实现,与ALU分离。请参阅:和。是的,LEA比4条指令快得多。请参阅和中的其他性能链接。现代Intel CPU的可能副本实际上没有用于这些地址计算的专用电路。ALU执行LEA所需的所有算法。为了让LEA在AGU(地址生成单元)上实际运行,您必须回到旧的Intel芯片(奔腾III及更早版本)或AMD K8/K10上。@CodyGray:order Atom(Silvermont之前)在实际AGU上运行LEA,比ALU更早。因此,就延迟而言,它需要更早地准备好输入,但更快地生成输出。但请注意,现代CPU确实有专用的AGU来处理加载和存储地址UOP;他们只是不把它们用于LEA。我想那是你的意思,但你的第一句话说错了。