编程达人吧 关注:16贴子:35
  • 0回复贴,共1

3.5 移位指令

只看楼主收藏回复

本节主要内容:
1. 算数移位与逻辑移位指令
2. 循环移位指令
老唐语录:
计算机的运算指令除了ADD、SUB、ADC、SBB、OR、XOR、AND之外,总会有其他指令,比如说操作数的取反指令NOT。还有CMP指令,其实和SUB(减指令)是一样的,只是不改变目标操作数,比如SUB eax,edx是eax的值减去edx,结果放到eax里面去,影响标志位,而cmp只影响标志位,运算结果忽略,不影响eax。
我们今天来学习移位指令。
逻辑移位:
SHR AL,2向右面移两个位,如果AL值为00101010,则向右移动两位后变成00001010,简单的理解是,先移一位变成00010101,再移一位变成00001010,可移动的最大值为0x1F,如果不论输入的值为多少,结果都要与0x1F。也就是说只有低五位有效,如图3-2:
图3-2:SHR
向左移:SHL ,只要会移动一位,移动N位就明白了,移动后的结果放在目标寄存器里面,当然该操作也会改变标志寄存器中的CF,将移出来的位赋给CF;右移也是一样,凡是移出来的那个位都赋给CF,如图3-3:
图3-3:SHL
疑问:如果移动N位,哪一位赋给CF?
移动N位,相当于N次移动一位,也就是说,每移动一位,就将移出来的那一位赋给CF,移动了N位,就赋给CF位N次。所以结果很明显,就是最后移动的那一位。
当然移位指令照样影响SF位:将移动后剩下的最高位赋给SF。还要看结果是否全为零,如果全为零,ZF置1,否则置0。也影响PF位(1的奇偶性)。不影响OF位。
移位指令的源操作数只能是8位的寄存器CL或立即数(ECX中的C为counter,计数);目标操作数可以是字节/双字节/四字节,内存或寄存器。
算术移位:
算术移位和逻辑移位的区别:算术左移和逻辑左移没有区别;在右移时,高位移至低位,如果最高位补0,是逻辑移位;最高位保持不变(符号),是算术移位,如图3-4:
图3-4:SAR
SHR:逻辑右移,SH是shift,R代表right,L代表left。
SAR:算术右移,A是算术arithmetic。
除了上述四条之外,还有循环移位:
循环右移:循环右移一位,31位赋给30位,30位赋给29位……最低位同时赋给最高位和CF位,导致最高位和CF位相同。当然也影响SF,ZF,PF。如果移动五位看不懂,只需要移动一位,然后移动5次即可。
RCL和RCR:带进位的循环移位(C代表CF位):循环左移一位,将最高位给CF,CF值赋给最低位,最低位赋给次低位。
课后理解:
ROL/ROR如图3-5:
图3-5:ROL/ROR
RCL/RCR如图3-6:
图3-6:RCL/RCR
课后疑问:
C语言中移位指令的书写格式?
左移<<,右移>>。
左移只会生成SHL指令,因为SHL和SAL等效
无符号右移(>>前的数)会生成SHR,有符号数右移会生成SAR
课后总结:
算术移位涉及符号位的运算,而逻辑移位不涉及。


1楼2016-06-13 10:22回复