文章目录
- 一、逻辑运算指令
- (一)各逻辑运算指令格式及操作
- (1)逻辑非指令 NOT
- (2)逻辑与指令 AND
- (3)逻辑或指令 OR
- (4)异或指令 XOR
- (5)测试指令 TEST
- (二)应用实例
- 二、移位指令
- (一)算术移位指令
- (1)算术左移指令 SAL
- (2)算术右移指令 SAR
- (二)逻辑移位指令
- (1)逻辑左移指令 SHL
- (2)逻辑右移指令 SHR
- (三)循环移位指令
- (1)循环左移指令 ROL
- (2)循环右移指令 ROR
- (3)带进位的循环左移指令 RCL
- (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
参考文章
汇编语言-移位指令