逻辑运算指令
-
与指令 格式 : AND 目的操作数 , 源操作数
-
或指令 格式 : OR 目的操作数 ,源操作数
- 用于 组合 某个字 或者 将某位 置一 操作
- 组合 操作:BCD 码 转换成 ASCII 码 :
- MOV AX ,03H
- OR AX ,30 H
- 最后 AX 中的值为 33H 完成了 30 和 03 的组合
-
非指令 格式 : NOT 目的操作数
- 是按位取反 ,不是去反码 ,对于符号位也要取反
- 不影响标志位
-
异或指令 格式 : XOR 目的操作数 ,源操作数
- 相同为零 ,不同为 一
- 按位取反 :与 1 相 异或 操作,按位取反
- 寄存器 清零:与 自身 相异或 ,清零操作
-
测试指令 格式 : TEST 目的操作数 ,源操作数
- 不送回结果,只根据结果置标志位
- 主要用来检测目的操作数的某些位是 0 / 1 根据测试结果,决定转向
-
注意
- 除了非指令 全部指令都使 CF(进位标志位) ,OF(溢出标志位) 为 0
- AND 指令可以是某一位请 0
- OR 指令可以使某一位置 1
- NOT 指令不影响标志位 ,
- XOR 指令可以使某些位不变,某些位取反
- TEST 指令用于测试某一位是否为0 还是 1(源操作数与目的操作数 相与 操作但不会返回结果,相与操作数后标志寄存器就会产生变化)
例题
- 写出可以使 AX 清零的指令
- MOV AX ,0 ;不影响 CF 位
- SUB AX ,AX ;CF = 0
- XOR AX ,AX ;CF = 0
- AND AX ,0 ;CF = 0
- 移位指令
- 格式 :指令 目的操作数 , 源操作数
- 移位次数为 1 ,直接写在指令中,若大于一次,则由CL 寄存器间接给出
- 左移操作 :数值 * 2
- 右移操作 :数值 / 2
- 非循环移位指令
- 算数左移(与逻辑左移一样) SAL 最高位进入 CF 标志位,最低位补 0
- 算术右移 SAR 最低位进入 CF 标志位 ,符号位(最高位)不变
- 逻辑左移(与算数左移一样) SHL 最高位进入 CF 标志位,最低位补 0
- 逻辑右移 SHR 最低位进入 CF 标志位 ,最高位补 0
- 循环移位指令
-
循环左移 ROL 最高位进入 CF 标志位,在转回最低位
-
-
循环右移 ROR 最低位进入 CF 标志位,再转回到 最高位
-
带进位的循环左移 RCL 将 CF 标志位,再转回到最低位
-
!
-
带进位的循环右移 RCR 将最低位给 CF 标志位
-
- 记忆
- 左 / 右 :L / R
- 逻辑运算 / 算数运算 : SH / SA
- 循环 使用到 CF 运算 中间为:C
- 循环 未使用到 CF 运算 中间为 O
- 所有的 情况
- SHL / SHR : 逻辑左移 / 右移
- SAL / SAR :算数左移 / 右移
- ROL / ROR :不带进位循环左移 / 右移
/ 右移 - SAL / SAR :算数左移 / 右移
- ROL / ROR :不带进位循环左移 / 右移
- RCL / RCR :带进位的循环左移 / 右移