标志寄存器
- CF: 当一个算术操作在结果的最高位产生进位或借位时此标志是1,否则是0
mov al, 1000000b
add al, al
--> CF = 1
1000 0000(b) + 1000 0000(b) = 1 0000 0000(b)
- PF: 当一个算术操作的结果在低8位中有偶数个1,此标志是1,否则是0
mov al, 00100110b
xor al, 3
--> PF = 0
0010 0110 ^ 0000 0011 = 0010 0101 低8位2个1
- ZF: 当运算结果为0时此标志是1,否则是0
mov ax, 3
sub ax, 3
--> ZF = 1
- SF: 用运算结果的最高位来设置此标志,一般是有符号数的符号位,0-正数,1-负数
mov ah, 17
add ah, 1
--> SF = 1
- OF: 对任何一个算术操作,假定它进行的是有符号运算,那么当结果超过目标位置所能容纳的最大整数或最小负数时此标志是1,表示有符号整数运算的结果已经溢出,否则是0
mov ah, 11111101b
add ah, 5
--> OF = 0
1111 1101 + 0000 0101 = 1 0000 0010(-3 + 5 = 2)
ah = 0000 0010
指令对标志位的影响
- cld: DF=0,CF/OF/ZF/SF/AF/PF的影响未定义
- std: DF=1,不影响其他标志位
- inc/dec: CF不受影响,OF/SF/ZF/AF/PF的影响依计算结果而定
- add/sub: OF/SF/ZF/AF/PF/CF的影响依计算结果而定
- div/idiv: OF/SF/ZF/AF/PF/CF的影响未定义
- mov/movs: 不影响标志位
- neg: 如果操作数为0,则CF=0,否则CF=1,对OF/SF/ZF/AF/PF的影响依计算结果而定
- xor: OF=0,CF=0,对SF/ZF/PF依计算结果而定,对AF的影响未定义
- cbw/cwde/cdqe/cwd/cdq/cqo: 不影响标志位
条件跳转指令
条件转移指令不影响标志位,但依赖标志位才能工作,一般是满足某个条件跳到一个标号位置开始执行
print:
...
dec si
jns print
| 条件转移指令 | 标志位状态 |
|---|---|
| js | SF=1 转移 |
| jns | SF=0 转移 |
| jz | ZF=1 转移 |
| jnz | ZF=1 转移 |
| jo | OF=1 转移 |
| jno | OF=1 转移 |
| jc | CF=1 转移 |
| jnc | CF=1 转移 |
| jp | PF=1 转移 |
| jnp | PF=1 转移 |
CMP指令
cmp 寄存器/内存空间,寄存器/内存空间/立即数
在功能上和SUB类似,也是左操作数-右操作数,按照计算结果设置标志位,并且不改变左右操作数的原值
影响CF/OF/SF/ZF/AF/PF标志位
cmp al, 35
cmp dx, ax
cmp dx, [0x2002]
cmp byte[0x2005], 37
cmp [0x2008], ax
另一种条件转移指令
jcxz(jump if cx is zero)意思是当CX寄存器的内容是0时,则转移,执行这条指令是先测试寄存器CX是否为0
jcxz print