概述
这类指令包括逻辑运算指令、移位指令和循环指令。
1.逻辑运算指令
8086/8088指令系统的逻辑运算指令有“与”(AND)、“测试”(TEST)、“或”(OR)、“异或”(XOR)和“非”(NOT)五条。
除了“非”指令对状态标志位不产生影响外,其余四条指令对状态标志位均有影响。这些指令将根据各自逻辑运算的结果影响SF、ZF和PF状态标志位,同时将CF和OF置“0”,但AF的值不确定。
(1)逻辑“与”指令
指令格式: AND DST,SRC
功 能: DST←DST∧SRC
操作说明: AND指令将目的操作数和源操作数按位进行逻辑“与”运算(即相“与”的两位均为1时结果为1,否则为0),将结果送回目的操作数。指令中目的操作数可以是寄存器或存储器,源操作数可以是立即数、寄存器或存储器。但是指令的两个操作数不能同时是存储器。
作 用: AND指令可以有选择地屏蔽某些位(有选择地清0),而保留另一些位不变。
【例2.32】 AND AL,3CH ;8位二进制分别进行与运算
AND AX,BX ;16位二进制分别进行与运算
AND DX,BUFFER[SI]
AND [DI],CX
【例2.33】 MOV AL,1011010lB ;AL=1OllOl01B
AND AL,0FH ;AL=00000101B,保留低四位,高四位清0
(2)测试指令
指令格式: TEST DST,SRC
功 能: DST ∧ SRC
操作说明: TEST指令将目的操作数和源操作数按位进行逻辑“与”运算,但逻辑运算的结果不送回目的操作数,即仅做DST∧SRC运算,两个操作数的内容均保持不变,但运算结果影响状态标志位。
作 用:TEST指令常常用于位测试,它与条件转移指令一起,共同完成对特定位状态的判断,并实现相应的程序转移。
【例2.34】 测试AL的最高位是否为零,若不为零,则转移到NEXT。
TEST AL,10000000B
JNZ NEXT
┆
NEXT: ……
(3)逻辑“或”指令
指令格式: OR DST,SRC
功 能: DST←DST∨SRC
操作说明: 将目的操作数和源操作数按位进行逻辑“或”运算(即相“或”的两位中任一位为1时结果为1,只有两位都为0时结果才为0),并将结果送回目的操作数。
作 用: OR指令操作数的类型与AND指令相同。OR指令可将寄存器或存储器中的某些特定的位设置成“1”,同时使其余位保持原来的状态不变。
【例2.35】 若将AL寄存器的最高位置“1” ,而保持其余位不变时,可用如下指令:
OR AL,10000000B ;AL←AL∨(10000000B)
(4)逻辑“异或”指令
指令格式: XOR DST,SRC
功 能: DST←DST⊕SRC
操作说明: XOR指令将目的操作数和源操作数按位进行逻辑“异或”运算(即相“异或”的两位数不相同时结果为“1”,相同时则为“0”),并将结果送回目的操作数。XOR指令操作数的类型与AND、OR指令均相同。
作 用: XOR指令可将寄存器或存储器中的某些特定的位“求反”,而使其余位保持不变。XOR指令的另一个用途是将寄存器的内容清0。XOR指令和AND、OR等指令一样,也会将进位标志CF清0。
【例2.36】 使AL寄存器中的第1、3、5、7位求反,第0、2、4、6位保持不变,可将AL和10101010B(即OAAH)“异或”。
MOV AL,0FH ;AL=0FH
XOR AL,10101010B ;AL=1O1OOl01B(0A5H)
【例2.37】 XOR AX,AX ;将AX清0,同时将CF清0
(5)逻辑“非”运算
指令格式: NOT DST
功 能: DST←
操作说明: NOT指令使目的操作数按位取反,即其中所有“0”的位变为“1”,所有“1”的位变为“0”。其操作数可以是8位或16位的寄存器或存储器,但不能对立即数执行逻辑“非”操作。
【例2.38】 NOT AH
NOT WORD PTR[BX][DI]
2.移位指令
8086/8088指令系统的移位指令可以向左或向右移位,移位次数由COUNT决定,COUNT为1时移动一位,可直接写于指令中。要求移多位时,移动位数必须事先放在CL寄存器中。移位指令影响除AF外的其他状态标志位。
(1)逻辑左移指令
指令格式: SHL DST,COUNT
操作说明:SHL指令将目的操作数顺序向左移1位或移CL寄存器中指定的位数。左移1位时,操作数的最高位MSB移入进位标志CF,最低位LSB补0,相当于无符号数乘上2。
【例2.39】 MOV AH,8BH
MOV CL,3
SHL AH,CL ;SI内容左移3位
(2)逻辑右移指令
指令格式: SHR DST,COUNT
操作说明: SHR将目的操作数顺序向右移1位或移CL寄存器中指定的位数。低位移入CF,高位补0。无符号数右移1位相当于除以2。
【例2.40】 MOV BL,20H ;BL=20H
SHR BL,1 ;BL=10H
(3)算术左移指令
指令格式:SAL DST,COUNT
操作说明:SAL指令将目的操作数顺序向左移1位或移CL寄存器中指定的位数。操作与SHL完全相同。
【例2.41】SAL WORD PTR[BX+50],1
(4)算术右移指令
指令格式:SAR DST,COUNT
操作说明:SAR指令将目的操作数向右移1位或由CL寄存器指定的位数。右移一位时,操作数的最低位LSB移入进位标志CF,最高位MSB保持不变。对带符号数算术右移一位相当于将该数除以2。
【例2.42】
SAR AL,1
SAR DI,CL
SAR WORD PTRTABLE[SI],1
SAR BYTE PTR[BX],CL
4.循环移位指令
8086/8088指令系统有四条循环移位指令,包括不带进位和带进位循环移位。指令中指定的左移或右移的位数COUNT可以是1或由CL寄存器指定。所有循环移位指令都只影响进位标志CF和溢出标志OF。
(1)循环左移指令
指令格式: ROL DST,COUNT
操作说明: ROL指令将目的操作数顺序向左移1位或移CL寄存器中指定的位数。左移1位时,操作数的最高位MSB移入进位标志CF的同时,还移到最低位LSB形成循环,进位标志位不在循环环内。
【例2.43】 ROL AH,1 ;8位二进制数循环左移1位
ROL DX,CL ;16位二进制数循环左移CL位
操作说明:ROR指令将目的操作数顺序向右移1位或右移CL寄存器中指定的位数。右移1位时,操作数的最低位LSB移入进位标志CF的同时,还移到最高位MSB形成循环,进位标志位不在循环环内。
(2)循环右移指令
指令格式: ROR DST,COUNT
操作说明:ROR指令将目的操作数顺序向右移1位或移CL寄存器中指定的位数。右移1位时,操作数的最低位LSB移入进位标志CF的同时,还移到最高位MSB形成循环,进位标志位不在循环环内。
【例2.44】ROR CX,1
ROR DX,CL
(3)带进位循环左移指令
指令格式:RCL DST,COUNT
操作说明:RCL指令将目的操作数连同进位标志CF一起向左循环移动1位或CL寄存器中指定的位数。移动一位时,最高位MSB移入CF,而原CF移入最低位LSB。
【例2.45】ROR CX,1
ROR DX,CL
(4)带进位循环右移
指令格式: RCR DST,COUNT
操作说明:RCR指令将目的操作数连同进位标志CF一起向右循环移动1位或由CL寄存器中指定的位数。移动一位时,最低位LSB移入CF,而原CF则移入最高位MSB。
【例2.46】 测试AL寄存器中第5位的状态,为“0”时转向ZERO,否则向下继续执行。
方法1 用循环移位指令实现:
MOV CL,6
ROR AL,CL ;将AL的bit5移入CF
JNC ZERO ;若CF=0,则转向ZERO处
┇ ;否则,继续执行
ZERO: ……
方法2:用测试指令实现:
TEST AL,20H ;将AL与20H相“与”
JZ ZERO ;若结果为0,则转向ZERO处
┇ ;否则,继续执行
ZERO: ……
最后
以上就是缓慢雪碧为你收集整理的位操作指令小结的全部内容,希望文章能够帮你解决位操作指令小结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复