SETcc
在条件上设置字节
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
0F 97 | SETA r/m8 | M | 有效 | 有效 | 上方设置字节( CF=0, ZF=0) 。 |
0F 93 | SETAE r/m8 | M | 有效 | 有效 | 如果高于或等于(CF=0),则设置字节。 |
0F 92 | SETB r/m8 | M | 有效 | 有效 | 如果下面设置字节( CF=1) 。 |
0F 96 | SETBE r/m8 | M | 有效 | 有效 | 如果低于或等于(CF=1或ZF=1),则设置字节。 |
0F 92 | SETC r/m8 | M | 有效 | 有效 | 携带时设置字节( CF=1). |
0F 94 | SETE r/m8 | M | 有效 | 有效 | 如果等于( ZF=1) 则设置字节 。 |
0F 9F | SETG r/m8 | M | 有效 | 有效 | 如果更大, 设置字节( ZF = 0, SF = OF) 。 |
0F 9D | SETGE r/m8 | M | 有效 | 有效 | 如果大于或等于(SF=OF),则设置字节。 |
0F 9C | SETL r/m8 | M | 有效 | 有效 | 如果少则设置字节( SF OF) 。 |
0F 9E | SETLE r/m8 | M | 有效 | 有效 | 如果小于或等于(ZF=1或SF OF),则设置字节。 |
0F 96 | SETNA r/m8 | M | 有效 | 有效 | 如果不是以上(CF=1或ZF=1)则设置字节. |
0F 92 | SETNAE r/m8 | M | 有效 | 有效 | 如果不是以上或相等,则设置字节(CF=1). |
0F 93 | SETNB r/m8 | M | 有效 | 有效 | 如果不低于(CF=0),则设置字节。 |
0F 97 | SETNBE r/m8 | M | 有效 | 有效 | 如果不低于或等于(CF=0和ZF=0),则设置字节。 |
0F 93 | SETNC r/m8 | M | 有效 | 有效 | 如果不携带则设置字节(CF=0). |
0F 95 | SETNE r/m8 | M | 有效 | 有效 | 设置非相等的字节( ZF=0) 。 |
0F 9E | SETNG r/m8 | M | 有效 | 有效 | 设置字节( ZF=1 或 SF OF) |
0F 9C | SETNGE r/m8 | M | 有效 | 有效 | 设置字节( 如果不是较大或相等) 。 |
0F 9D | SETNL r/m8 | M | 有效 | 有效 | 设置字节( SF = OF) 。 |
0F 9F | SETNLE r/m8 | M | 有效 | 有效 | 设置字节( ZF=0, SF=OF) 。 |
0F 91 | SETNO r/m8 | M | 有效 | 有效 | 设置未溢出字节( OF=0) 。 |
0F 9B | SETNP r/m8 | M | 有效 | 有效 | 如果不是对等, 则设置字节( PF=0) 。 |
0F 99 | SETNS r/m8 | M | 有效 | 有效 | 设置未签名的字节( SF=0) 。 |
0F 95 | SETNZ r/m8 | M | 有效 | 有效 | 设置字节, 如果不是零( ZF=0) 。 |
0F 90 | SETO r/m8 | M | 有效 | 有效 | 如果溢出则设置字节( OF=1) |
0F 9A | SETP r/m8 | M | 有效 | 有效 | 如果对等, 设置字节( PF = 1) 。 |
0F 9A | SETPE r/m8 | M | 有效 | 有效 | 设置偶数的字节( PF=1) 。 |
0F 9B | SETPO r/m8 | M | 有效 | 有效 | 如果偶数( PF=0) , 设置字节 |
0F 98 | SETS r/m8 | M | 有效 | 有效 | 设置符号的字节( SF=1) 。 |
0F 94 | SETZ r/m8 | M | 有效 | 有效 | 如果为零则设置字节( ZF=1) 。 |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
M
modrm.rmescrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
说明
根据状态标志(CF,SF,OF,ZF,和PF)在EFLAGS登记册中的设置,将目标操作数设置为0或1. 目标操作数指代一个字节寄存器或一个字节内存. 条件代码后缀(cc)表示正在测试的条件.
术语"以上"和"以下"与CF旗相关,指两个无符号整数值之间的关系. "大"和"小"这两个术语与SF和OF旗有关,并指两个签名的整数值之间的关系.
许多SETcc指令操作码都有交替的mnemonics. 例如,SETG(如果较大则设置位元)和SETNLE(如果不小或相等则设置位元)具有相同的操作码,且测试条件相同: ZF 等于 0,SF 等于 OF. 提供了这些备选的演示词,以使代码更加易懂。 附录B"EFLAGS条件代码",在Intel(R)64和IA-32架构软件开发者手册第1卷中显示了各种测试条件的交替模式.
一些语言代表一个逻辑的,作为所有位集的整数. 这种表示可以通过选择SETcc指令的逻辑相反条件来获得,然后降低结果. 例如,为了测试溢出,使用SETNO指令,然后降低结果.
ModR/M字节的reg字段不用于SETCC指令,那些操作码比特被处理器忽略.
在IA-64模式中,操作数大小固定在8位. 使用 REX 前缀可以实现对额外字节注册符的统一地址. 否则,此指令的操作与遗留模式和兼容模式相同.
行动
IF condition
THEN DEST := 1;
ELSE DEST := 0;
FI;受影响的旗帜
None.
异常
保护模式
#GP(0) | 如果目的地位于不可写入的区段中。如果内存操作数的有效地址位于CS、DS、ES、FS或GS区段限制之外。如果DS、ES、FS或GS登记簿包含NULL 段选择子。 |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#GP | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#GP(0) | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS(0) | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#PF(fault-code) | 如果发生 页面错误 。 |
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#SS(0) | 如果引用SS部分的内存地址是非冠状的. |
#GP(0) | 如果内存地址是非冠状的. #PF(fault-code) 如果发生 页面错误. |
#UD | 如果使用 LOCK 前缀 。 |