算术运算和逻辑运算的汇编语言指令地址运算指令:leaq由于X8664位系统中地址为64位,所以以q为后缀的源操作数一般为四元组,类似于寻址方式用于计算地址表达式。目标操作数一般是一个寄存器,用来存放地址表达式运算的结果。使用地址算术指令进行优化。因为乘法对于处理器来说是非常耗时的,加减移位运算的速度远高于乘除3.总结:(1)lea和mov指令的区别:mov指令把存储的值在计算出的地址写入目标寄存器;lea只是计算地址,然后将地址赋值给目标操作数,即lea不会进行任何内存访问(2)lea在编译器的使用过程中不进行内存访问,因此可以用于算术运算,并且可以模拟变量和常量之间的运算。双指令数运算单操作数指令算术运算示例。第一条指令为什么用leap而不是addp:add指令是一个有两个操作数的指令,结果必须覆盖一个操作数,后面会用到x和y;lea地址操作指令可以完成多个寄存器之间的操作。它不仅执行运算,而且在不破坏原寄存器值的情况下,将相加结果放入新的寄存器中。第二条指令为什么用add:t1只用到这一次,覆盖是合理的,减少寄存器个数多对多,可能多对一。语句顺序不一定相同,但运行结果保证相同。不要认为声明变量会浪费系统内存。编译器可以合理分配寄存器,让局部变量优先存放在寄存器中。(由于寄存器的速度比内存快很多,可以直接参与寄存器中的运算,而内存中的运算要转交给CPU才能进行,所以编译器优先考虑toputlocalvariablesintheregister)logicoperationinstancemaskvariable汇编语言指令中不存在的操作:常量计算在编译阶段完成。涉及的计算都是常量,不涉及任何变量。这样一个计算过程,编译器在编译阶段就已经完成了。最后,目标寄存器的高32位会被清零(64位处理器在设计数据通路时会采用这种方式来兼容32位处理器)。掩码值为8185,高32位全为0,参与AND运算得到的结果高32位也必须为0,所以使用32位指令不影响结果。关注公众号,让我们一起努力
