首先,我通过movl 12(%ebp) %edx.
为什么leal (%edx, %edx, 2) , %edx
= edx = 3*y
答案 0 :(得分:4)
LEA
是“加载有效地址”的缩写。 (在AT&amp; T语法中,对于32位操作数,它拼写为“leal”。)基本上,它根据括号中的内容计算它所计算的地址,而不是读取或写入内存,而是指定地址本身< / em>到目标操作数。
它通常用于进行地址计算,但通常用于通过假定数字乘以某些整数常量(3,5和9)来表示地址。 (地址 只是数字,所以它一点也不困难。)
答案 1 :(得分:2)
字面翻译,它是“将有效地址EDX + EDX * 2加载到EDX中”。
80x86具有一些相对强大的寻址模式。例如,“movl(%edx,%edx,2),%edx”将“加载到有效地址EDX + EDX&lt;&lt; 1到EDX”的值。 LEA指令允许将这种相对强大的寻址电路回收并用于其他目的。
你的一些困惑很可能是由AT&amp; T语法引起的 - 写地址的方式远非自然。为了比较;对于英特尔语法,它会更清晰(例如“lea edx,[edx + edx * 2]”)。