【问题标题】:assembly leal and movl difference [duplicate]装配 leal 和 movl 的区别[重复]
【发布时间】:2012-11-11 02:38:51
【问题描述】:
leal(%eax,%ecx,4), %edx

当我阅读我的计算机系统书籍时, 如果存在 $eax 包含 x 值且 %ecx 包含 y 的前提, 那么上面的意思是,x+4y 放入 %edx。

如果是的话

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

,那不就是上面的leal表达式吗?

据我所知,leal创建的地址可以被引用,而不是像movl那样自己引用,而是

当我看到leal(%eax,%ecx,4), %edx 等于将x+4y 放入edx 寄存器时, 然后没有t it mean that it 'referenced'%eaxand%ecx` 并提取值 x 和 y 用于计算??

  • “()”不是表示“引用”吗??

【问题讨论】:

  • 那我能问你点事吗?如果 %eax 的整数值不是地址怎么办?那么如果它是leal,会发生错误吗?虽然对movl没关系?
  • leal 不知道它是否是地址,它只是计算一个值。另一方面,movl 会尝试从地址中读取一个值,并且会注意到它是否无效(不可访问)。

标签: assembly x86 att


【解决方案1】:

LEA 将地址计算生成的有效地址加载到寄存器中。 MOV 将某些东西移动到某处,当使用 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

【讨论】:

  • 但是,不管是movl还是leal,%eax+%ecx*4本身就是地址,对吧? :)
  • 所以不同的是,是否“引用”地址“%eax+%ecx*4”???
  • 区别在于地址是取消引用,还是按原样作为值使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2015-10-18
  • 2014-08-16
  • 2019-06-24
相关资源
最近更新 更多