文章目录
- 一、逻辑运算指令
-
- (一)各逻辑运算指令格式及操作
-
- [(1)逻辑非指令 NOT](#(1)逻辑非指令 NOT)
- [(2)逻辑与指令 AND](#(2)逻辑与指令 AND)
- [(3)逻辑或指令 OR](#(3)逻辑或指令 OR)
- [(4)异或指令 XOR](#(4)异或指令 XOR)
- [(5)测试指令 TEST](#(5)测试指令 TEST)
- (二)应用实例
- 二、移位指令
-
- (一)算术移位指令
-
- [(1)算术左移指令 SAL](#(1)算术左移指令 SAL)
- [(2)算术右移指令 SAR](#(2)算术右移指令 SAR)
- (二)逻辑移位指令
-
- [(1)逻辑左移指令 SHL](#(1)逻辑左移指令 SHL)
- [(2)逻辑右移指令 SHR](#(2)逻辑右移指令 SHR)
- (三)循环移位指令
-
- [(1)循环左移指令 ROL](#(1)循环左移指令 ROL)
- [(2)循环右移指令 ROR](#(2)循环右移指令 ROR)
- [(3)带进位的循环左移指令 RCL](#(3)带进位的循环左移指令 RCL)
- [(4)带进位的循环右移指令 RCR](#(4)带进位的循环右移指令 RCR)
- (四)使用注意事项
一、逻辑运算指令
- OPR不能为立即数
- 至少有一个数在寄存器中,NOT 除外,源操作数是立即数除外
- NOT 不影响标志位,其他使 CF=0、OF=0,AF 无定义
- 可用标志位:SF、ZF、PF
(一)各逻辑运算指令格式及操作
(1)逻辑非指令 NOT
- 格式 :
NOT OPR
- 执行的操作 :
(OPR) ← ¬(OPR)
(2)逻辑与指令 AND
- 格式 :
AND DST,SRO
- 执行的操作 :
(DST) ← (DST)∩(SRC)
(3)逻辑或指令 OR
- 格式 :
OR DST,SRO
- 执行的操作 :
(DST) ← (DST)∪(SRC)
(4)异或指令 XOR
- 格式 :
XOR DST,SRO
- 执行的操作 :
(DST) ← (DST)⊕(SRC)
(5)测试指令 TEST
- 格式 :
TEST OPR1,OPR2
- 执行的操作 :
(OPR1)∩(OPR2)
TEST 指令与AND运算的工作原理相同,但与AND指令不同的是,它不会更改第一个操作数。因此,如果我们需要检查寄存器中的数字是偶数还是奇数,我们也可以使用TEST指令执行此操作,而无需更改原始数字(TEST 相当于与操作但不保存结果)
(二)应用实例
二、移位指令
- 进位 CF 始终是最后被移出的一位,AF 位无定义
- 溢出 OF 只有移 1 位最高位改变时设置
- 循环移动只影响 CF 和 OF
- 其他移动还影响 SF、ZF、PF
(一)算术移位指令
(1)算术左移指令 SAL
-
格式 :
SAL OPR,CNT
-
执行的操作
(2)算术右移指令 SAR
-
格式 :
SAR OPR,CNT
-
执行的操作
(二)逻辑移位指令
(1)逻辑左移指令 SHL
-
格式 :
SHL OPR,CNT
-
执行的操作
(2)逻辑右移指令 SHR
-
格式 :
SHR OPR,CNT
-
执行的操作
(三)循环移位指令
(1)循环左移指令 ROL
-
格式 :
ROL OPR,CNT
-
执行的操作
(2)循环右移指令 ROR
-
格式 :
ROR OPR,CNT
-
执行的操作
(3)带进位的循环左移指令 RCL
-
格式 :
RCL OPR,CNT
-
执行的操作
(4)带进位的循环右移指令 RCR
-
格式 :
RCR OPR,CNT
-
执行的操作
(四)使用注意事项
-
OPR
可用除立即数以外的任何寻址方式 -
针对
CNT
的不同数值执行的操作 (以 SHL 为例)- CNT = 1 时 ➡️
SHL OPR,1
- CNT > 1 时 ➡️
MOV CL,CNT
,SHL OPR,CL
- CNT = 1 时 ➡️
-
条件标志位
- CF = 移入的数值
- CNT = 1 时,最高有效位的值发生变化 ➡️ OF = 1
CNT = 1 时,最高有效位的值不变 ➡️ OF = 0
-
移位指令
SF、ZF、PF 根据移位结果设置,AF无定义
-
循环移位指令
不影响 SF、ZF、PF(奇偶)、AF
参考文章