逻辑指令: 逻辑运算指令 AND、OR、NOT、XOR、TEST 移位指令 SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR
1 逻辑指令: • 逻辑运算指令 AND、OR、NOT、XOR、TEST • 移位指令 SHL、SHR 、 SAL 、SAR、ROL、ROR、RCL、RCR
罗辑非指令: NOT OPR OPR不能为立即数 执行操作:(OPR)←-(OPR) *不影响标志位 逻辑与指令: AND DST,SRC 执行操作:(DST)←(DsT)∧(SRC) 逻辑或指令: OR DST,SRC 执行操作:(DST)←(DST)v(SRC) CF OF SF ZF PF AF 异或指令: XOR DST,SRC 无定义 执行操作:(DST)←(DST)V(SRC) 根据运算结果设置 测试指令: TEST OPR1,OPR2 执行操作:(OPR1)∧(OPR2)
2 逻辑非指令:NOT OPR * OPR 不能为立即数 执行操作: ( OPR ) ( OPR ) * 不影响标志位 逻辑与指令:AND DST , SRC 执行操作: ( DST ) ( DST ) ( SRC ) 逻辑或指令:OR DST , SRC 执行操作: ( DST ) ( DST ) ( SRC ) 异或指令: XOR DST , SRC 执行操作: ( DST ) ( DST ) ( SRC ) 测试指令: TEST OPR1 , OPR2 执行操作: ( OPR1 ) ( OPR2 ) CF OF SF ZF PF AF 0 0 * * * 无定义 根据运算结果设置 • 逻辑运算指令
水*水水水水 AND AL OFCH AND11111100 例:置AL的第5位为1 水*****水 OR AL 20H OR00100000 例:使AL的第0、1位变反 XOR00000011 XOR AL 3 例:测试某些位是0是1 TEST AL JZ EVEN
3 例:屏蔽AL 的第 0、1 两位 AND AL , 0FCH 例:置AL 的第 5 位为 1 OR AL , 20H 例:使AL 的第 0、1 位变反 XOR AL , 3 例:测试某些位是0 是 1 TEST AL , 1 JZ EVEN * * * * * * * * OR 0 0 1 0 0 0 0 0 * * 1 * * * * * * * * * * * * * XOR 0 0 0 0 0 0 1 1 * * * * * * * * * * * * * * * * AND 1 1 1 1 1 1 0 0 * * * * * * 0 0
多位指 逻辑左移 SHL OPR,CNT CF 逻辑右移 SHR OPR,CNT CF 算术左移 SAL OPR,CNT(同逻辑左移) 算术右移 SAR OPR、CNT CF
4 逻辑左移 SHL OPR , CNT 逻辑右移 SHR OPR , CNT 算术左移 SAL OPR , CNT(同逻辑左移) 算术右移 SAR OPR , CNT CF 0 • 移位指令 0 CF CF
循环右移 ROR OPR,CNT CF 带进位循环左移 RCL OPR,CNT 带进位循环右移 RCR OPR,CNT 5
5 循环左移 ROL OPR , CNT 循环右移 ROR OPR , CNT 带进位循环左移 RCL OPR , CNT 带进位循环右移 RCR OPR , CNT CF CF CF CF
OPR可用除立即数以外的任何寻址方式 CNT=1, SHL OPR CNT>I, MOV CL CNT SHL OPR,CL以SHL为例 条件标志位: CF=移入的数值 1CNT=1时,最高有效位的值发生变化 OF 0CNT=1时,最高有效位的值不变 移位指令: SF、ZF、PF根据移位结果设置,AF无定义 循环移位指令: 不影响SF、ZF、PF、AF
6 注意: * OPR 可用除立即数以外的任何寻址方式 * CNT = 1, SHL OPR , 1 CNT > 1, MOV CL , CNT SHL OPR , CL ; 以 SHL 为例 * 条件标志位: CF = 移入的数值 1 CNT = 1 时,最高有效位的值发生变化 0 CNT = 1 时,最高有效位的值不变 移位指令: SF、ZF、PF 根据移位结果设置,AF 无定义 循环移位指令: 不影响 SF、ZF、PF、AF OF =
(AX)=0012H,(Bx)=0034 把它们装配成(AX)=1234H MOV CL 8 ROL AX CL ADD AX. BX 例:(BX)=84FOH (1)(BX)为无符号数,求(BX)/2 SHR BX 1 (BX)=4278H (2)(BX)为带符号数,求(BX)/2 SAR BX (BX)=0C278H 7
7 例:( AX ) = 0012H,( BX ) = 0034H, 把它们装配成 ( AX ) = 1234H 例:( BX ) = 84F0H (1) ( BX ) 为无符号数,求 ( BX ) / 2 SHR BX , 1 ; (BX) = 4278H (2) ( BX ) 为带符号数,求 ( BX ) / 2 SAR BX , 1 ; (BX) = 0C278H MOV CL, 8 ROL AX, CL ADD AX, BX
(BX)=84F0H,把(BX)中的16位数每4位压入堆 MOV CH 4 循环次数 MOV CL 4 ;移位次数 NEXT: ROL BX CL MOV AX BX AND AX OFH 00000←(SP) PUSH AX 000F DEC CH 0004 JNZ NEXT 0008
8 MOV CH , 4 ; 循环次数 MOV CL , 4 ; 移位次数 NEXT: ROL BX , CL MOV AX , BX AND AX , 0FH PUSH AX DEC CH JNZ NEXT 0008 0004 000F 0000 ( SP ) (3) ( BX ) = 84F0H,把( BX ) 中的 16 位数每 4 位压入堆栈
串处理指 设置方向标志指令 CLD、STD 。串处理指令 串重复前缀 MOVSB/ MOVSW REP STOSB STOSW REPE/ REPZ LODSB/ LODS W REPNE/ REPNZ CMPSB/ CMPSW SCASB/ SCASW
9 串处理指令: • 设置方向标志指令 CLD、STD • 串处理指令 • 串重复前缀 MOVSB / MOVSW REP STOSB / STOSW REPE / REPZ LODSB / LODSW REPNE / REPNZ CMPSB / CMPSW SCASB / SCASW
REP配合工作的MOVS/STOS/LODS REP MOVS/ STOS/ LODS 执行操作 (1)如(CX)=0则退出REP,否则转(2) (2)(CX)←(CX)-1 (3)执行MOVS/STOs/LODs (4)重复(1)~(3)
10 与 REP 配合工作的 MOVS / STOS / LODS REP MOVS / STOS / LODS 执行操作: (1) 如 ( CX ) = 0 则退出 REP,否则转(2) (2) ( CX ) ( CX ) - 1 (3) 执行 MOVS / STOS / LODS (4) 重复 (1) ~ (3)