汇编网首页登录博客注册
as555as的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  `人生得不得意都须尽欢. !
  • 『姓名』:一个人
  • 『性别』:男『发送消息
  • 个人说明:我是一个缺乏方向感的人` ! 同时我又是一个没有方向就不会前进的人`!!!
  • 详细信息『加为好友』
学习动态
最新留言
文章收藏
友情链接

[2009-10-09 00:15] 第十一章标志寄存器(FLAG)的ZF、PF、SF、CF、OF的笔记

ZF标志位:
FLAG的第六位,零标志位.他记录相关指令执行后,其结果是否为0,如果结果为0,那么ZF=1;如果结果不为0,那么ZF=0.
举例1:
mov ax,1
sub ax,1
执行后,(ax)=0,则zf=1.
举例2:
mov ax,2
sub ax,1
执行后,(ax)=1,则zf=0.

知识重点:
对于ZF的值,ZF标记记录相关指令的计算结果是否为0,如果为0,则ZF要记录下"是0"这样的肯定信息,在计算机中1表示逻辑真,表示肯定,所以当结果为0的时候ZF=1,表示"结果是0".如果结果不为0,则ZF要记录下"不是0"这样的否定信息.在计算机中0表示逻辑假,表示否定,所以当结果不为0的时候ZF=0,表示"结果不是0".
=======================================================
PF标志位:
FLAG的第二位,奇偶标志位,他记录相关指令执行后,其结果的所有BIT位中1的个数是否为偶数.如果1的个数为偶数,PF=1;如果1的个数为奇数,PF=0.
举例1:
mov al,1
add al,10
执行后,结果为00001011B,其中有3(奇数)个1,则PF=0.
举例2:
mov al,1
or al,2
执行后,结果为00000011B,其中有2(偶数)个1,则PF=1.
举例3:
sub al,al
执行后,结果为00000000B,其中有0(偶数)个1,则PF=1

知识重点:
PF标志位记录的是结果的所有bit位中1的个数是否为偶数,而非结果是否为偶数.比如结果为1时,PF为0.结果为2时,PF同样为0.结果为3时,PF为1.结果为0时,PF=1.0为偶数.
=======================================================
SF标志位:
FLAG的第7位,符号标志位.它记录相关指令执行后,其结果是否为负.如果结果为负,SF=1;如果非负,SF=0.
举例1:
mov al,10000001B
add al,1
执行后,结果为10000010B,SF=1,表示:如果指令进行的是有符号数运算,那么结果为负;
举例2:
mov al,10000001B
add al,01111111B
执行后,结果为0,SF=0,表示:如果指令进行的是有符号数运算,那么结果为非负.

知识重点:
以我们的角度看,对于同一个二进制数据,计算机可以将它当作无符号数据来运算,也可以当作有符号数据来运算.
可是以SF标志位的角度来看,对于同一个二进制数据,计算机肯定是将他当作有符号数来运算.对于有符号数的结果是否为负的判定,只要二进制数据的最高位为1,即为负数.SF就肯定为1.对于有符号数运算结果溢出,取溢出后的结果的最高位进行判断.
=======================================================
CF标志位:
FLAG的第0位,进位标志位.一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高有效位的进位值,或从更高位的借位值
举例1:
mov al,98H
add al,al
执行后,(al)=30,CF=1,CF记录了从最高有效位向更高位的进位值.
add al,al 
执行后,(al)=60,CF=0,CF记录了从最高有效位向更高位的进位值.
举例2:
mov al,97H
sub al,98H
执行后,(al)=FF,CF=1,CF记录了向更高位的借位值.
sub al,al 
执行后,(al)=0,CF=0,CF记录了向更高位的借位值.

知识重点:
CF是对无符号书运算有意义的标志位.
当两个数相加的时候,有可能产生从最高有效位向更高位的进位值.比如,两个8位数据:98H+98H,将产生进位.由于这个进位值在8位数中无法保存,所以CPU在运算的时候将它记录在一个特殊的寄存器的某一位上.8086CPU就用FLAG的CF位来记录这个值.
而当两个数据做减法的时候,有可能向更高位借位.比如,两个8位数据:97H-98H,讲产生借位,借位后,相当于计算197H-98H.而FLAG得CF位也可以用来记录这个借位值.
个人理解:
进位和借位都是以存储器最大数+1为基础.8位寄存器的最大数FF进位和借位的结果为FF+1=100H.16位寄存器的最大数FFFF进位和借位的结果为FFFF+1=10000H.
=======================================================
OF标志位:
FLAG的第11位,溢出标志位.一般情况下,OF记录了有符号数运算的结果是否发生了溢出.如果发生溢出,OF=1;如果没有,OF=0.
举例1:
mov al,98
add al,99
执行后,CF=0,OF=1.CPU在执行add指令的时候包含两种意义:无符号数运算和有符号数运算.对于无符号数,98+99没有进位,CF=0;对于有符号数,98+99发生溢出,OF=1.
举例2:
mov al,0F0H
add al,88H
执行后,CF=1,OF=1.对于无符号书运算,0F0H+88H有进位,CF=1;对于有符号数运算,0F0H+88H发生溢出,OF=1.
举例3:
mov al,0F0H
add al,78H
执行后,CF=1,OF=0.对于无符号书运算,0F0H+78H有进位,CF=1;对于有符号数运算,0F0H+78H发生溢出,OF=0.

知识重点:
从举例中可以看出,CF和OF所表示的进位和益出,是分别对无符号数和有符号数而言的,他们之间没有任何关系.
这里是我个人的理解:
所谓溢出,是指寄存器装不下有符号数运算后的结果.而OF=1 则是为了让寄存器装不下的运算结果以补码显示的一种标记,实质上他们的二进制表示形式是相同的.至于对溢出后的结果的算术意义我还不是很清楚.
=======================================================

总结:
在8086CPU的指令集中,有的指令的执行时影响标志寄存器的,比如,add、sub、mul、div、inc、or、and等,他们大都是运算指令(进行逻辑或算术运算);有的指令的执行对标志寄存器没有影响,比如,mov、push、pop等,他们大都是传送指令.在使用一条指令的时候,要注意这条指令的全部功能,其中包括,执行结果对标志寄存器的哪些标志位造成影响.
某些指令将影响标志寄存器中的多个标记位,这些被影响的标记位比较全面地记录了指令的执行结果,为相关的处理提供了所需的依据.比如指令sub al,al执行后,ZF、PF、SF等标记位都受到影响,他们分别为1、1、0.
就目前学到的这五个标志位ZF,PF,SF,CF,OF来讲,无论执行的怎样的指令,不管是有符号数还是无符号数,也无论是正数还是负数,全部是以结果来判定相关标志位值是否为1.而且结果的长度和装载的寄存器长度相关,受指令的语法影响.比如
mov al,12
mul al
这条乘法指令在我初次接触的时候我认为执行后的结果144,换成二进制为10010000,所以ZF=0,PF=1,SF=1.
可是,其实数据虽然通过的是8位寄存器al传递,不过8位乘法运算的结果保存在16位寄存器AX中,所以执行后ZF=0,PF=1,SF=0.
-------------------------------------------------------
知识重点和总结的地方是我在学习过程中遇到的问题,和产生疑虑的地方.在这里写出来一是为了让自己记忆牢固,同时也希望与同样遇到这些问题的朋友分享我的学习过程.如果有理解不正确的地方敬请指正!
评论次数(0)  |  浏览次数(462)  |  类型(学习心得) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码