标志寄存器综述

转载自: http://www.cnblogs.com/dennisOne/archive/2012/10/23/2736238.html

?标志寄存器综述

  1. 8086CPU的标志寄存器(flags Register, FR)有16位,其中存储的信息通常被称为程序状态字(PSW),flag寄存器与其他寄存器不同,flag寄存器是按位起作用的。8086的flag寄存器中有CF、PF、ZF、SF、OF、DF标志位。

  2. 8086的FR的9个标志位


    标志位


    名称


    功能


    ZF


    零标志位(Zero Flag)


    判断结果是否为0。运算结果0,ZF置1,否则置0。


    PF


    奇偶标志位(Parity Flag)


    反映运算结果8位中‘1‘的个数。‘1‘的个数为偶数,PF置1,否则置0。


    SF


    符号标志位(Sign Flag)


    反映运算结果的符号。运算结果为负,SF置1,否则置0。


    CF


    进位标志位(Carry Flag)


    反映无符号运算是否产生进位或借位。运算结果的最高有效位向更高位进位或者借位,CF置1,否则置0。


    OF


    溢出标志位(Overflow Flag)


    反映有符号运算是否溢出。运算结果超过了8位或者16位有符号数的表示范围,OF置1,否则置0。


    AF


    辅助进位标志位(Auxiliary Flag)


    在字节操作时低半字节向高半字节进位或借位。字操作时低字节向高字节进位或借位,AF置1,否则置0。


    DF


    方向标志位(Direction Flag)


    决定串处理指令控制每次操作后si、di的增减。df=0,则每次操作后si、di递增,否则递减。


    IF


    中断标志位(Interrupt Flag)


    决定CPU是否响应外部可屏蔽中断请求。IF为1时,CPU允许响应外部的可屏蔽中断请求。


    TF


    陷阱标志位(Trap Flag)


    TF被设置位1时,CPU进入单步模式,所谓单步模式就是CPU在每执行一步指令后都产生一个单步中断。主要用于程序的调试。8086/8088中没有专门用来置位和清零TF的命令。

  3. 影响标志位的指令
    • 在8086CPU的指令集中,诸如add/sub/mul/div/inc/or/and这些逻辑或者算术运算影响FR;而诸如mov/push/pop等传送指令的执行不影响FR。
    • 执行一条指令,要注意这条指令的全部功能(特别是cmp),执行结果对FR的那些标志位造成影响。
    • 某些指令将影响FR中的多个标志位。
  4. 修改标志位的常用方法
    • pushf和popf提供了直接访问标志寄存器的一种方法。

      pushf的功能是将标志寄存器的值压栈;而popf是从栈中弹出数据。比如:

      pushf ; 将FR的值压栈

      pop ax ; (ax)=(FR)

      ; 处理ax

      push ax ; 将修改后的(ax)压栈

      popf ; (FR)=(ax)

    • sub ax, ax 可以将CF设置为0,ZF设置为0。
    • 修改DF

      cld ; 将DF置为0

      std ; 将DF置为1

  5. FR在debug中的表示


标志位


=1


=0


ZF


ZR[Zero]


NZ[Not Zero]


PF


PE[Parity Even]


PO[Parity Odd]


SF


NG[Negative]


PL[Plus]


CF


CY[Carry]


NC[No Carry]


OF


OV[Overflow]


NV[Not Overflow]


AF


AC[Auxiliary Carry]


NA[No Auxiliary Carry]


DF


DN[Down]


UP[UP]


IF


EI[Enable Interrupt]


DI[Disable Interrupt]


TF


------------------------------


--------------------------------

?从CPU的角度看待指令

以下列指令进行讲解:

mov al, 10000001B

add al, 1

  • CPU在执行add等指令的时候,就已经包含了两种含义(有符号和无符号运算),也将得到同一种信息来记录的两种结果。关键在于我们的程序需要哪一种结果。
  • 通过FR的PSW,我们可以根据需要来看待指令进行的运算。
  • 可以讲add指令进行的运算当做无符号数的运算,那么add指令相当于计算129+1,结果是130(10000010B);也可以将add指令进行的运算当做有符号的运算,那么add指令相当于-127+1,结果也就是-126(10000010B)。

?adb指令和sbb指令


指令


指令格式


功能


示例


带进位加法指令adc


adc op1, op2


op1=op1+op2+CF


adc ax,bx


带借位减法指令sbb


sbb op1, op2


op1=op1-op2-CF


sbb ax,bx

Q: 编写一个程序,对两个128位数据进行相加。

 1 assume cs:code, ds:code
 2
 3 data segment
 4     db 88h, 88h, 88h, 88h, 88h, 88h, 88h, 88h, 88h, 88h, 88h, 88h, 88h, 88h, 88h, 88h
 5     db 11h, 11h, 11h, 11h, 11h, 11h, 11h, 11h, 11h, 11h, 11h, 11h, 11h, 11h, 11h, 11h
 6 data ends
 7
 8 code segment
 9 start:  mov ax, data
10         mov ds, ax
11         mov si, 0
12         mov di, 8
13
14         mov cx, 8
15
16         call add128
17
18         mov ax, 4c00h
19         int 21h
20
21 add128: ; 子程序开始
22         push ax
23         push cx
24         push si
25         push di
26
27         sub ax, ax        ; 将CF置0
28
29         mov cx, 8
30     s:  mov ax, [si]
31         adc ax, [di]
32         mov [si], ax
33         inc si          ; inc不会影响CF的值;但是add si,2会影响CF的值
34         inc si
35         inc di
36         inc di
37         loop s
38
39         pop di
40         pop si
41         pop cx
42         pop ax
43
44         ret
45 code ends
46 end start

?DF标志和串传递指令


指令


功能


解释


movsb


传送字节单元


mov es:[di], byte ptr ds:[si] ;8086不支持这样的指令,这里示意

如果df=0

inc si

inc di

如果df=1

dec si

dec di


movsw


传送字单元


mov es:[di], word ptr ds:[si] ;8086不支持这样的指令,这里示意

如果df=0

add si, 2

add di, 2

如果df=1

sub si, 2

sub di, 2


rep movsb


串传送


s: movsb

loop s

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


rep movsw


串传送


s: movsw

loop s

?cmp指令

  1. cmp指令概述

    cmp是比较指令,cmp的功能相当于减法指令,但是不保存结果[猜测:CPU可能使用不能被外界使用的某个寄存器进行暂存?]。cmp指令执行后,将对标志寄存器产生影响。


指令格式


功能


示例


cmp op1, op2


计算op1-op2,但不保存结果,仅仅根据结果对标志寄存器产生影响。


cmp ax, ax
执行指令后:zf=0,pf=1,sf=0,cf=0,of=0

  1. 和sub指令一样,CPU在执行cmp指令时,也包含两种含义:进行无符号数和有符号数运算。
  2. cmp ax, bx当做"无符号数运算"的含义[根据zf和cf进行解释]

    反过来:

    根据无符号数的比较结果进行转移的条件转移指令(短转移)的原理就是基于上表。

  3. cmp ax, bx当做"有符号数运算"的含义[根据zf/sf/of进行解释]

    【公理】:进行有符号数运算时,如果发生溢出(of=1),说明实际运算结果与逻辑运算结果不等;如果没有溢出(of=0),说明实际运算结果与逻辑运算结果一致。

?cmp指令和条件转移指令的联合使用

总结:题(1)中"等于"和题目(2)中"大于"需要进行特别处理,所以应该讲"不等于"和"不大于"的直接跳出,这样可以使得程序更加简洁。

时间: 2024-10-07 14:07:49

标志寄存器综述的相关文章

汇编语言(王爽) 第11章 标志寄存器

这里讲一个特殊的寄存器,flag 先看flag的16位显示 11.1 zf 指令执行后,结果0,ZF=1 指令执行后,结果不为0,ZF=0 11.2 pf 指令执行后,所有bit位中1的个数是否位偶数,若为偶数,那么pf=1 若为奇数,pf=0 11.3 sf 指令执行后,结果负,SF=1 指令执行后,结果不为负,SF=0 11.4 cf 进位 若出现进位,那么CF=1 没有的话CF=0 11.5 of 溢出, 数字的溢出. 8位范围是-128-127 若130就是溢出了 11.6 abc指令

标志寄存器

段寄存器,通用寄存器,隐藏寄存器.这节课再学一个寄存器,叫做标志寄存器. 旗帜标志寄存器(EFLAGS): 主要用于反映处理器的状态和运算结果的某些特征及控制指令的执行. 这话太专业了,我们用大白话给大家举个例子.在CPU里面,有一些指令运行完之后,会把一些运行完的情况放到标志寄存器里面.另外一些指令会根据标志寄存器的一些情况决定如何运行. 大家都知道快过年了,小偷们喜欢偷东西要过年.为了能够提高团队作案的效率,两个小偷组团.第一个小偷负责踩点.第二个小偷负责偷东西. 第一个小偷出去踩点,如果发

标志寄存器(学习汇编)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向标志 中断允许标志 单步标志 符号标志 零标志 未使用 辅助标志 未使用 奇偶标志 未使用 进位标志 1.CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都有可能不同)具有以下3种作用. (1)用来存储相关指令的某些执行结果: (2)用来为CPU执行相关指令提供行为依据: (3

CPU的标志寄存器

高一时,学校组织去韶山游玩,我没去,这次趁着五一,总算去了我心心念念的韶山.其实我知道所有的景点都是差不多的,可是因为电视剧<恰同学少年>,让我对毛泽东有了进一层的了解,所以,我一直都想去看看. 有两个同学一男一女是我理想的旅友,可是女生不想去,而男士回家了.所以,我独自一人去了. 准备工作:一小包饼干,一小包山楂片,两个苹果,一瓶水,帽子(防晒),墨镜(装酷) 早晨5:30起床了,洗漱完毕,吃完早餐,赶到公交车站牌那里,才6点过几分.公交车6:31才到,等了近半个小时(公交车上明明说是6:0

标志寄存器9中标志

一.运算结果标志位 1.进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位.如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0. 使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等. 2.奇偶标志PF(Parity Flag) 奇偶标志PF用于反映运算结果中“1”的个数的奇偶性.如果“1”的个数为偶数,则PF的值为1,否则其值为0. 利用PF可进行奇偶校验检查,或产生奇

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

标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW)   标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志.8086使用了16位中的9位,包括6个状态标志位和3个控制标志位. CF(进位标志位):当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0.ZF零标志位:若当前的运算结果为零,则ZF为1,否则为0.SF符号标志位:该标志位与运算结果的最高位相同.即运算结果为负,则SF为1,否则为0.OF溢出标志位:若运算结果超出机器能

学 Win32 汇编[20]: 洞察标志寄存器

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向标志 中断允许标志 单步标志 符号标志 零标志 未使用 辅助标志 未使用 奇偶标志 未使用 进位标志 上表是 32 位寄存器 EFLAGS 的低 16 位. 不能直接读写 EFLAGS, 但有些方便的指令, 如:LAHF: 读取EFLAGS 低 8 位到 AH; SAHF 是 LAHF 的反向操作.

汇编入门学习笔记 (十)—— 标志寄存器

疯狂的暑假学习之  汇编入门学习笔记 (十)--  标志寄存器 参考: <汇编语言> 王爽 第11章 CPU内部有一种特殊的寄存器叫标志寄存器(flag),它与ax,bx,cx等其他寄存器不同,它不是用来存放数据的,而是用来存放状态的.flag寄存器是按位器作用的,即只有0和1. flag寄存器的结构: 15     14    13    12     11     10     9     8     7     6     5     4     3     2     1     0

汇编语言学习第十一章-标志寄存器

本博文系列参考自<<汇编语言>>第三版,作者:王爽 8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW).除了前面介绍的寄存器.本博文将介绍最后一个寄存器,标志寄存器.不同于之前的寄存器,标志寄存器是按位起作用的.其每一位都有特殊的含义. 8086标志寄存器的结构如下图所示: 标志寄存器的1,3,5,12,13,14,15都没有特殊含义.其0,2,4,6,7,8,9,10,11用作标志位使用. 11.1 ZF标志(zeros flag) 标志寄存器第6位