逻辑运算和移位指令
这组指令包括逻辑运算﹑移位和循环移位指令三部分。逻辑运算指令除指令NOT外,均有两个操作数。移位和循环移位指令只有一个操作数。关于这组指令有如下几点通用说明,清予以注意:
1. 如果指令有两个操作数,那么这两个操作数也可如图2.16所示结合。但最多只能有一个为储存器操作数。
2. 只有通用寄存器或存储器操作数可作为目的操作数,用于存放运算结果。
3. 如果只有一个操作数,则该操作数既是源又是目的。
4. 操作数可以是字节,也可以是字。但如果有两个操作数,则它们的类型必须一致,即同时为字节,或同时为字。
5. 对于储存器操作数可采用2.3节中介绍的四种存储器操作数寻址方式。
1. 逻辑运算指令
1) 否操作指令NOT
否操作指令的格式如下;
NOT OPRD
这条指令把操作数OPRD取反,然后送回OPRD。
例如:
NOT AX
操作数OPRD 可以是通用寄存器,也可以是存储器操作数。此指令对标志没有影响。
2) 与操作指令AND
与操作指令的格式如下:
AND OPRD1, OPRD2
这条指令对两个操作数进行按位的逻辑“与”运算,结果送到目的操作数OPRD1
例如:
AND DH, DH
AND AX,ES:[SI]
该指令执行以后,标志CF=0,标志OF=0,标志PF﹑ZF﹑SF反映运算结果,标志AF未定义。
某个操作数自己与自己相 “与”,则值不变,但可使进位标志CF清0。与操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位清为0的场合。把要维持不变的这些位与“1”相“与”,而把要清为0的这些位与“0”相“与”就能达到这样的目的。
例如:
MOV AL,34H ;AL=34H
AND AL,0FH ;AL=04H
3) 或操作指令OR
或操作指令的格式如下:
OR OPRD1,OPRD2
这条指令对两个操作数进行按位的逻辑“或”运算,结果送到目的操作数OPRD1。
例如;
OR AX,8080H
OR CL,AL
OR [BX—3],AX
OR指令执行以后,标志CF=0,标志OF=0,标志PF﹑ZF﹑SF反映运算结果,标志AF未定义。
某个操作数自己与自己相“或”,则值不变,但可使进位标志CF清0,或操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位置为1的场合。把要维持不变的这些位与“0”相“或”,而把要置为1的这些位与“1”相“或”就能达到这样的目的。
例如:
MOV AL,41H ;AL=01000001B,B表示二进制
OR AL,20H ;AL-01100001B
4)异或操作指令XOR
异或指令的格式如下:
XOR OPRD1, OPRD2
这条指令对两个操作数进行按位的逻辑“异或”运算,结果送到目的操作数OPRD1。该指令执行以后,标志CF=0,标志OF=0,标志PF﹑ZF﹑SF反映运算结果,标志AF未定义。
某个操作数自己与自己相“异或”,则结果为0,并可使进位标志CF清0。例如:
XOR DX,DC ;DX=0, CF=0
异或操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位置取反的场合。把要维持不变的这些位与“0”相“异或”,而把要取反的这些位与“1”相“异或”就能达到这样的目的。例如:
MOV AL,34H ;AL=00110100B,符号B表示二进制
XOR AL,0FH ;AL=00111011B
5)测试指令TEST
测试指令的格式如下:
TEST OPRD1, OPRD2
这条指令和指令AND类似,也把两个操作数进行按位“与”,但结果不送到操作数OPRD1,仅仅影响标志。该指令执行以后,标志ZF﹑PF和SF反映运算结果,标志CF和OF被清0。
该指令通常用于检测某些位是否为1,但又不希望改变原操作数值的场合。例如要检查AL中的位6或位2是否有一位为1,可使用如下的指令:
TEST AL,01000100B; 符号B表示二进制
如果位6和位2全为0,那么在执行上面的指令后,ZF被置1,否则Z
被清0。
2. 一般移位指令
8086/8088有三条一般移位指令:算术左移/逻辑左移指令,算术右移指令,逻辑右移指令。这三条指令的一般格式如下:
SAL OPRD,m ;算术左移指令(同逻辑左移指令)
SHL OPRD,m ;逻辑左移指令
SAR OPRD,m, ;算术右移指令
SHR OPRD,m ; 逻辑右移指令
其中,m是移位位数,或为1或为CL,当要移多个位时,移位位数需存放在CL寄存器中。操作数OPRD可以是通用寄存器,也可以是存储器操作数。
1)算术左移或逻辑左移指令SAL/SHL(Shift Arithmetic Left 或Shift logic left)
算术左移或逻辑左移进行相同的动作,尽管为了方便提供有两个助记符,但只有一条机器指令。具体格式如下:
SHL OPRD,m 或者
SHL OPRD,m
算术左移SAL/逻辑左移SHL指令把操作数OPRD左移m位,每移动一位,右边用0补足一位,移出的最高位进入标志位CF。如图2。18(a)所示。
下面的程序片段用于说明该指令的使用及其对标志位的影响,安排的注释给出了指令执行完后的操作数值和受影响的标志变化情况。
MOV AL,8CH ;AL=8CH
SHL AL,1 ;AL=18H,CF=1,PF=1ZF=0,SF=0,OF=1
MOV CL,6 ;CL=6
SHL AL,CL ;AL=0,CF=0,PF=1,ZF=1,SF=0,OF=0
只要左移以后的结果未超出一个字节或一个字的表达范围,那么每左移一次,原操作数每一位的权增加了一倍,也即相当于原数乘2。下面的程序片段实现把寄存器AL中的内容(设为无符号数)乘10,结果存放在AX中。
XOR AH,AH ;(AH)=0
SHL AX,1 ;2X
MOV BX,AX ;暂存2X
SHL AX,1 ;4X
SHL AX,1 ;8X
ADD AX,BX ;8X 2X
CF 最高有效位 操作数 最低有效位
(a)逻辑左移/算术左移
最高有效位 操作数 最低有效位 CF
(b)算术右移
最高有效位 操作数 最低有效位 CF
0
(C) 逻辑右移
图2.17 移位指令示意图
2) 算术右移指令SAR(Shift A rithmetic Right)
算术右移指令的格式如下:
SAR OPRD,m
该指令使操作数右移m位,同时每移一位,左边的符号位保持不变,移出的最低位进入标志位CF。如图2.17(b)所示。
例如:
SAR AL,1
SAR BX,CL
对于有符号数和无符号数而言,算术右移一位相当于除以2。
3) 逻辑右移指令SHR(Shift logic Right)
逻辑右移指令的格式如下:
SHR OPRD,m
该指令使操作右移m位,同时每移一位,左边用0补足,移出的最低位进入标志位CF。如图2.17(c)所示。例如:
SHR BL,1
SHR AX,CL
对于无符号数而言,逻辑右移一位相当于除以2。
在汇编语言程序设计中,经常需要对以位为单位的数据进行合并和分解处理。一般通过移位指令和逻辑运算指令进行这种数据的合并和分解处理。
例,假设DATA1和DATA2各长4位,分别存放在AL寄存器的低4位和高4位中,现要把它们分别存放到BL寄存器和BH寄存器的低4位中。
下面的程序片段能实现上述要求:
……
MOV BL,AL
AND LB,0FH ;得DATA1
MOV AH,AL ;得DATA2
MOV CL,4
SHR BH,CL
……
3. 循环移位指令
8086/8088有四条循环移位指令:左循环移位指令ROL(Rotate Left ),右循环移位指令ROR(Rotate Right)。带进位左循环移位指令RCL(Rotate Left through CF),带进位右循环移位指令RCR(Rotate Right through CF)。这些指令可以一次只移一位,也可以一次移多位。如移多位,那么移位次数存放在CL寄存器中。
这些指令的格式如下:
ROL OPRD,m
ROR OPRD,m
RCL OPRD,m
RCR OPRD,m
其中,m是移位次数,或为1或为CL。操作数OPRD可以是通用寄存器,也可以是存储器操作数。
前两条循环指令没有把进位标志位CF包含在循环的环中;后两条循环指令把进位标志CF包含在循环的环中,即作为整个循环的一部分。四条循环指令的操作如图2.18所示。
CF 最高有效位 操作数 最低有效位
(a)左循环移位指令ROL
(b)右循环移位指令ROR
(c)带进位右循环移位指令RCR
(d) 带进位右循环移位指令RCR
图2.18循环移位指令示意图
这些指令只影响标志CF和OF。
左循环移位指令ROL,它每移位一次,操作数左移,其最高位移入最低位,同时最高位也移入进位标志CF。
右循环移位指令ROR,它每移位一次,操作数右移,其最低位移入最高位,同时最低位也移入进位标志CF。
带进位左循环移位指令RCL,它每移位一次,操作数左移,其最高位移入进位标志CF,CF移入最低位。
带进位右循环移位指令RCL,它每移位一次,操作数右移,其最低位移入进位标志CF,CF移入最高位。
对于不带进位的循环移位指令而言,如果操作数是8位,那么在移位8次后,操作数就能复原;如果操作是16位,那么在移位16次后,操作数就能复原。对于带进位的循环移位指令而言,如果操作数是8位,那么在移位9次后,操作就能复原;如果操作时16位,那么在移位17次后,操作就能复原。例如:
MOV CL,9
RCR AL,CL
通过带进位循环移位指令和其他移位指令的结合,可以实现两个或多个操作数的重新结合。
例,下面的程序片段实现把AL的高4位与低4位交换:
ROL AL,1
ROL AL,1
ROL AL,1
ROL AL,1
例,下面的程序片段实现把AL的最低位送入BL的最低位,仍保持AL不变:
ROR BL,1
ROR AL,1
RCL BL,1
ROL AL,1
例,设DATA1存放在AL的低4位,DATA2存放在AH的低4位,DATA3存放在SI的低4位,DATA4存放在SI的高4位。现要把这四个数据合并为16位,并存放到DX寄存器中。