Intel 标志寄存器

/*
 * 标志寄存器:
 */
    标志寄存器又称作程序状态字(Program Status Word, 记作: PSW).
    分两组:
        一组: 条件标志位,记载运算结果的特征 :
                CF --- 进位标志.记录加法运算的进位值,或者减法运算的借位值.
                ZF --- 零标志.记录运算结果是否为0.
                SF --- 符号标志.记录运算结果的正负情况.
                OF --- 溢出标志.记录运算结果是否超出带符号数的表示范围.
                PF --- 奇偶标志.记录字节型运算结果中有厅数个1还是偶数个1.
                AF --- 辅助进位标志.记录加/减法运算中后4 位向前有无进/借位.
                其中前四个标志位至关重要,与汇编语言中分支和循环结构程序设计密切的联系.
        二组: 控制标志位:
                TF --- 单步中断允许标志,又称跟踪标志.表示系统当前是否允许单步中断.
                IF --- 外中断屏标志.表示系统当前是否允许可屏蔽外中断.
                DF --- 方向标志.表示串操作按吉增量方向还是按减量方向进行.
                  TF IF 涉及中断系统, DF影响串操作指令的执行方式.
    标志寄存器          
        FR--flag register(程序状态字PSW--program status word),PSW常用的标志有:    
        标志                值为1时的标记      值为0时的标记      说明
        OF(overflow flag)   OV(overflow)     NV(not overflow) 溢出标志 操作数超出机器能表示的范围表示溢出.溢出时为1.
        ZF(zero flag)       ZR(zero)         NZ(not zero)     零标志 运算结果等于0时为1.否则为0.
        PF(parity flag)     PE(parity even)  PO(parity odd)   奇偶标志 运算结果操作数位为1的个数为偶数个时为1.否则为0.
        CF(carry flag)      CY(carried)      NC(not carried)  进位标志 最高有效位产生进位时为1.否则为0.
        DF(direction flag)  DN(down)         UP(up)           方向标志 用于串处理.DF=1时.每次操作后使SI和DI减小.DF=0时则增大.
        SF(sign flag)       NG(negtive)      PL(plus)         符号标志 记录运算结果的符号.结果负时为1.
        TF(trap flag)                                         陷阱标志 用于调试单步操作.
        IF(interrupt flag)                                    中断标志 IF=1时.允许CPU响应可屏蔽中断.否则关闭中断.
        AF(auxiliary flag)                                    辅助进位标志 运算时.第3位向第4位产生进位时为1.否则为0.


    CF(进位/借位标志) =1 算术操作最高位产生了进位或借位
                        =0 最高位无进位或借位 ;

                    进位(无符号溢出)为1,有符号溢出为0
                    把机器数都当作无符号数看

                    两数相加,如果最高位有进位,则CF=1,否则为0
                    两数相减,如果被减数最高位有借位,则CF=1,否则为0

    PF(奇偶标志)    =1 数据最低8位中1的个数为偶数
                    =0 数据最低8位中1的个数为奇数;

    AF(辅助进位标志)    =1 D3→D4位产生了进位或借位
                        =0 D3→D4位无进位或借位;

                        运算过程中看最后四位,不论长度为多少,最后四位向前有进位或者借位,则AF=1,否则,AF=0。

    ZF(零标志)        =1 操作结果为0
                    =0 结果不为0;

        test ecx, ecx
        jz somewhere        // 如果ecx&ecx=0,设置ZF零标志为1,jz跳转,   jnz不跳转。
                            // 如果ecx&ecx=1,设置ZF零标志为0,jz不跳转, jnz跳转。

        cmp 主要用于比较两数的关系,可以在有符号数和无符号数之间进行比较。
        两数相等影响ZF标志,无符号数影响CF标志,有符号数影响SF和OF标志。
        类似于高级语言的IF-ELSE结构。所有的有条件转移指令都可以用在这条指令之后。

        test通常用于检测某些位是否为1,但又不希望改变操作数的场合。

        test AL,01000100b,如果这两个位全为0.则ZF的值为1,否则清0,那么根据标志位设置的跳转就只能为jz或jnz

    SF(符号标志)    =1 结果最高位为1
                    =0 结果最高位为0;

    OF(溢出标志)    =1 此次运算发生了溢出
                    =0 无溢出。

                    把机器数都当作有符号数看

                    只有当两个相同符号的数相加(含两个不同符号的数相减),而运算结果的符号与原数符号相反时,产生溢出,OF为1。

                    (根据最高位进位和次高位进位求异或的方法是实际硬件的判断方式)
                    例如8位二进制数相加:1001 1100B+0001 1000B 结果为 1011 0100B 此时无进位CF=0,PF=1,AF=1,ZF=0,SF=1,OP=0。

    /* example */
    1. 87H=1000 0111B,F5H=1111 0101B,结果=0111 1100B。

        SF=0(最高位是什么,ZF就是什么);
        ZF=0(结果为0,ZF就置1);
        CF=1(最高位有进位或借位就置1);
        OF=1(两个负数相加变成正数,溢出);
        PF=0(反映结果"1"的个数,奇数个"1"就为0,偶数个"1"就为1)


    2. (2018年408真题) 减法指令"sub R1, R2, R3"的功能为"(R1) - (R2)→R3",
    该指令执行后将生成进位/借位标志 CF 和溢出标志 OF。若(R1) = FFFF FFFFH,(R2) = FFFF FFF0H,
    则该减法指令执行后,CF 与 OF 分别为( )。        
        
        A. CF = 0, OF = 0
        B. CF = 1, OF = 0
        C. CF = 0, OF = 1
        D. CF = 1, OF = 1

        把他们当成无符号数看,显然(R1)大于(R2),所以(R1)-(R2)无借位,CF=0
        把他们当成有符号数看,符号相同(都是负数)相减,不可能溢出,OF=0

你可能感兴趣的:(Assembly,汇编)