转载 标志寄存器总结

原文地址http://blog.csdn.net/pplsunny/article/details/8126308

标志寄存器flag

15   14   13   12   11   10   09   08   07    06   05   04    03   02    01    00

 0     0     0     0    of    df    if      tf     sf     zf     0    af     0     pf     0      cf

 

ZF是flag的第6位,零标志位,判断结果是否为0,结果为0,ZF=1   

PF是flag的第2位,奇偶标志位,运算结果二进制数中1的个数为偶数,PF=1   

SF是flag的第7位,符号标志位,有符号数 运算结果为负数,SF=1   

CF是flag的第0位,进位标志位,无符号数 运算结果有进/借位,CF=1 

OF是flag的第11位,溢出标志位,有符号数 运算结果溢出,OF=1 

DF是flag的第10位,方向标志位,DF=0 每次操作后 si,di递增 

                              DF=1 每次操作后 si,di递减

TF是flag的第8位,TF=1,产生单步中断,引发中断过程

IF是flag的第9位,IF=1,CPU响应中断,引发中断过程

                 IF=0,不响应可屏蔽中断

 

add、sub、mul、div 、inc、or、and等运算指令影响flag

mov、push、pop等传送指令对flag没影响

 

abc  带位加法指令,利用CF位上记录的进位值

abc ax,bx 实现功能(ax)=(ax)+(bx)+CF

 

sbb  带位减法指令,利用CF位上记录的借位值

sbb ax,bx 实现功能(ax)=(ax)-(bx)-CF

 

cmp  比较指令,相当于减法指令,不保存结果,只影响flag相关各位

cmp ax,bx    如果(ax)=(bx), 则 zf=1

             如果(ax)≠(bx), 则 zf=0

             如果(ax)<(bx), 则 cf=1

             如果(ax)≥(bx), 则 cf=0

             如果(ax)>(bx), 则 cf=0且zf=0

             如果(ax)≤(bx), 则 cf=1或zf=1

如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正

如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负

 

cmp指令和条件转移指令配合使用

   指令         含义            检测的相关标志位

   je           等于则转移      zf=1

   jne          不等于则转移    zf=0

   ja           高于则转移      cf=0且zf=0

   jb           低于则转移      cf=1

   jna          不高于则转移    cf=1或zf=1

   jnb          不低于则转移    cf=0

 

[…]是闭区间,包括两端点的值 

(…)是开区间,不包括两端点的值

 

DF标志和串传送指令

   DF 方向标志位,在串处理指令中,控制每次操作后si、di的增减

   df=0  每次操作后si、di递增

   df=1  每次操作后si、di递减

movsb:

   相当于mov es:[di],byte ptr ds:[si]

   如果 df=0              如果 df=1

   inc di                 dec di

   inc si                 dec si

movsw:

   相当于mov es:[di],word ptr ds:[si]

   如果 df=0              如果 df=1

   add si,2               sub si,2

   add di,2               sub di,2

movsb或movsw和rep配合使用,格式如下:

   rep movsb

   相当于

   s:movsb

      loop  s

   rep的作用是根据cx的值,重复执行rep后面的串传送指令 

 

cld  将标志寄存器中的DF位置0,(配合movsb,则是正向传送)

std  将标志寄存器中的DF位置1,(配合movsb,则是反向传送)

 

pushf    标志寄存器的值压栈

popf 标志寄存器的值出栈

 

标志位在debug中的表示

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000

DS=****  ES=****  SS=****  CS=****  IP=0100  NV  UP  EI  PL  NZ  NA  PO  NC

flag                                                of    df         sf   zf        pf    cf

值为1的标记                                 OV  DN      NG  ZR      PE  CY

值为0的标记                                 NV  UP       PL  NZ       PO  NC

 

确定补码:

Xh为8位,X∈(80h,ffh),则Xh是(Xh-256)的补码

Xh为16位,X∈(8000h,ffffh),则Xh是(Xh-65535)的补码

posted @ 2012-12-25 16:18  Black Man's Note  阅读(160)  评论(0编辑  收藏  举报