carry flag#
Carry Flag(CF 寄存器):当运算结果为负或者相加超过数值上限的时候会被触发。大概意思是计算结果如果超出了范围,就会触发 CF 标志,如果两个无符号数相减结果为负,同样会触发 CF 标志。
overflow flag#
of 标志位类似于 cf,但它针对有符号数的,当有符号数计算出错时,会触发 of 标志位。
signed flag#
任何操作的结果如果是一个负数就会触发 sf,sf 只表示结果的符号,并不表示结果对还是错。
zero flag#
zf 在以下条件下将会触发:在内部实际是减法的比较指令中,两个操作数相同;增或减导致结果为 0;相减结果为 0。
条件跳转与标志位#
也就是当 2 个操作数相同,JZ 指令会执行跳转。如果第一个无符号操作数比第二个小,JB 指令会执行跳转。如果第一个有符号操作数比第二个小,JL 指令会执行跳转。一般只需要看无符号条件跳转和有符号条件跳转表格的第三列就行。
asm | condition | operation |
---|---|---|
JA | z=0 and c=0 | jump if above(如果大于则跳转) |
JAE | c=0 | jump if above or equal(如果大于或等于则跳转) |
JB | c=1 | jump if below (如果低于则跳转) |
JBE | z=1 or c=1 | jump if below or equal(如果小于等于则跳转) |
JC | c=1 | jump if carry(如果进位则跳转) |
JECXZ | ecx=0 | jump if ecx is 0 (如果 ecx 为 0,则跳转) |
JE | z=1 | jump if equal(如果相等就跳转) |
JZ | z=1 | jump if zero (如果为零则跳转) |
JNE | z=0 | jump if not equal (如果不相等就跳转) |
JNZ | z=0 | jump if not zero (如果非零则跳转) |
JO | 超出范围 | jump if overflow |
JP | 有偶数个 1 位(操作结果中二进制中 1 的个数,01110000) | jump if parity |
JPE | 偶数校验 | jump if parity even |
JNP | 没有偶数个 1 位 | jump if not parity |
JPO | 奇数校验 | jump if parity odd |
JS | 符号位为 1 | jump if sign(如果有标志则跳转) |
JNS | 符号位为 0 | jump if not sign(如果没有标志则跳转) |
JL/JNGE | 符号位与溢出位相同 | jump if less or not greater/equal |
JLE/JNG | z=1 or 符号位与溢出位相同 | jump if less or equal/not greater |
JG/JNLE | z=0 and 符号位与溢出位相同 | jump is greater/not less or equal |