文章目录
- 一、逻辑运算指令
- 1、逻辑‘与’指令 AND
- 2、逻辑‘或’指令 OR
- 3、逻辑“非”指令 NOT
- 4、逻辑“异或” XOR
- 5、测试指令TEST
- 二、移位指令
- 1)非循环移位
- 1、算数左移SAL和逻辑左移SHL
- 2、逻辑右移SHR
- 3、算术右移SAR
- 2)循环移位
- 1、带CF的循环左移 RCL
- 2、带CF的循环右移 RCR
- 3、不带CF的左移循环 ROL
- 4、不带CF的右移循环 ROR
- 助记
一、逻辑运算指令
1、逻辑‘与’指令 AND
指令格式:AND OPRD1,OPRD2 ;OPRD1←OPRD1^OPRD2
功能:AND指令使源操作数和目标操作数按bit位相“与”,结果送回目标操作数。AND中的“与”’特性通常可将指定位清0
常用作:
- 实现两个数 的按位与
- 使目标操作数中某些位保持不变,把其他位清‘0’
- 使操作数不变,但影响其他6个状态标志位,并使CF=OF=0
例如:
AND AX,[BX] ;AX和[BX]所指字单元的内容按位相‘与’,结果送AX
AND AL,OFH ;AL的高四位清0,第四位保持不变
AND AX,AX ;AX自身按位相与,不改变AX中的内容,但影响6个状态标志位
2、逻辑‘或’指令 OR
指令格式:OR OPRD1,OPRD2 ;OPRD1←OPRD1∨OPRD2
指令功能:OR指令实现对源操作数和目标操作数按位相“或”,结果送会目标操作数中,对应AND指令,OR指令在程序中也应用于一下方面:
- 实现对两数按位相“或”
- 使目标数某些位保持不变,将另外一些位置1。此时源操作数应这样设置:目标数哪些位需要置‘1’,就把源操作数的对应bit位设为1,其他位设为0
- 使操作数不变,但影响6个状态标志位,并使CF=OF=1
例如:
OR [BX],AL ;[BX]←[BX]∨AL,将[BX]中内容和AL中内容向“或”,结果送回[BX]单元
OR AL,20H ;将AL中的D5位置1,其余位不改变
OR AX,AX ;AX中内容不变,但影响6个状态标志位
3、逻辑“非”指令 NOT
指令格式:NOT OPRD
指令功能:NOT指令是单操作数指令,它将指定的操作数OPRD按位取反,再送回该操作数,这里可以是8位或16位的寄存器操作数,但不能是立即数。NOT指令对标志位无影响。
例如:
NOT AX ;将AX中内容按位取反,结果送回AX
NOT WORD PTR[SI] ;将[SI]所指向两个单元中的内容按位取反,再送回这两单元
4、逻辑“异或” XOR
指令格式:XOR OPRD1,OPRD2 ;OPRD1←OPRD1⊕OPRD2
指令功能:XOR是将源操作数和目的操作数按位进行“异或”,结果送回目标操作数。“异或”操作原则是:两位操作数相同时结果为0.不同时结果为1
例如:
XOR AX,1122H ;AX的内容与1122H"异或",结果送回AX中
XOR AX,AX ;使AX清零
5、测试指令TEST
TEST指令的格式及对操作数的要求和完成的操作和AND指令类似,区别是:TEST不将操作的结果送回目的操作数,而只是影响标志位,故这条指令常用于不破坏数据内容的情况下检测,数据的某些位,常搭配JC/JZ等条件转移指令使用。
TEST AL,02H ;若AL中Di位为1,则ZF=0,否则=1
二、移位指令
1)非循环移位
非循环移位分为算术移位和逻辑移位,逻辑移位针对的是无符号数,而算数移位针对的是有符号数。
1、算数左移SAL和逻辑左移SHL
指令格式:
SHL OPRD,1 SAL OPRD,1
或 SHL OPRD, CL SAL OPRD,CL
指令功能: 算数左移指令SAL和逻辑左移指令SHL的执行完全相同的操作,都是将目的操作数的内容左移一位或者CL所指定的位数,每左移一位,左边的最高位移入标志位CF,而在右边的最低位补零。
注意:当移位之后的CF和最高位状态不同时,OF标志被影响为1,表示溢出状态;
由于左移指令比乘法指令执行速度快得多,在程序中的无符号数的乘2运算用左移指令来代替乘法指令可加快程序的运行。
MOV AL,41H
SHL AL,1 ;视为有符号数时,溢出,82H > 7FH
2、逻辑右移SHR
指令格式:SHR OPRD ,1
或: SHR OPRD ,CL
指令功能:逻辑右移指令将目的操作数的内容向右移一位或者CL指定的位数,每右移一位,右边最低位移入标志位CF,最高位补0。(算术右移的不同之处)
注意:SHR指令也影响标志位CF和OF,如果移动次数为1,且移位之后最高位和次高位不相等,则标志OF=1,否则OF=0,若移动次数不固定,则OF状态不定。
和左移指令类似,每逻辑左移一位,就相当于无符号数除以2,因此可利用SHR指令加快程序中除法运算的执行。
MOV AL,82H
SHR AL,1 ;执行结果,AL=41H,CF=0,OF=1
3、算术右移SAR
指令格式:SAR OPRD,1
或 SAR OPRD,CL
指令功能:算术右移SAR指令和SHR都是右移指令,两者不同之处在于,算术右移不改变最高位(符号位)的状态,每右移一次,最高位保持原最高位的状态,其余和逻辑右移没有区别。
注意:SAR指令对CF,PF,SF,和ZF有影响,但不影响OF,AF
2)循环移位
循环移位分为带CF的循环移位RCL/RCR和不带CF的循环移位ROL/ROR
1、带CF的循环左移 RCL
指令格式:RCL OPRD,1
或 RCL OPRD ,CL
指令功能:带CF的循环左移指令RCL是将目的操作数左移一位或CL的指定位,每左移一位,最低位移入CF标记,原CF标记补入到最高位。
2、带CF的循环右移 RCR
指令格式:RCR OPRD,1
或 RCR OPRD,CL
指令功能:带CF的循环右移指令是将目的操作数右移一位或CL的指定位,每右移一位,最高位移入CF标志,原CF标志补入到最低位。
;检测BL寄存器中第4位的状态,并保持原内容不变
MOV CL,4
ROL BL,CL ;CF←BL第4位
JNC ZERO ;JNC指令在当CF标志位为0时,跳转到ZERO
ROR BL,CL ;恢复原BL的内容
3、不带CF的左移循环 ROL
指令格式:ROL OPRD, 1
或 ROL OPRD,CL
指令功能:不带CF的循环左移和带CF的循环左移指令的区别只有是否带CF标志位,不带CF的左移指令每左移一位,直接将最高位同时送入CF和最低位实现左移。
4、不带CF的右移循环 ROR
指令格式:ROR OPRD,1
或 ROR OPRD,CL
指令功能:不带CF的循环指令和带CF的循环右移指令的区别在于是否带CF标志位,不带CF标志位的右移指令每右移一次,直接将最低位直接送入CF和最高位实现右移。
注意:ROR和ROL指令移位一次,新的最高位和次高位不等,则标志位OF=1,否则OF=0;若移位次数不为1,则OF状态不定。
MOV AL,82H
ROL AL,1 ;结果:AL=05H,CF=1,OF=1
助记
SAL(Shift Arithmetic Left)
SAR(Shift Arithmetic Right)
SHL(Shift Logic Left)
SHR(Shift Logic Right)
ROL/ROR 不带CF,(稍有牵强,哈哈)
RCL/RCR 带CF
还是主张多加练习,自然就会熟练使用。记忆也是自然的事