setno
Set Byte on Not Overflow
SETNO r/m8
Sets byte to 1 if OF=0.
Details
Sets the destination byte to 1 if the Overflow Flag (OF) is clear, otherwise sets it to 0. This instruction does not modify any flags. Available in 32-bit and 64-bit modes; used to test when no signed overflow has occurred.
Pseudocode Operation
dest ← (OF == 0) ? 1 : 0;
Example
SETNO bl
Encoding
Binary Layout
0F
+0
91
+1
Operands
-
dest
8-bit register or memory
Reference (Intel® SDM)
Instruction Forms
| Opcode | Instruction | Op/En | 64/32-bit Mode | CPUID | Description |
|---|---|---|---|---|---|
| 0F 97 | SETA r/m8 | M | Valid Valid | Set byte if above (CF=0 and ZF=0). | |
| 0F 93 | SETAE r/m8 | M | Valid Valid | Set byte if above or equal (CF=0). | |
| 0F 92 | SETB r/m8 | M | Valid Valid | Set byte if below (CF=1). | |
| 0F 96 | SETBE r/m8 | M | Valid Valid | Set byte if below or equal (CF=1 or ZF=1). | |
| 0F 92 | SETC r/m8 | M | Valid Valid | Set byte if carry (CF=1). | |
| 0F 94 | SETE r/m8 | M | Valid Valid | Set byte if equal (ZF=1). | |
| 0F 9F | SETG r/m8 | M | Valid Valid | Set byte if greater (ZF=0 and SF=OF). | |
| 0F 9D | SETGE r/m8 | M | Valid Valid | Set byte if greater or equal (SF=OF). | |
| 0F 9C | SETL r/m8 | M | Valid Valid | Set byte if less (SF≠ OF). | |
| 0F 9E | SETLE r/m8 | M | Valid Valid | Set byte if less or equal (ZF=1 or SF≠ OF). | |
| 0F 96 | SETNA r/m8 | M | Valid Valid | Set byte if not above (CF=1 or ZF=1). | |
| 0F 92 | SETNAE r/m8 | M | Valid Valid | Set byte if not above or equal (CF=1). | |
| 0F 93 | SETNB r/m8 | M | Valid Valid | Set byte if not below (CF=0). | |
| 0F 97 | SETNBE r/m8 | M | Valid Valid | Set byte if not below or equal (CF=0 and ZF=0). | |
| 0F 93 | SETNC r/m8 | M | Valid Valid | Set byte if not carry (CF=0). | |
| 0F 95 | SETNE r/m8 | M | Valid Valid | Set byte if not equal (ZF=0). | |
| 0F 9E | SETNG r/m8 | M | Valid Valid | Set byte if not greater (ZF=1 or SF≠ OF) | |
| 0F 9C | SETNGE r/m8 | M | Valid Valid | Set byte if not greater or equal (SF≠ OF). | |
| 0F 9D | SETNL r/m8 | M | Valid Valid | Set byte if not less (SF=OF). | |
| 0F 9F | SETNLE r/m8 | M | Valid Valid | Set byte if not less or equal (ZF=0 and SF=OF). | |
| 0F 91 | SETNO r/m8 | M | Valid Valid | Set byte if not overflow (OF=0). | |
| 0F 9B | SETNP r/m8 | M | Valid Valid | Set byte if not parity (PF=0). | |
| 0F 99 | SETNS r/m8 | M | Valid Valid | Set byte if not sign (SF=0). | |
| 0F 95 | SETNZ r/m8 | M | Valid Valid | Set byte if not zero (ZF=0). | |
| 0F 90 | SETO r/m8 | M | Valid Valid | Set byte if overflow (OF=1) | |
| 0F 9A | SETP r/m8 | M | Valid Valid | Set byte if parity (PF=1). | |
| 0F 9A | SETPE r/m8 | M | Valid Valid | Set byte if parity even (PF=1). | |
| 0F 9B | SETPO r/m8 | M | Valid Valid | Set byte if parity odd (PF=0). | |
| 0F 98 | SETS r/m8 | M | Valid Valid | Set byte if sign (SF=1). | |
| 0F 94 | SETZ r/m8 | M | Valid Valid | Set byte if zero (ZF=1). |
Description
Sets the destination operand to 0 or 1 depending on the settings of the status flags (CF, SF, OF, ZF, and PF) in the
EFLAGS register. The destination operand points to a byte register or a byte in memory. The condition code suffix (cc) indicates the condition being tested for.
The terms “above” and “below” are associated with the CF flag and refer to the relationship between two unsigned integer values. The terms “greater” and “less” are associated with the SF and OF flags and refer to the relationship between two signed integer values.
Many of the SETcc instruction opcodes have alternate mnemonics. For example, SETG (set byte if greater) and
SETNLE (set if not less or equal) have the same opcode and test for the same condition: ZF equals 0 and SF equals
OF. These alternate mnemonics are provided to make code more intelligible. Appendix B, “EFLAGS Condition
Codes,” in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, shows the alternate mnemonics for various test conditions.
Some languages represent a logical one as an integer with all bits set. This representation can be obtained by choosing the logically opposite condition for the SETcc instruction, then decrementing the result. For example, to test for overflow, use the SETNO instruction, then decrement the result.
The reg field of the ModR/M byte is not used for the SETCC instruction and those opcode bits are ignored by the processor.
In IA-64 mode, the operand size is fixed at 8 bits. Use of REX prefix enable uniform addressing to additional byte registers. Otherwise, this instruction’s operation is the same as in legacy mode and compatibility mode.
Operation
IF condition THEN DEST := 1; ELSE DEST := 0; FI;
Flags Affected
None.
Exceptions
Protected Mode Exceptions
#GP(0) If the destination is located in a non-writable segment.
If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
If the DS, ES, FS, or GS register contains a NULL segment selector.
#SS(0) If a memory operand effective address is outside the SS segment limit.
#PF(fault-code) If a page fault occurs.
#UD If the LOCK prefix is used.
Real-Address Mode Exceptions
#GP If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
#SS If a memory operand effective address is outside the SS segment limit.
#UD If the LOCK prefix is used.
Virtual-8086 Mode Exceptions
#GP(0) If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
#SS(0) If a memory operand effective address is outside the SS segment limit.
SETcc—Set Byte on Condition Vol. 2B 4-623
#PF(fault-code) If a page fault occurs.
#UD If the LOCK prefix is used.
Compatibility Mode Exceptions
Same exceptions as in protected mode.
64-Bit Mode Exceptions
#SS(0) If a memory address referencing the SS segment is in a non-canonical form.
#GP(0) If the memory address is in a non-canonical form.
#PF(fault-code) If a page fault occurs.
#UD If the LOCK prefix is used.
SETcc—Set Byte on Condition Vol. 2B 4-624