位运算
1.算术移位指令
指令格式:SAL/SAR Reg/Mem, CL/Imm
左边的操作数可以使寄存器或内存,右边的操作数可以是寄存器cl或立即数
SAL(Shift Arithmetic Left): 算术左移
SAR(Shift Arithmetic Right): 算术右移
1)算术左移
左移一位,最高位存入cf,最低位补0;
例如:10000001左移一位 ->00000010
mov eax,0x81
sal eax,1
结果:
eax=0x02,cf=1
2)算术右移
右移一位,最高位补符号位,最低位存入cf
例如:10000001右移一位 ->11000000
mov eax,0x81
sar eax,1
结果:
eax=0xc0,cf=1
2.逻辑移位指令
指令格式:SHL/SHR Reg/Mem, CL/Imm
SHL(Shift Left): 逻辑左移
SHR(Shift Right): 逻辑右移
shl逻辑左移:最高位存入cf最低位补0;
shr逻辑右移:最低位存入cf,最高位补0;
3.循环移位指令
指令格式:ROL r/m, i8 ROR r/m, CL
ROL(Rotate Left): 循环左移
ROR(Rotate Right): 循环右移
循环左移rol:最高位的值拿出来放到最低位,cf放最后拿出来的那个值
循环右移ror:最低位拿出来放最高位,cf放最后拿出来的值
4.带进位循环移位指令
指令格式:RCL r/m, i8 RCR r/m, CL
RCL(Rotate through Carry Left): 带进位循环左移
RCR(Rotate through Carry Right): 带进位循环右移
相当于把cf算进循环移位指令里;
带进位循环左移rcl:将最高位放入cf里,将cf中的值放入最低位;
带进位循环右移rcr:最低位放入cf,cf的值放入最高位;
5.c语言中的位运算
与运算 &
或运算 or
非运算 |
异或运算 ^
移位运算 << >>
1)操作位