无符号数比较时的标志位的计算
在计算机中,无符号数的比较通常通过 减法运算 并结合 标志寄存器(FLAGS) 来判断大小关系。CPU 在执行比较指令(如 CMP)时,实际上会计算 A - B,并根据结果设置标志位,但不会保存减法结果。
1. 关键标志位
无符号数比较主要依赖以下标志位(以 x86 为例):
- CF(Carry Flag,进位标志):若减法(
A - B)需要借位,则CF = 1,否则CF = 0。 - ZF(Zero Flag,零标志):若
A == B(即A - B = 0),则ZF = 1,否则ZF = 0。
2. 无符号数比较规则
| 比较关系 | 条件(标志位) | 解释 |
|---|---|---|
| A == B | ZF = 1 |
A - B = 0 |
| A < B | CF = 1 |
A - B 需要借位(无符号下 A < B) |
| A > B | CF = 0 && ZF = 0 |
A - B 不借位且不为 0 |
3. 示例分析
假设 8 位无符号数比较(寄存器 AL = 5,BL = 10):
CMP AL, BL ; 计算 AL - BL(即 5 - 10)
- 计算
5 - 10:- 无符号 5 < 10,所以需要借位(相当于
5 + 256 - 10 = 251,结果不存储)。 - CF = 1(借位发生)
- ZF = 0(结果非 0)
- 无符号 5 < 10,所以需要借位(相当于
- 结论:
5 < 10(因为CF = 1)
4. 高级语言中的无符号比较
在 C/C++ 等语言中,无符号比较会被编译为 CMP + 条件跳转:
unsigned int a = 5, b = 10;
if (a < b) { // 编译为 `CMP + JB (Jump if Below, CF=1)`
// 执行
}
JB(Jump if Below)检查CF = 1(无符号小于)。JAE(Jump if Above or Equal)检查CF = 0(无符号大于或等于)。
5. 其他架构(ARM/MIPS)
- ARM:使用
CMP并检查CPSR的C(Carry)和Z(Zero)标志,逻辑类似 x86。 - MIPS:无直接标志位,而是用
SLTU(Set Less Than Unsigned)指令计算比较结果。
总结
- 无符号数比较 依赖 CF 和 ZF。
A < B→CF = 1A == B→ZF = 1A > B→CF = 0 && ZF = 0
理解这一点对汇编编程、逆向分析和优化至关重要。
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号