位操作指令
逻辑运算指令
计算机中最基本的数据单位是二进制位,针对二进制位进行操作、实现位控制的指令叫做位操作指令。
- 逻辑运算指令
- 移位指令
- 循环移位指定
- …
进行一位或者若干位处理,采用位操作类指令
以下操作指令中除了NOT指令不影响标志外,其他逻辑指令均会使得OF=CF=0
ZF、SF和PF标志位还是根据运算结果设置
逻辑与指令AND
按位求与
AND reg,imm/reg/mem;reg<--reg^imm/reg/mem
AND mem,imm/reg;mem<--imm/reg
逻辑或指令OR
按位取或
操作数的类型与AND一致
逻辑非指令NOT
按位取反
NOT reg/mem;reg/mem<--reg/mem
需要注意NOT不影响状态标志位
逻辑异或指令XOR
按位异或
操作数的类型与AND一致
操作符的一些用法
AND可以用来指定某些位清零,将对应位与0相与一定为0,其他位设为1不影响其状态
OR可以用来置1,与1相或一定为1,与0相或不影响原来的状态
XOR可以用来求反,与1异或一定位原来相反的状态,与0异或不会发生改变
一个例子是可以用来转换字母的大小写:
大写 = 小写 AND DFH
小写 = 大写 OR 20H
测试指令TEST
移位指令
逻辑左移指令SHL
SHL reg/mem, 1/CL
各位同时左移,最低为补零,最高位进入CF
左边的操作数是待移位的数据,右边可以是一个数字或者CL寄存器
移位后的操作数还放在待移位数据中
逻辑右移指令SHR
操作数据类型与SHL一样
各位同时右移,最高位补零,最低位进入CF
算术左移指令SAL
SAL reg/mem, 1/CL
等同于SHL指令,而这用法效果一致
算术右移指令SAR
操作数据类型与SHL一样
各位同时右移,最高位补符号位,最低位进入CF
循环移位指令
不带进位循环左移指令ROL
ROL reg/mem,1/CL
各位同时左移,最高位循环进入最低位和CF
不带进位循环右移指令ROR
同ROL指令格式一样,最低位循环进入最高位和CF
带进位循环左移指令RCL
CF作为附加位,各位同时左移,CF进入最低位,移出的位进入CF,相当于寄存器加上CF构成了一个圈
带进位循环右移指令RCR
同RCL,不过是向右移
64位数据移位操作
逻辑右移
可以先将高三十二位逻辑右移,高位补零,低位进入CF中,然后低三十二位带进位循环右移,CF进入最高位,最低为数据进入CF,从而实现六十四位的逻辑右移
算术右移
只需要把上一步的逻辑右移改为算术右移即可
左移反转一下即可
ASCII码转BCD码
ASCII码加减30H就变为了BCD码,BCD码四位组合成为压缩BCD码
上图中先把ascii的33H移到al八位,然后与0f相与,即令高四位为0,低四位不变,现在al中是03H,然后令ascii+1即38H搞到了ah八位中,令其逻辑左移四位,低四位变为0,现在ah中为80H,最后al与ah相或结果放到al中,相或就是置位,由于两个寄存器高四位低四位分别为0,因此就是将他们合在了一起变味了83H送到了al,最后送到了bcd中