测试条件
为了使用条件跳转,必须测试条件。此处测试条件仅指检查标志的行为,实际跳转在条件跳转下描述。
x86 依赖于 EFLAGS 寄存器来测试条件,该寄存器包含每个指令可能设置的一组标志。
算术指令,如 sub
或 add
,以及逻辑指令,如 xor
或 and
,显然是设置标志。这意味着标志 CF , OF , SF , ZF , AF , PF 被这些指令修改。允许任何指令修改标志,例如 cmpxchg
修改 ZF 。
始终检查指令参考以了解特定指令修改了哪些标志。
x86 有一组条件跳转,前面提到过,当且仅当某些标志被设置或某些标志被清除或两者都被跳转时才跳转。
标志
算术和逻辑运算在设置标志时非常有用。例如,在 sub eax, ebx
之后,现在持有无符号值,我们有:
无损检测
sub
和 and
指令修改其目标操作数,并且需要两个额外的副本(保存和恢复)以保持目标不被修改。
要执行非破坏性测试,请参阅 cmp
和 test
的说明。它们与破坏性对应物相同,但操作结果被丢弃,只保存标志。
有害 | 非破坏性的 |
---|---|
sub |
cmp |
and |
test |
test eax, eax ;and eax, eax
;ZF = 1 iff EAX is zero
test eax, 03h ;and eax, 03h
;ZF = 1 if both bit[1:0] are clear
;ZF = 0 if at least one of bit[1:0] is set
cmp eax, 241d ;sub eax, 241d
;ZF = 1 iff EAX is 241
;CF = 1 iff EAX < 241
签名和未签名的测试
CPU 没有给出注册值 1 的 特殊含义,sign 是程序员构造。**测试有符号和无符号值时没有区别。**如果操作数被认为是有符号和无符号的,则处理器计算足够的标志来测试通常的算术关系(等于,小于,大于等)。
1 虽然它有一些只对特定格式有意义的指令,比如两个补码。这是为了使代码更有效,因为在软件中实现算法需要大量代码。