汇编-标志寄存器

 

 

 

 

 

 

 

 

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?                    表示零标志位是否置位

 

 

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2022-11-14 MFC修改工程编码
2022-11-14 MFC创建新项目
2019-11-14 python---硬件序列号
点击右上角即可分享
微信分享提示

目录导航