2012-11-22 17 views
2
leal(%eax,%ecx,4), %edx 

,因为我是从我的计算机系统的书,读 如果$ EAX包含x值和%ECX含有Y, 那么上面的方法可以去看场地,X + 4Y投入%EDX。装配莱亚尔和MOVL差异

然后,如果它是

movl(%eax,%ecx,4), %edx 

,然后isn`t的同一个与上述利尔表达?

据我所知,莱亚尔创建一个可以参考的,而不是由自己喜欢引用MOVL地址,但

,当我看到leal(%eax,%ecx,4), %edx等于把x+4yedx寄存器,然后 没有按t it mean that it 'referenced'%EAX and%ecx`和提取值x和y用于计算?

  • doesn't it“()”means'referenced'??
+0

然后我能问你一件事?如果%eax具有不是地址的整数值呢?那么如果它是leal,错误发生?虽然它对movl无关紧要? – Swen

+0

'leal'不知道它是否是一个地址,它只是计算一个值。另一方面,movl会尝试从地址中读取一个值,并会注意它是否无效(不可访问)。 –

回答

12

LEA将地址计算生成的有效地址加载到寄存器中。当使用SIB寻址作为源操作数时,它会将地址计算生成的地址移动到目标操作数中,无论是否为

所以:

leal (%eax,%ecx,4), %edx ← moves %eax+%ecx*4 into %edx 
movl (%eax,%ecx,4), %edx ← moves whatever is at address %eax+%ecx*4 into %edx 
+0

但是,无论是movl还是leal,%eax +%ecx * 4本身就是地址,对不对? :) – Swen

+0

所以区别在于,是否'参考'地址'%eax +%ecx * 4'或不? – Swen

+0

不同之处在于地址是否是_dereferenced_,或者它是否被用作值。 – ninjalj