当前位置: 代码迷 >> 综合 >> 8086/8088指令系统详解之(3)位操作指令
  详细解决方案

8086/8088指令系统详解之(3)位操作指令

热度:94   发布时间:2023-12-10 20:11:12.0

位操作指令

1,逻辑运算指令
2,移位指令
3,循环移位指令

1,逻辑运算指令

这里写图片描述

说明:TEST相当于AND运算,但是不保存结果,仅影响标志。

对状态标志位的影响:除了NOT指令对状态标志位不产生影响外,AND,OR,XOR,TEST四条指令对状态标志位均有影响。这四条指令根据其各自的运算结果影响SF、ZF和PF状态标志位,同时将CF和OF清0,AF的值不确定。

1)逻辑“与”指令AND(logical AND)

格式: AND dst, src

操作:AND指令将目的操作数与源操作数进行逻辑“与”运算,并将结果送回目的操作数。

寻址方式:目的操作数可以是寄存器和存储器,源操作数可以是立即数、寄存器和存储器。但两者不能同时为存储器操作数。

例:

  AND AL, 00001111H        ;寄存器“与”立即数AND CX, DI               ;寄存器“与”寄存器AND SI, MEM_NAME         ;寄存器“与”存储器AND ALPHA[DI],AX         ;存储器“与”寄存器AND [BX][SI], 0FFFEH     ;存储器“与”立即数

用法:AND指令可以用于屏蔽某些不关心的位(与0相与),保留感兴趣的位(与1相与)。

例:将小写字母转化为大写字母
利用AND AL,11011111B指令可以将AL中保存的小写字母转化为大写字母。而若AL中的字母本来就是大写字母,则该指令不改变其值。

;判断输入的字符是否为‘Y’或‘y’,即不区分大小写MOV  AH, 01H        ;接受键盘输入的一个字符INT  21H            ;调用中断功能,功能号由AH指定AND  AL,11011111B   ;屏蔽第五位,转换为大写字母CMP  AL,'Y'         ;与Y比较JE   YES            ;若相等则跳转到YES......
YES:......
2)测试指令TEST(TEST or non-destructive logical AND)

格式: TEST dst, drc
操作:把目的操作数与源操作数相与,但结果不送回目的操作数。只将结果反映在标志位上。
寻址方式:目的操作数可以是寄存器和存储器,源操作数可以是立即数、寄存器和存储器。但两者不能同时为存储器操作数。

例:

TEST BH, 7                ;寄存器“与”立即数
TEST SI, BP               ;寄存器“与”寄存器
TEST [SI], CH             ;存储器“与”寄存器
TEST [BX][DI], 6ACEH      ;存储器“与”立即数

用法:TEST指令常常用于位测试,与条件转移指令一起,共同完成对特定位状态的判断,并实现相应的程序转移。但TEST指令只比较一个指定的位,而CMP指令比较整个操作数。

例:

   IN  AL, PORT            ;从端口PORT输入数据TEST  AL, 00101010B     ;测试第135位JNZ  NEXT               ;若任一位不为0,则转移到NEXT......
NEXT:......
3)逻辑“或”指令OR(logical inclusive OR)

格式: OR dst, src
操作:将目的操作数与源操作数进行或运算,并将结果送回目的操作数。
寻址方式:目的操作数可以是寄存器和存储器,源操作数可以是立即数、寄存器和存储器。但两者不能同时为存储器操作数。
例:

   OR  BL, 0F6H            ;寄存器“或”立即数OR  AX, BX              ;寄存器“或”寄存器OR  CL, BETA[BX][DI]    ;寄存器“或”存储器OR  GAMMA[SI], DX       ;存储器“或”寄存器OR  MEM_BYTE, 80H       ;存储器“或”立即数

用法:OR指令一个常见的用途是将寄存器或存储器中某些特定的位设置成1(与1相或),而其余位保持不变(与0相或)。

例:

;将AH和AL的最高位置为1
OR  AX, 8080H        ;(AX)或(10000000 10000000B)

特点:OR和AND指令若将一个寄存器和它本身进行逻辑运算,则寄存器内容不变,但会影响状态标志位SF,ZF,OF的值,并将OF和CF清零。

例:

    MOV AX, DATA          ;(AX)<-DATAOR  AX, AX            ;影响标志(用AND AX,AX亦可)JZ  ZERO              ;若为0,则转移到ZERO......                ;否则,......
ZERO:......
4)逻辑“异或”指令XOR(logical eXclusive OR)

格式: XOR dst, src
操作:将目的操作数与源操作数按位进行逻辑异或运算,并将结果送回目的操作数。
寻址方式:目的操作数可以是寄存器和存储器,源操作数可以是立即数、寄存器和存储器。但两者不能同时为存储器操作数。

例:

     XOR DI, 23F6H             ;寄存器“或”立即数XOR SI, DX                ;寄存器“或”寄存器XOR CL, BUFFER            ;寄存器“或”存储器XOR MEM[BX], AX           ;存储器“或”寄存器XOR TABLE[BP][SI], 3DH    ;存储器“或”立即数

用法
1,XOR指令的一个用途是将寄存器或存储器中某些特定的位“取反”(与1异或),而其余位保持不变(与0异或)。
2,XOR指令还可以将寄存器中的内容清零(将寄存器与自身进行异或即可)。

例:P126

5)逻辑“非”运算NOT(logical NOT)

格式: NOT dst

操作
字节取反:将0FFH-(dst)的结果送入dst
字取反:将0FFFFH-(dst)的结果送入dst

寻址方式:dst可以是一个8或16位的寄存器或存储器,但不能是一个立即数。

例:

    NOT AH                  ;8位寄存器操作数求反NOT CX                  ;16位寄存器操作数求反NOT BYTE PTR[BP]        ;8位存储器操作数求反NOT WORD PTR COUNT      ;16位存储器操作数求反

常见的用法举例:
清进位标志位: AND AX,AX 或 OR AL,AL等。

清零操作数:XOR AX,AX 不仅把AX清零,而且也影响了状态标志。

把某几位取反:用XOR指令,把要取反的位和1异或,不变的位和0异或。

清零或置位某几位:用AND指令清零,用OR指令置位。

2,移位指令

这里写图片描述

该类指令的使用方法是:
⑴ 移动1位,用类似于 SHL AX,1的格式
⑵ 移动n位,用类似于 SHL AX,CL的格式

移位指令的寻址方式:一个8或16位的寄存器或存储器。当移动1位时,操作数可以直接为1;当移动多位时,操作数保存在CL中。

说明:
⑴ 逻辑移位适用于无符号数,算术移位适用于有符号数。
⑵ 逻辑左移SHL和算术左移SAL的机器码完全相同,是助记符的两种写法。

1)逻辑左移/算术左移指令SHL/SAL(SHift logical Left/Shift Arithmetic Left)

格式
SHL dst, 1
SAL dst, 1
SHL dst, CL
SAL dst, CL

操作:将目的操作数顺序向左1位或CL中指定的位数。左移1时,操作数的最高位移入进位标志CF,最低位补0。左移移位可实现dst乘以2。

对状态标志位的影响:对CF和OF有影响。若移动1位,且移动后的最高位与CF不同,则OF=1,否则OF=0。即移动后,符号位若改变,则OF=1;若移动多位,则OF的值不确定。
例:P127

2)逻辑右移指令SHR(SHift logical Right)

格式
SHR dst, 1
SHR dst, CL

操作:将目的操作数顺序向右移1位或由CL寄存器指定的位数。逻辑右移1位时,操作数的最低为移动到进位标志CF,最高为补0。右移一次可是想dst的除以2操作。

对状态标志位的影响:对CF和OF有影响。若移动1位,且移动后新的最高位与次高位不等,则OF=1,否则OF=0。即移动后,符号位若改变,则OF=1;若移动多位,则OF的值不确定。
例:P127

3)算术右移指令SAR(Shift Arithmetic Right)

格式: SAR dst, 1/CL

操作:将目的操作数顺序向右移1位或由CL寄存器指定的位数。逻辑右移1位时,操作数的最低为移动到进位标志CF,最高位保持不变。

对状态标志位的影响:对CF,OF,PF,SF和ZF均有影响,但使AF的值不确定。
例:P128

3,循环移位指令

这里写图片描述

循环移位指令的寻址方式:一个8或16位的寄存器或存储器。当移动1位时,操作数可以直接为1;当移动多位时,操作数保存在CL中。

对状态标志位的影响:所有循环移位指令均影响CF和OF。

1)循环左移指令ROL(ROtate Left)

格式: ROL dst, 1/CL
操作:将目的操作数循环左移1位或由CL寄存器指定的位数。最高位移到CF,同时最高位补原最低位形成循环,CF不在循环回路之中。

对状态标志位的影响:对CF和OF有影响。若移动1位,且移动后的最高位与CF不同,则OF=1,否则OF=0。即移动后,符号位若改变,则OF=1;若移动多位,则OF的值不确定。

例:P128

2)循环右移指令ROR(ROtate Right)

格式: ROR dst, 1/CL

操作:将目的操作数循环右移1位或由CL寄存器指定的位数。逻辑右移1位时,操作数的最低为移动到进位标志CF,同时最低位移到最高位。

对状态标志位的影响:对CF和OF有影响。若移动1位,且移动后新的最高位与次高位不等,则OF=1,否则OF=0。即移动后,符号位若改变,则OF=1;若移动多位,则OF的值不确定。

例:P129

3)带进位的循环左移指令RCL(Rotate Left through Carry)

格式: RCL dst, 1/CL

操作:将目的操作数连同进位标志CF一起循环左移1位或由CL寄存器指定的位数。最高位移到CF,CF移到最低位,CF在循环回路之中。

对状态标志位的影响:对CF和OF有影响。若移动1位,且移动后的最高位与CF不同,则OF=1,否则OF=0。即移动后,符号位若改变,则OF=1;若移动多位,则OF的值不确定。

4)带进位的循环右移指令RCR(Rotate Right through Carry)

格式: RCR dst, 1/CL

操作:将目的操作数连同进位标志CF一起循环右移1位或由CL寄存器指定的位数。最低位移到CF,CF移到最高位,CF在循环回路之中。

对状态标志位的影响:对CF和OF有影响。若移动1位,且移动后新的最高位与次高位不等,则OF=1,否则OF=0。即移动后,符号位若改变,则OF=1;若移动多位,则OF的值不确定。
例:P129

使用举例
[例一] 利用循环移位指令可以对寄存器或存储器中的任一位进行测试。如要测试AL寄存器中的第5位的状态是“0”还是“1”,则可利用以下指令实现:

   MOV CL,4         ;(CL)<-移位次数ROR AL,CL        ;(CF)<-AL的第5位JNC ZERO         ;若(CF)=0,转ZERO………………    ?     ;否则?ZERO: …………??

[例二]利用带进位循环移位指令可以实现将两个以上寄存器或存储器单元组合起来一起移位。如DX和AX两个寄存器组成的32位数乘以2,可用以下两条指令实现:
SHL AX,1 ;AX左移1位,(CF)?AX的最高位
RCL DX,1 ;DX带进位左移1位,DX的最低位?(CF)
具体操作如下图:、
这里写图片描述