博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
状态标志
阅读量:2432 次
发布时间:2019-05-10

本文共 2829 字,大约阅读时间需要 9 分钟。

  • 状态标志

状态标志一方面作为加减运算和逻辑运算等指令的辅助结果, 另一方面又用于构成各种条件, 实现程序分支, 是汇编语言编程中一个非常重要的方面。

  • 进位标志CF(Carry Flag)

(针对无符号整数)

处理器设计的进 (借) 位标志类似于十进制数据加减运算中的进位和借位,只不过是体现二进制数据最高位的进位或借位。 具体来说, 当加减运算结果的最高有效位有进位 (加法) 或借位 (减法) 时, 将设置进位标志为 1, 即CF=1; 如果没有进位或借位, 则设置进位标志为0,即CF=0. 换句话说, 加减运算后, 如果CF=1, 说明数据运算过程中出现了进位或借位; 如果CF=0, 说明没有进位或借位。
例如,有两个8位二进制数:00111010和01111100。如果将它们相加,运算结果是10110110。 运算过程中, 最高位没有向上再进位, 所以这个运算结果将使得CF=0。 但如果是0101010和01111100相加,结果是[1]00100110,出现了向高位进位(用中括号表示),所以这个运算结果将使得CF=1。
进位标志是针对无符号整数运算设计的, 用于反映无符号数据加减运算结果是否超出范围、是否需要利用进 (借) 位反映正确结果. N位二进制数表达无符号整数的范围是0-2"-1。 如果相应位数的加减运算结果超出了其能够表达的范围,就是产生丁进位或借位。
将上面例子中的二进制数据00111010+01111100=10110110转换成十进制表达是:58+124=182运算结果182仍在0~255范围之内,没有产生进位,所以CF-0。将二进制数据10101010+01111100=[1]00100110转换成十进制表达是:170+124=294=256+38 运算结果294超出了0~255范围, 所以将使得CF-1. 这里, 进位CF=1 表达了十进制数据256。

  • 溢出标志OF(Overflow Flag)

(针对有符号数)

溢出的本意: 一个容器不能存放超过其容积的物体。 同样, 处理器设计的溢出标志用于表达有符号整数进行加减运算的结果是否超出范围。 如果超出范围, 就是有溢出, 将设置溢出标志OF=1; 如果没有溢出, 则OF=0.溢出标志是针对有符号整数运算设计的, 用于反映有符号数据加减运算结果是否超出范围。处理器默认采用补码形式表示有符号整数,N位补码表达的范围是-2"-1~+2"-1-1。如果相应位数的有符号整数运算结果超出了这个范围,就是产生了滥出。
对上面例子的两个8位二进制数: 00111010和01111100, 按照有符号数的补码规则它们都是正整数,用十进制表达分别是:58和124。它们求和的结果是二进制10110110,用十进制表达为58+124=182。 运算结果182超出了-128~+127范围, 产生溢出, 所以OF=1。 另一方面,按照补码规则,8位二进制结果10110110的最高位为1说明它表达的是负数,所以溢出情况下的
运算结果是错误的。
对于二进制数10101010, 其最高位是1, 按照补码规则它表达的是负数, 求反加1 得到绝对值, 即表达十进制数-86。 它与二进制数01111100 (用十进制表达为 124) 相加, 结果是[1]00100110.因为进行的是有符号数据运算, 所以不考虑无符号运算出现的进位,00100110才是需要的结果, 用十进制表示为38( -86+124) 运算结果38没有超出 -128~ +127 范围,没有溢出, 所以OF=0。 因此, 有符号数据进行加减运算, 只有在没有溢出情况下才是正确的。
所以, 溢出标志OF和进位标志CF是两个意义不同的标志。 进位标志表示无符号整数运结果是否超出范围, 超出范围后加上进位或借位运算结果仍然正确; 而溢出标志表示有符号整|数运算结果是否超出范围, 超出范围运算结果不正确。 处理器对两个操作数进行运算时, 按照无符号整数求得结果, 并相应设置进位标志CF; 同时, 根据是否超出有行号整效的范围设量始标志OF。 应该利用哪个标志, 则由程序员来决定。 也就是说, 如果将参加运算的操作数认为无符号数, 就应该关心进位; 而如果将参加运算的操作数认为是有符号效, 则需注意是否溢出。
处理器利用异或门等电路判断运算结果是否溢出。有一个简单规则: 只有当两个相同符号数相加 (含两个不目符号数相减), 而运算结果的符号与原数据符号相反时, 才产生溢出。 这是因为, 此时的运算给果显然不正确。 在其他情况则不会产生澄出。

  • 其他状态标志
  • 零标志ZF (Zero Flag)

反映运算结果是否为0。 运算结果为0,则设置ZF=1,否则ZF=0,例如,8位二进制数00111010+01111100=1010110的结果不是, 所以设置ZF=0. 如果是8位二进制数10000100+01111100= [1]00000000, 最高位的进位由进位标志CF反映, 除此之外的结果是0, 则这个运算结果将使得ZF=1。 注意, 零标志ZF=1说明运算结果是0。

  • 符号标志SF (Sign Flag)

反映运算结果是正数还是负数。 处理器通过符号位来判断数据的正负, 因为符号位是二进制数的最高位, 所以运算结果的最高位 (符号位) 就是符号标志的状态。 也就是说, 运算结果的最高位为1, 则SF=1;否则SF=0。例如, 8位二进制数00111010+01111100=10110110结果的最高位是I,所以设置SF=1.如果是8位二进制数10000100+01111100=[1]00000000,高位是0(进位1不是最高位), 则这个运算结果将使得SF=0。

奇偶标志PF(Parity Flag)反映运算结果最低字节中 “1” 的个数是偶数还是奇数, 以便于用软件编程实现奇偶校验。 最低字节中 “1” 的个数为零或偶数时, PF=1;最字节中 “1” 的个数为奇数时,PF=0.例如,8位二进制数00111010+0111110010110110的结果中 “1” 的个数为5, 是奇数,故设置PF=0。 如果是8位二进制数10000100+01111100= [1]00000000. 除进位外的结果是0个 “1”, 则这个运算结果将使得PF=1. 注意, 即使是进行16位或32位操作,PF标志也仅反映最低8位中 "1” 的个数是偶数还是奇数。***
加法运算对标志的 影响

  • 调整标志AF(Adjust Flag)

反映加减运算时最低半字节有无进位或错位. 最低半字节有进位或借位时,AF=1;否则AF=0。这个标志主要由处理器内部使用,用于十进制算术运算的调整指令,一般不必关心。例如,8位二进制数00111010+01111100=10110110,低4D位向D.位) 有进位, 所以AF=1。

转载地址:http://qitmb.baihongyu.com/

你可能感兴趣的文章
jsp与servlet的作用以及区别--为什么说JSP底层就是一个Servlet
查看>>
看HashMap源码前的必备冷知识,白话文式教学,适合刚开始了解源码的新手观看
查看>>
Oracle安装指南
查看>>
Redis面试必备(一)
查看>>
Cookie对象入门详解
查看>>
HashMap的remove()方法详解
查看>>
单例模式-分解步骤,逐步解析
查看>>
通过Form表单一次性拿到json格式数据,及后台接收
查看>>
## EL表达式与JSTL标签用法解读
查看>>
Mybatis异常:The content of elements must consist of well-formed.......(一般出现在写分页/带大于小于号的SQL)
查看>>
Mybatis光速入门(配置文件模块)
查看>>
关于Oracle的主键自增如何设置
查看>>
手撕HashMap的resize()方法源码渗透解析+图解
查看>>
Mybatis常见异常类型Could not set parameters for mapping离不开这个原因!
查看>>
Thymeleaf中一个页面怎么嵌套另一个页面,关于页面嵌套,标签告诉你应该知道的
查看>>
JAVA如何实现短信验证码--阿里云接口,新手式图文教学,个人项目有这一篇就够了
查看>>
Java中大小数BigDecimal的加减乘除用法及场景的详细介绍,看完不信你还会报Syntax error on token “+/-/*“, invalid AssignmentOperat异常
查看>>
UVa 10917 Dijkstra
查看>>
CF403B/CF402D
查看>>
CF402E / 403C
查看>>