Assembly 装配力和动压差
当我在读我的计算机系统书时, 如果存在$eax包含x值而%ecx包含y的前提, 那么上面的意思是,x+4y放入%edx 如果是的话Assembly 装配力和动压差,assembly,x86,att,Assembly,X86,Att,当我在读我的计算机系统书时, 如果存在$eax包含x值而%ecx包含y的前提, 那么上面的意思是,x+4y放入%edx 如果是的话 leal(%eax,%ecx,4), %edx ,那么与上面的leal表达式不一样吗 正如我所知,leal创建的地址可以被引用,而不是像movl那样由自身引用,而是 当我看到leal(%eax,%ecx,4),%edx等于将x+4y放入edx寄存器, 那么是否意味着它“引用了”%eax和%ecx`并提取了用于计算的值x和y “it”()不是指“reference
leal(%eax,%ecx,4), %edx
,那么与上面的leal表达式不一样吗
正如我所知,leal创建的地址可以被引用,而不是像movl那样由自身引用,而是
当我看到leal(%eax,%ecx,4),%edx
等于将x+4y
放入edx
寄存器,
那么是否意味着它“引用了”
%eax和
%ecx`并提取了用于计算的值x和y
- “it”()不是指“referenced”吗
LEA
将地址计算生成的有效地址加载到寄存器中MOV
将某物移动到某处,当使用SIB寻址作为源操作数时,它将地址计算生成的地址处的任何内容移动到目标操作数中
因此:
但是,不管是movl还是leal,%eax+%ecx*4本身就是地址,对吗?:)所以区别在于,是否“引用”地址“%eax+%ecx*4”?区别在于该地址是否被取消引用,或者它是否被用作一个值。那么我可以问你一些问题吗?如果%eax的整数值不是地址,该怎么办?那么如果它是leal,那么会发生错误吗?虽然这对movl不重要,但leal不知道它是否是地址,它只计算一个值<另一方面,code>movl将尝试从地址中读取一个值,并注意该值是否无效(无法访问)。
movl(%eax,%ecx,4), %edx
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