这个标志寄存器似乎很重要,不干掉它,中断这玩意还进行不下去了,但是过于复杂,都是一些跟计算结果相关的位,头痛

(这是别人写的一篇非常好的关于标志寄存器的文章http://blog.csdn.net/wangkehuai/article/details/7337328 ,其实我这是转载 ,只做了一点排版的工作,很惭愧)

其他位不具备任何意义

6个状态标志位

    CF—进位标志,加法时的最高位(D7或D15)产生进位或减法时最高位出现借位,则CF=1,否则CF=0;

    AF—辅助进位标志,供BCD码使用。当D3位出现进位或借位时AF=1,否则AF=0;

    OF—溢出标志,带符号数进行算术运算时,其结果超出了8位或16位的表示范围,产生溢出,则OF=1,否则OF=0;

    ZF—零标志,运算结果各位都为零,则ZF=1,否则ZF=0;

    SF—符号标志,运算结果为负数时,即运算结果的最高位为1,则SF=1,否则SF=0;

    PF—奇偶标志,反映操作结果中“1”的个数的情况,若有偶数个“1”,则PF=1,否则PF=0。

3个控制标志位

   DF—方向标志,用来控制数据串操作指令的步进方向;

    当设置DF=1时,将以递减顺序对数据串中的数据进行处理。当设置DF=0时,递增。

   IF—中断允许标志,当设置IF=1,开中断,CPU可响应可屏蔽中断请求;当设置IF=0时,关中断,CPU不响应可屏蔽中断请求。 

   TF—陷阱标志,为程序调试而设的。当设置TF=1,CPU处于单步执行指令的方式;当设置TF=0时,CPU正常执行程序。

详解:

1、进位标志CF (Carry Flag)

当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF = 1;否则CF = 0。

49H + 6DH=B6H,没有进位:CF = 0

BBH + 6AH=(1)25H,有进位:CF = 1

2、零标志ZF (Zero Flag)

若运算结果为0,则ZF = 1;否则ZF = 0

49H + 6DH=B6H,结果不是零:ZF = 0

75H + 8BH=(1)00H,结果是零:ZF = 1

我就觉得这个东西很操蛋,不是0置1,是0置1,虽然能理解,但是很不爽。

3、符号标志SF (Sign Flag) 

运算结果最高位为1,则SF = 1;否则SF = 0

49H + 6DH=B6H,很明显最高位不是1,所以SF=0

4、奇偶标志PF(Parity Flag)

当运算结果最低字节中“1”的个数为零或偶数时,PF = 1;否则PF = 0;

3AH + 7CH=B6H=10110110B,结果中有5个1,是奇数:PF = 0

5、溢出标志OF (Overflow Flag) (这个要仔细的去理解,涉及有符号运算,这个是有符号运算的溢出)

若算术运算的结果有溢出,则OF=1;否则 OF=0

49H + 6DH =B6H,没有溢出,OF=0;(妈个鸡则,这个竟然溢出了,因为73+109=182,结果用十进制表达是182,超过8位的-128-127,所以溢出了,要慎重啊)

75H + 8BH =(1)00H,产生溢出,OF=1;()

什么是溢出?

处理器内部以补码表示有符号数8位表达的整数范围是:+127~-12816位,表达的范围是:+32767~-32768

如果运算结果超出这个范围,就产生了溢出有溢出,说明有符号数的运算结果不正确

49H+6DH=B6H,就是73+109=182,已经超出-128~+127范围,产生溢出,故OF=1;

另一方面,补码B6H表达真值是-74,显然运算结果也不正确

溢出标志OF和进位标志CF是两个意义不同的标志





进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;

溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。

例1:49H + 6DH=B6H无符号数运算:  

73+109=182范围内,

无进位有符号数运算:73+109=182范围外,有溢出

例2:BBH + 6AH=(1)25H无符号数运算:

    187+106=293范围外,

有进位有符号数运算:-69+106=37范围内,无溢出

溢出的判断判断运算结果是否溢出有一个简单的规则:只有当两个相同符号数相加(包括不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确其他情况下,则不会产生溢出

6、辅助进位标志AF(Auxiliary Flag)

供BCD码使用,运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。

49H + 6DH=B6H,D3有进位:AF = 1

7、方向标志DF(Direction Flag)

用于串操作指令中,控制地址的变化方向:设置DF=0,存储器地址自动增加;

设置DF=1,存储器地址自动减少。

CLD指令复位方向标志:DF=0STD指令置位方向标志:DF=1

8、中断允许标志IF(Interrupt Flag)

用于控制外部可屏蔽中断是否可以被处理器响应:

设置IF=1,则允许中断;

设置IF=0,则禁止中断。

CLI指令复位中断标志:IF=0

STI指令置位中断标志:IF=1

9、陷阱标志TF(Trap Flag)

用于控制处理器进入单步操作方式:

设置TF=0,处理器正常工作;

设置TF=1,处理器单步执行指令。

单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断这种内部中断称为单步中断所以TF也称为单步标志利用单步中断可对程序进行逐条指令的调试这种逐条指令调试程序的方法就是单步调试

EU控制器是执行指令的控制电路,实现从队列中取指令、译码、产生控制信号等。,

CPU标志寄存器的更多相关文章

  1. 8086cpu中的标志寄存器与比较指令

    在8086CPU中有一个特殊的寄存器--标志寄存器,该寄存器不同于其他寄存器,普通寄存器是用来存放数据的读取整个寄存器具有一定的含义,但是标志寄存器是每一位都有固定的含义,记录在运算中产生的信息,标志 ...

  2. CPU的寄存器结构

    计算机的硬件有三个基本要素,CPU.内存和I/O.CPU负责解释.执行程序,从内存或I/O输入数据,在内部进行运算,再把运算结果输出到内存或I/O.内存中存放着程序,程序是指令和数据的集合.I/O中临 ...

  3. 标志寄存器PSW和汇编条件转移指令解释

    标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW)   标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志.8086使用了16位中的9位,包括6个状态标志 ...

  4. 通用32位CPU 常用寄存器及其作用

    目录 32位CPU所含有的寄存器 数据寄存器 变址寄存器 指针寄存器 段寄存器 指令指针寄存器 标志寄存器 32位CPU所含有的寄存器 4个数据寄存器(EAX.EBX.ECX和EDX) 2个变址和指针 ...

  5. 反调试——11——检测TF标志寄存器

    反调试--11--检测TF标志寄存器 在intel的x86寄存器中有一种叫标志寄存器: 标志寄存器中的TF(Trap Flag)位,CPU在执行完一条指令后,如果检测到标志寄存器的TF位为1,则会产生 ...

  6. 标志寄存器在Debug中的表示

    在Debug中,标志寄存器是按照有意义的各个标志位单独表示的. 下面列出Debug对我们已知的标志位的表示.

  7. 计算机cpu、寄存器、内存区别

    1.寄存器是中央处理器内的组成部份.它跟CPU有关.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC). ...

  8. 《汇编语言(第三版)》pushf 和 popf 指令,以及标志寄存器在 Debug 中的表示

    pushf 和 popf pushf 的功能是将标志寄存器的值压栈,而 popf 是从栈中弹出数据,输入标志寄存器. pushf 和 popf,为直接访问寄存器提供了方法. 格式 pushf popf ...

  9. EFLAGS寄存器(标志寄存器)

    这篇文章不是从0开始的,前面还有一些汇编基础指令以及进制,我都没写,时间问题,还是今天空闲,我才想补一下博文,后面我陆续会把前面知识点渐渐补上.我不会重0基础讲起,中间会以.汇编.C.C++交叉的形式 ...

随机推荐

  1. VS2013 密钥

    MXS&Vincene  ─╄OvЁ  &0000017─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好, ...

  2. 搭建android开发环境

    任何一个程序的开端都要从搭建开发环境开始,这样你就可以进行实战练习了,并且搭建完后即快速来一个项目HelloWorld, 哈哈,话不多说了,进入正题 android环境的安装主要分3步骤: 1.下载和 ...

  3. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

    问题分析:错误提示中的“ordinal not in range(128)”,意思是,字符不在128范围内,即说明不是普通的ASCII字符,超出处理能力了. import sys print u'系统 ...

  4. TBB 学习笔记

    #include <tbb/task_scheduler_init.h> #include <tbb/blocked_range.h> #include <tbb/par ...

  5. Linux常用命令(四)

    1.xargs 作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题 语法格式: # xargs [-ni] 常用参数: 参数 参数说明 -n 分组输出,n个分为一组 -i 与大括号 ...

  6. mysql删除带有NULL的行

    假如表A有一列,名字为“Age”,有些行对应的Age为NULL,如果要删除这些行,使用一下语句: delete from A where Age is null;

  7. (7) 深入了解Java Class文件格式(六)

    转载:http://blog.csdn.net/zhangjg_blog/article/details/21888943 经过前几篇文章, 终于将常量池介绍完了, 之所以花这么大的功夫介绍常量池, ...

  8. mac攻略(三) -- apache站点配置

    Mac OS X 中默认有两个目录可以直接运行你的 Web 程序, 一个是系统级的 Web 根目录:/Library/WebServer/Documents/ 此根目录我们平常使用地址http://l ...

  9. [问题2015S07] 复旦高等代数 II(14级)每周一题(第八教学周)

    [问题2015S07]  设 \(A\) 为 \(n\) 阶复方阵, 证明: 存在 \(n\) 阶非异复对称阵 \(S\), 使得 \(A'=S^{-1}AS\), 即 \(A\) 可通过非异复对称阵 ...

  10. [问题2014A08] 复旦高等代数 I(14级)每周一题(第十教学周)

    [问题2014A08]  设 \(A=(a_{ij})\) 为数域 \(\mathbb{K}\) 上的 \(n\) 阶方阵, 定义函数 \[f(A)=\sum_{i,j=1}^na_{ij}^2.\] ...