逻辑运算和移位指令 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所示。




python 上下左右平移 python左移右移位运算_内存操作


(2) SAR指令该指令每执行一次移位操作,就使操作数右移一位,但符号位保持不变,而最低位移至标志位CF,如图3.17所示。  SAR可移位由m所指定的次数,结果影响标志位CF、OF、PF、SF和ZF。


python 上下左右平移 python左移右移位运算_python左移右移位运算_02


该指令每执行一次移位操作,就使操作数右移一位,最低位移 至标志位CF中。与SAR不同的是,左面的最高位将补0,如图3.18所示。 该指令可以执行由m所指定的移位次数。


python 上下左右平移 python左移右移位运算_python左移右移位运算_03


3. 循环移位指令 8088有4条循环移位指令: 左循环移位指令 ROLOPRD,m  右循环移位指令 ROROPRD,m  带进位左循环移位指令 RCLOPRD,m  带进位右循环移位指令 RCROPRD,m (1) ROL指令该指令每做一次移位,总是将最高位移入进位位CF中,并且还将最高位移入操作数的最低位,从而构成一个环,如图3.19(a)所示。 (2) ROR指令该指令每做一次移位,总是将最低位移入进位标志位CF中,另外,还将最低位移入操作数的最高位,从而构成一个环,如图3.19(b)所示。


python 上下左右平移 python左移右移位运算_移位指令_04


(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


python 上下左右平移 python左移右移位运算_移位指令_05