1

所以首先我通过做分配edx = ymovl 12(%ebp) %edx.

为什么leal (%edx, %edx, 2) , %edx =edx = 3*y

4

2 回答 2

5

LEA是“加载有效地址”的缩写。(在 AT&T 语法中,对于 32 位操作数,它拼写为“leal”。)基本上,它采用给定括号中的内容计算的地址,而不是读取或写入内存,而是将地址本身分配给目标操作数。

它通常用于进行地址计算,但也经常用于乘以某些整数常量(3、5 和 9),假装一个数字是一个地址。(地址只是数字,所以一点也不难。)

于 2012-11-11T06:48:16.977 回答
2

直译过来就是“将有效地址EDX + EDX * 2装入EDX”。

80x86 有一些比较强大的寻址模式。例如,“movl (%edx, %edx, 2), %edx”将是“将有效地址 EDX + EDX << 1 处的值加载到 EDX 中”。LEA 指令允许这种相对强大的寻址电路被回收并用于其他目的。

您的部分困惑可能是由 AT&T 语法引起的——地址的书写方式远非自然。为了比较;对于英特尔语法,它会更清晰(例如“lea edx,[edx+edx*2]”)。

于 2012-11-11T06:49:05.847 回答