ITEEDU

5.2.10 条件设置字节指令

条件设置字节指令(Set Byte Conditionally)是80386及其以后CPU所具有的一组指令。它们在测试条件方面与条件转移是一致的,但在功能方面,它们不是转移,而是根据测试条件的值来设置其字节操作数的内容为1或0。

条件设置字节指令的一般格式如下:

 SETnn Reg/Mem    ;80386+

其中:nn是表示测试条件的(见表5.4),操作数只能是8位寄存器或一个字节单元。

这组指令的执行不影响任何标志位。

表5.4 条件设置字节指令列表

指令的助忆符 操作数和检测条件之间的关系
SETZ/SETE Reg/Mem = ZF
SETNZSETNE Reg/Mem = not ZF
SETS Reg/Mem = SF
SETNS Reg/Mem = not SF
SETO Reg/Mem = OF
SETNO Reg/Mem = not OF
SETP/SETPE Reg/Mem = PF
SETNP/SETPO Reg/Mem = not PF
SETC/SETB/SETNAE Reg/Mem = CF
SETNC/SETB/SETAE Reg/Mem = not CF
SETNA/SETBE Reg/Mem = (CF or ZF)
SETA/SETNBE Reg/Mem = not (CF or ZF)
SETL/SETNGE Reg/Mem = (SF xor OF)
SETNL/SETGE Reg/Mem = not (SF xor OF)
SETLE/SETNG Reg/Mem = (SF xor OF) or ZF
SETNLE/SETG Reg/Mem = not ((SF xor OF) or ZF)

例5.19 编写程序段:检测寄存器EAX的8个16进制中有几个0H,并把统计结果存入BH中。

解:

方法1:用条件转移指令来实现

 XOR    BH, BH
 MOV   CX, 8   ;测试寄存器EAX——8次
 again:   TEST   AL, 0FH ;测试低四位二进制是否为0H
 JNZ next
 INC BH
 next:    ROR    EAX, 4  ;循环向右移四位,为测试高四位作准备
 LOOP   again

方法2:用条件设置字节指令来实现

 XOR    BH, BH
 MOV   CX, 8   ;测试寄存器EAX——8次
 again:   TEST   AL, 0FH ;测试低四位二进制是否为0H
 SETZ   BL  ;如果AL的低四位是0,则BL置为1,否则,BL为0
 ADD    BH, BL
 ROR    EAX, 4
LOOP   again