汇编-标志寄存器
CF进位标志位
一般情况下, 在进行无符号整数运算的时候, 它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
有进位或者借位时CF=1,并且debug显示为CY;
否则CF=0,debug显示为NC
提示:INC和DEC指令不影响进位标志。在非零操作数上应用NEG指令总是会将进位标志置1。
.386 .model flat,stdcall option casemap:none .data var1 word 2 ExitProcess PROTO,dwExitCode:DWORD .code main PROC mov al, 0FFh add al,1 ;AL=00,CF=1有进位 ;FF+1=100h,100h已经超过AL的大小,所以有进位 mov al,1 sub al,1 ;AL=00,CF=0无借位 sub al,1 ;;AL=FF,CF=1有借位 INVOKE ExitProcess,0 main ENDP END main
OF溢出标志位
有符号整数超出目的操作数范围就是溢出
有符号数运算的结果是否发生了溢出:
如果发生溢出,OF=1,debug显示OV
如果没有,OF=0,debug显示NV
.386 .model flat,stdcall option casemap:none .data ExitProcess PROTO,dwExitCode:DWORD .code main PROC mov al,+127 add al,1 ;OF=1,有符号字节范围[-128,127] mov al,-128 sub al,1 ;oF=1 INVOKE ExitProcess,0 main ENDP END main
加法测试当两个操作数相加时,有一个很容易的方法可以用来判断是否发生了有符号数溢出。溢出发生的情况有:
●两个正数相加,结果为负数
●两个负数相加,结果为正数
如果两个加数的符号相反,则永远不会发生溢出
硬件如何检测溢出在加法或减法运算后, CPU用一种有趣的机制来确定溢出标志的状态。将计算结果的最高有效位产生的进位与向最高位产生的进位进行异或操作,异或的结果存入溢出标志。如图4-5所示,两个8位二进制数10000000和11111110相加,产生进位CF=1,而向最高位(位7) 的进位=0。这样, 1 XOR 0=1, 即OF=1。
ZF零标志位
flag的第6位是ZF, 零标志位。它记录相关指令执行后, 其结果是否为0。
如果结果为0,那么zf=1,debug显示ZR
如果结果不为0,那么zf=0,debug显示NZ
.386 .model flat,stdcall option casemap:none .data var1 word 2 ExitProcess PROTO,dwExitCode:DWORD .code main PROC mov ecx, 2 ;ecx=2 sub ecx, 1 ;ZF=0结果不为0 sub ecx, 1 ;ZF=1结果为0 mov eax, 0FFFFFFFFh inc eax ;EAX =0,ZF=1 inc eax ;EAX =1,ZF=0 dec eax ;EAX =0,ZF =1 INVOKE ExitProcess,0 main ENDP END main
SF符号标志位
相关指令执行后,其结果是否为负:
如果结果为负,sf=1,debug显示NG
如果非负,sf=0,debug显示PL
【是否为负】
SF标志, 就是CPU对有符号数运算结果的一种记录, 它记录数据的正负。
在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。
如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。
.386 .model flat,stdcall option casemap:none .data ExitProcess PROTO,dwExitCode:DWORD .code main PROC mov eax, 4 sub eax, 1 ;EAX=3,SF=0 sub eax, 4 ;EAX=-1=FFFFFFFFh,SF=1 ;可以简单地认为,符号标志就是目的操作数最高位的副本 INVOKE ExitProcess,0 main ENDP END main
PF奇偶标志位
在执行一条算术或布尔运算指令后,目的操作数最低有效字节中1的个数是否为偶数。
相关指令执行后:
如果1的个数为偶数,pf=1,debug显示PE
如果为奇数,那么pf=0,debug显示 PO
.386 .model flat,stdcall option casemap:none .data ExitProcess PROTO,dwExitCode:DWORD .code main PROC mov al,10001100b add al,00000010b ;AL =10001110,PF=1 sub al,10000000b ;AL =00001110,PF =0 INVOKE ExitProcess,0 main ENDP END main
AC辅助进位标志位
当目的操作数的最低有效字节中的位3有进位或借位时,辅助进位标志置1
主要用于二进制编码的十进制数(BCD) 算术运算
.386 .model flat,stdcall option casemap:none .data ExitProcess PROTO,dwExitCode:DWORD .code main PROC mov al,0Fh ;0F=1111B add al,1 ;AC =1,位3有进位 INVOKE ExitProcess,0 main ENDP END main
标志位的状态指示
它们本身相当于一个表达式:
CARRY? 表示进位标志位是否置位
OVERFLOW? 表示溢出标志位是否置位
PARITY? 表示奇偶标志位是否置位
SIGN? 表示符号标志位是否置位
ZERO? 表示零标志位是否置位
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2022-11-14 MFC修改工程编码
2022-11-14 MFC创建新项目
2019-11-14 python---硬件序列号