汇编语言逻辑与移位指令

一、逻辑指令

  • AND(and)      与

  • OR (or)      或

  • NOT(not)      非

  • XOR(exclusive or)   异或

  • TEST(test)     测试

逻辑指令按二进制位进行操作,因此操作数应看成二进制位串。双操作数指令中,至少有一个操作数必须存放在寄存器中,另一个操作数则可以使用任意寻址方式。

(1)AND(与指令)

格式:AND DST,SRC

操作:(DST)←(DST)∧(SRC)

(2)OR(或指令)

格式:OR DST,SRC

操作:(DST)←(DST)∨(SRC)

(3)NOT(非指令)

格式:NOT OPR

操作:(OPR)←(OPR)

(4)XOR(异或指令)

格式:XOR DST,SRC

操作:(DST)←(DST)∀(SRC)

(5)TEST(测试指令)

格式:TEST OPR1,OPR2

操作:(OPR1)∧(OPR2)

说明:TEST 指令的两个操作数相与的结果不保存,只根据结果置标志位。

逻辑运算指令只会对部分标志位产生影响,其中 NOT 指令不影响任何标志位,其他指令将使 CF 位和 OF 位为 0,AF 位无定义,其他位则根据运算结果设置。

逻辑指令除了常规的逻辑运算功能外,通常还可以用来对操作数的某些位进行处理,例如屏蔽某些位(将这些位置 O),或使某些位置 1,或测试某些位等。下面举例说明。

例 33 屏蔽 AL 寄存器的高四位,目前 AL=36H。

1
AND  AL,0FH

指令执行的结果为 AL=06H,实现了高四位的屏蔽。

屏蔽 AL 寄存器的高四位

例 34 将 AL 寄存器的最低两位置 1,目前 AL=36H。

1
OR  AL,03H

指令执行的结果为 AL=37H,即最低两位实现了置 1。

将 AL 寄存器的最低两位置 1

例 35 对 AL 寄存器的最低两位取反,目前 AL=36H。

1
XOR  AL,03H

指令执行的结果为 AL=35H,实现了对最低两位的取反。

对 AL 寄存器的最低两位取反

例 36 测试AL寄存器中的数,如果是负数则转到标号 NEXT 去执行。如 AL=86H。

1
2
3
TEST  AL,80H

JS   NEXT

指令执行的结果 AL=86H(不变),但 TEST 指令的结果将标志寄存器的 SF 位置 1,因此 JS 跳转指令会跳转到标号 NEXT 去继续执行。

二、移位指令

  • SHL(Shift Logical Left)      逻辑左移

  • SAL(Shift Arithmetic Left)     算术左移

  • SHR(Shift Logical Right)      逻辑右移

  • SAR(Shift Arithmetic Right)     算术右移

  • ROL(Rotat Left)         循环左移

  • ROR(Rotat Right)        循环右移

  • RCL(Rotat Left with Carry)     带进位循环左移

  • RCR(Rotat Right with Carry)    带进位循环右移

移位指令均是双操作数指令,指令的格式相同,以 SHL 为例,则:

格式:

① SHL  OPR,1

② SHL  OPR,CL,其中 CL 寄存器的值大于 1。

其中 OPR 为寄存器或内存单元,移位次数可以是 1 或 CL 寄存器,如需移位的次数大于 1,则可以在该移位指令前把移位次数先送 CL 寄存器中。

当执行逻辑或算术左移时,操作结果相同,均是最低位补 0,移出的最高位送 CF 标志位;当执行逻辑右移时,最高位补 0,移出的最低位送 CF 标志位;当执行算术右移时,OPR 被认为是有符号数,则最高位补符号位自身,移出的最低位送 CF 标志位;当执行循环左移时,OPR 整体向左移一位,最高位移出,同时送 CF 标志位和最低位;当执行循环右移时,OPR 整体向右移一位,最低位移出,同时送 CF 标志位和最高位;当执行带进位循环左移时,OPR 整体向左移一位,此时最高位移出送 CF 标志位,而 CF 标志位原始的数值送 OPR 最低位;当执行带进位循环右移时,OPR 整体向右移一位,此时最低位移出送 CF 标志位,而 CF 标志位原始的数值送 OPR 最高位。所有移位指令的操作如图 17 所示。

移位指令

图 17 移位指令

例 37(1)SHL  AX,1

(2)SHR  AX,1

(3)SAR  AX,1

(4)ROL  AX,1

(5)ROR  AX,1

(6)RCL  AX,1

(7)RCR  AX,1

如指令执行前,AX=13H=00010011B,CF=1。则指令执行结果如下:

(1)SHL:00010011 整体左移,最高位 0 送入 CF 标志位,最低位补 0,结果为 AX=00100110B=26H,CF=0,相当于对 AX 的内容乘以 2。

(2)SHR:00010011 整体右移,最低位 1 送入 CF 标志位,最高位补 0,结果为 00001001=09H,CF=1,相当于对 AX 的内容除以 2;若 AX=10010011B,则 SHR 执行的结果为 01001001=49H,CF=1。

(3)SAR:00010011 整体右移,最低位 1 送入 CF 标志位,最高位补符号位本身,即 0,结果为 00001001=09H;若 AX=10010011B,则 SAR 执行的结果与 SHR 不同,结果为 11001001=C9H,CF=1。

(4)ROL :00010011 整体左移,最高位 0 同时送入 CF 标志位和最低位,结果为 AX=00100110B=26H,CF=0。

(5)ROR :00010011 整体右移,最低位 1 同时送入 CF 标志位和最高位,结果为 AX=10001001B=89H,CF=1。

(6)RCL:00010011 整体左移,最高位 0 送入 CF 标志位,而 CF 标志位原始的值(CF=1)送入最低位,结果为 AX=00100111B=27H,CF=0。

(7)RCR:00010011 整体右移,最低位 1 送入 CF 标志位,而 CF 标志位原始的值(CF=1)送入最高位,结果为 AX=10001001B=89H,CF=1;若 CF 标志位原始的值 CF=0,则结果为 AX=00001001B=09H,CF=1。

例 38 对 AX 中内容实现半字交换,即交换 AH 和 AL 中的内容。

1
2
3
MOV  CL,8

ROL  AX,CL

如指令执行前,AX=1234H,指令执行后,AX=3412H。

请参阅

(完)

comments powered by Disqus