标志位
在汇编语言中,所有的标志位都存放在flags寄存器,寄存器的每一位都代表不同的标志位
- CF(Carry Flag):进位标志,用于表示是否产生了进位或借位。
- ZF(Zero Flag):零标志,如果操作结果为零,则设置此标志。
- SF(Sign Flag):符号标志,如果操作结果为负数,则设置此标志。
- OF(Overflow Flag):溢出标志,用于表示是否产生了溢出。
- PF(Parity Flag):奇偶标志,如果操作结果的最低有效字节中1的个数为偶数,则设置此标志。
- AF(Auxiliary Carry Flag):辅助进位标志,用于BCD(二进制编码的十进制)运算。
- DF(Direction Flag):方向标志,用于字符串操作指令,控制SI和DI的增加或减少。
- IF(Interrupt Enable Flag):中断允许标志,控制CPU是否响应外部中断
在我个人的理解中,感觉主要是前面四个标志位用的比较多,后面四个标志位没有如何使用
CF标志位演示
MOV AX, 0FFFFH ; 设置AX为FFFF,一个会导致进位的值
ADD AX, 2 ; 尝试将2加到AX上,会产生进位
JC Carry ; 如果CF=1,则跳转到Carry
; 没有进位,继续执行
JMP NoCarry
Carry:
; 处理进位的情况
JMP End
NoCarry:
; 处理没有进位的情况
JMP End
End:
ZF标志位演示
MOV AX, 10
SUB AX, 10 ; AX的结果为0,设置ZF=1
JZ Zero ; 如果ZF=1,则跳转到Zero
; 结果不为零,继续执行
JMP NonZero
Zero:
; 处理结果为零的情况
JMP End
NonZero:
; 处理结果不为零的情况
JMP End
End:
SF标志位演示
MOV AX, 8000H ; 设置AX为负数(二进制表示为1000 0000 0000 0000)
JNS NotNegative ; 如果SF=0(非负数),则跳转到NotNegative
; 结果为负数,继续执行
JMP Negative
NotNegative:
; 处理非负数的情况
JMP End
Negative:
; 处理负数的情况
JMP End
End:
OF标志位演示
MOV AX, 8000H ; 设置AX为负数(二进制表示为1000 0000 0000 0000)
JNS NotNegative ; 如果SF=0(非负数),则跳转到NotNegative
; 结果为负数,继续执行
JMP Negative
NotNegative:
; 处理非负数的情况
JMP End
Negative:
; 处理负数的情况
JMP End
End:
跳转指令
跳转指令会根据标志位的状态来决定是否跳转到指定的地址继续执行。以下是一些常用的跳转指令:
- JMP:无条件跳转。
- JZ/JE:如果零标志(ZF)为1,则跳转。
- JNZ/JNE:如果零标志(ZF)为0,则跳转。
- JC:如果进位标志(CF)为1,则跳转。
- JNC:如果进位标志(CF)为0,则跳转。
- JS:如果符号标志(SF)为1,则跳转。
- JNS:如果符号标志(SF)为0,则跳转。
- JO:如果溢出标志(OF)为1,则跳转。
- JNO:如果溢出标志(OF)为0,则跳转。
- JP/JPE:如果奇偶标志(PF)为1,则跳转。
- JNP/JPO:如果奇偶标志(PF)为0,则跳转。
- JB/JNAE/JC:如果低于标志(CF)为1或零标志(ZF)为0,则跳转。
- JNB/JAE/JNC:如果低于标志(CF)为0且零标志(ZF)为1,则跳转。
- JBE/JNA:如果低于标志(CF)为1或零标志(ZF)为1,则跳转。
- JNBE/JA:如果低于标志(CF)为0且零标志(ZF)为0,则跳转。