3.4.1 逻辑运算和移位指令 1.逻辑运算指令
(1)NOT OPRD
该指令对操作数进行求反操作,然后将结果送回。操作数可以是寄存器或贮器的内容。该指令对标志位不产生影响。
例如: NOT AL
(2)AND指令
该指令对两个操作数进行按位相“与”的逻辑运算。即只有参加相与的两位全为“1”时,相“与”结果才为“1”;否则相“与”结果为“0”。相“与”结果送回。
AND指令可以进行字节操作,也可以进行字操作。
AND指令的一般格式为
AND OPRD1,OPRD2
其中,目的操作数OPRD1可以是累加器,也可以是任一通用寄存器,可以是内存操作数。源操作数OPRD2可以是立即数、寄存器,也可以是内存操作数,
例如:
AND AL,0FH
ANDAX,BX
ANDSI,BP
ANDAX,DATA --WORD
ANDDX,BUFFER[SI+BX]
ANDDATA --WORD,00FFH
ANDBLOCK[BP+DI],DX
(3) TEST指令
该指令的操作功能与AND指令相同,其结果将反映在标志位上,但结果不送回,即TEST指令将不改变操作数的值。这条指令通常是在不希望改变操作数的前提下,
用来检测某一位或某几位的状态。
TEST 指令的一般格式为
TEST OPRD,im ;im是立即数
立即数中哪一位为1,表示要对哪一位进行测试。
例如,若要检测AL中的最低位是否为1,且为1则转移。在这种情况下
可以用如下指令:
TEST AL, 01H
JNZ THERE
… THERE:MOV BL,05H
(4) OR指令
OR指令允许对字节或对字进行相“或”运算。OR指令使标志位CF=0,OF=0;相“或”操作的结果反映在标志位PF、SF和ZF上;对AF标志位未定义。
OR指令的一般格式为
OR OPRD1,OPRD2
其中,目的操作数OPRD1可以是累加器,可以是任一通用寄存器,也可以是一个内存操作数。源操作数OPRD2可以是立即数,也可以是寄存器,也可以是内存操作数,
例如:
OR AL,30H
OR AX,00FFH
OR BX,SI
OR BX,DATA --WORD
OR BUFFER,SI
OR BUFFER[BX+SI],8000H
操作数自身相“或”将不改变操作数的值,但可使进位标志位CF清0。
(5) XOR指令
该指令对两个操作数进行按位“异或”操作,即进行“异或”操作的两位值不同时,其结果为“1”;否则就为0,操作结果送回。
XOR 指令的一般形式为
XOR OPRD 1 ,OPRD2
其中,目的操作数OPRD1可以是累加器、任一个通用寄存器,也可以是一个内存操作数。源操作数可以是立即数、寄存器,也可以是内存操作数.
例如:
XOR AL,0FH
XOR AX,BX
XOR DX,SI
XOR CX,CONNT --WORD
XOR BUFFER,DI
XOR BUFFER[BX+SI],AX
当操作数自身进行“异或”时,由于每一位都相同,因此“异或”结果一定为0,且使进位标志位也为0。这是对操作数清0的常用方法。
例如:
XOR AX ,AX
XOR SI,SI
2.移位指令
8088有3条移位指令。算术左移和逻辑左移指令:SAL/SHL OPRD,m ;m是移位次数,可以是1或寄存器CL中的内容算术右移指令:
SAR OPRD, m
逻辑右移指令:SHR OPRD, m
(1) SAL/SHL指令
这两条指令的操作结果是完全一样的。每移位一次在右面最低位补一个0,而左面的最高位则移入标志位CF,如图3.16所示。
(2) SAR指令
该指令每执行一次移位操作,就使操作数右移一位,但符号位保持不变,而最低位移至标志位CF,如图3.17所示。
SAR可移位由m所指定的次数,结果影响标志位CF、OF、PF、SF和ZF。
(3) SHR指令
该指令每执行一次移位操作,就使操作数右移一位,最低位移 至标志位CF中。与SAR不同的是,左面的最高位将补0,如图3.18所示。 该指令可以执行由m所指定的移
位次数。
3. 循环移位指令
8088有4条循环移位指令:
左循环移位指令 ROLOPRD,m
右循环移位指令 ROROPRD,m
带进位左循环移位指令 RCLOPRD,m
带进位右循环移位指令 RCROPRD,m
(1) ROL指令
该指令每做一次移位,总是将最高位移入进位位CF中,并且还将最高位移入操作数的最低位,从而构成一个环,如图3.19(a)所示。
(2) ROR指令
该指令每做一次移位,总是将最低位移入进位标志位CF中,另外,还将最低位移入操作数的最高位,从而构成一个环,如图3.19(b)所示。
(3) RCL指令
该指令是把标志位CF包含在内的循环左移指令。每移位一次,操作数的最高位移入进位标志位CF中,而原来CF的内容则移入操作数的最低位,从而构成一个大环,
如图3.19(c)所示。
(4)RCR指令
该指令是把进位标志位CF包含在内的右循环指令。每移位一次,标志位CF中的原内容就移入操作数的最高位,而操作数的最低位则移入标志位CF中,如图3.19(c)所示。
左移一位,只要左移以后的数未超出一个字节或一个字所能表达的范围,则相当于原来的数乘以2;而右移一位相当于除以2,
例如:
MOV AL,08H
SALAL,1 ;左移一位,相当于乘以2;该指令执行后,AL中的内容为16
MOVAL,16
SARAL,1 ;右移一位,相当于除以2 ;该指令执行后,AL中的内容为8