汇编语言——标志寄存器

标志寄存器

flag 和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。

而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。

8086CPU的flag寄存器的结构:

ZF标志

flag的第6位是ZF,零标志位(zero flag)。

它记录相关指令(add、sub、mul、div、inc、or、and操作)执行后,结果是否为0 。ZF = 1结果不为0,ZF = 0结果为0。

mov、push、pop等传送指令不修改标志寄存器的信息。

PF标志

flag的第2位是PF,奇偶标志位。

它记录指令执行后,结果的所有二进制位中1的个数是否为偶数,如果为偶数则PF = 1,为奇数,PF = 0。

SF标志

flag的第7位是SF,符号标志位。

它记录指令执行后,结果是否为负(就是看它二进制的第一位是不是1),如果为负数则SF = 1,结果为正,SF = 0。

例如:

我们可以将add指令进行的运算当作无符号数的运算,那么add指令相当于计算129+1,结果为130(10000010B),

也可以将add指令进行的运算当作有符号数的运算,那么add指令相当于计算-(125+1)(补码=-(原码取反+1)),结果为-126(10000010B)。

CF标志

flag的第0位是CF,进位标志位。

一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值

比如,两个8 位数据:98H+98H,将产生进位

由于这个进位值在8位数中无法保存,其实CPU在运算的时候,并不丢弃这个进位值,而是记录在一个特殊的寄存器的某一位上。

8086CPU 就用flag的CF位来记录这个进位值

比如,两个 8 位数据:97H-98H,将产生借位,借位后,相当于计算197H-98H。

flag的CF位也可以用来记录这个借位值

CF在减法时记录借位,加法时记录进位

判断加法是否有进位:两个八位数据相加是否大于255(2^8)

判断减法是否有借位:两个八位数据相加是否小于-255

OF标志

在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。

mov al,98

add al,99

add指令运算的结果是(al)=0C5H ,因为进行的是有符如果我们用add 指令进行的是有符号数运算,则98+99=-59这样的结果让人无法接受。

造成这种情况的原因,就是实际的结果 197,作为一个有符号数,在 8 位寄存器al中存放不下。

由于在进行有符号数运算时,可能发生溢出而造成结果的错误。

则CPU需要对指令执行后是否产生溢出进行记录。

flag的第11位是OF,溢出标志位。

一般情况下,OF记录了有符号数运算的结果是否发生了溢出。如果发生溢出,OF=1,如果没有,OF=0。

一定要注意CF和OF的区别:

CF是对无符号数运算有意义的标志位,对于无符号数运算,CPU用CF位来记录是否产生了进位;

而OF是对有符号数运算有意义的标志位,对于有符号数运算,CPU 用 OF 位来记录是否产生了溢出,当然,还要用SF位来记录结果的符号。

判断OF是否为1的方法:如果两个正8位数据相加,值为负数时或两个负8位数据相加,值为时数时OF的值为1

 1               al                 CF    OF    SF    ZF    PF
 2 sub al,al     0h/0000 0000b      0     0     0     1     1
 3 mov al,10h    10h/0010 0000b     0     0     0     1     1
 4 add al,90h    a0h/1010 0000b     0     0     1     0     1
 5 mov al,80h    80h/1000 0000b     0     0     1     0     1
 6 add al,80h    0h/0000 0000b      1     1     0     1     1
 7 mov al,0fch   0fch/1111 1100b    1     1     0     1     1
 8 add al,05h    1h/0000 0001b      1     0     0     0     0
 9 mov al,7dh    7dh/1111 1101b     1     0     0     0     0
10 add al,0bh    88h/1000 1000b     0     1     1     0     1

指令

adc指令

adc是带进位加法指令 ,它利用了CF位上记录的进位值。

格式:adc 操作对象1,操作对象2

功能:操作对象1=操作对象1+操作对象2+CF

比如:adc ax,bx 实现的功能是:(ax)=(ax)+(bx)+CF

我们来看一下两个数据:0198H和0183H如何相加的:

01 98

+ 01 83

1

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

03 1B

可以看出,加法可以分两步来进行:

(1)低位相加;

(2)高位相加再加上低位相加产生的进位值。

下面的指令和add ax , bx具有相同的结果:

add al,bl   ; 低位相加产生进位

adc ah,bh  ; 再用adc,高位相加时,加上进位

看来CPU提供 adc 指令的目的,就是来进行加法的第二步运算的。

adc指令和add指令相配合就可以对更大的数据进行加法运算

sbb指令

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

格式:sbb 操作对象1,操作对象2

功能:操作对象1=操作对象1–操作对象2–CF

比如:sbb ax,bx

实现功能:(ax) = (ax) – (bx) – CF

cmp指令***

cmp 是比较指令,功能相当于减法指令,只是不保存结果。

cmp 指令执行后,将对标志寄存器产生影响

可以通过其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

格式:cmp 操作对象1,操作对象2

功能:计算操作对象1–操作对象2 但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。

其实,我们通过cmp 指令执行后,相关标志位的值就可以看出比较的结果。

例如:cmp ax,bx

以上可以得出:

上面有CF的值可以判断大小,那么通过OF和SF也可以知道(了解就行)

(1)如果SF=1,而OF=0

OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;

因SF=1,实际结果为负,所以逻辑上真正的结果为负,所以(ah)<(bh)。

(2)如果SF=1,而OF=1

OF=1 ,说明有溢出,逻辑上真正结果的正负≠实际结果的正负(即OF只要是1,那么逻辑结果就是反的)

因 SF=1 ,实际结果为负,实际结果为负,而又有溢出,这说明是由于溢出导致了实际结果为负,

简单分析一下,就可以看出,如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。这样,SF=1,OF = 1 ,说明了(ah)>(bh)。

(3)如果SF=0,而OF=1

OF=1 ,说明有溢出,逻辑上真正结果的正负≠实际结果的正负;

因SF=0,实际结果非负,而OF=1说明有溢出,则结果非 0 ,所以,实际结果为正。实际结果为正,而又有溢出,这说明是由于溢出导致了实际结果非负,

简单分析一下,就可以看出,如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负。这样,SF=0,OF = 1 ,说明了(ah)<(bh)。

(4)如果SF=0,而OF=0

OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;

因SF=0,实际结果非负,所以逻辑上真正的结果必然非负。所以(ah)≥(bh)。

检测比较结果的条件转移指令

转移时 转移指令 + 标号

时间: 2024-10-05 10:20:06

汇编语言——标志寄存器的相关文章

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

本博文系列参考自<<汇编语言>>第三版,作者:王爽 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位

汇编语言(王爽) 第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指令

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

pushf 和 popf pushf 的功能是将标志寄存器的值压栈,而 popf 是从栈中探出数据,输入标志寄存器. pushf 和 popf,为直接访问寄存器提供了方法. 格式 pushf popf 这两条指令后面都不加东西,默认的操作对象是:所有的标志寄存器. 标志寄存器在 Debug 中的表示 在寄存器中,标志局存起是按有意义的各个标志位单独表示的.在 Debug 中,我们可以看到: 标志 值为1的标记 值为0的标记 of OV NV sf NG PL zf ZR NZ pf PE PO

汇编语言标记寄存器标记位_NV UP EI NG NZ AC PE CY

在8086CPU中,有一种标记寄存器,长度为16bit: 其中存储的信息被称为程序状态字(Program Status Word,PSW),以下将该寄存器简称为flag. 功能:1)用来存储相关指令的某些执行结果: 2)用来为CPU执行相关指令提供行为依据: 3)用来控制CPU的相关工作方式. flag寄存器各位示意图 注明:16位中未标明字符的各位在8086CPU中没有使用,无意义: 标明字符的各位具有特殊含义. 位     符号    英文全称                        

汇编语言标志位 含义 NV UP EI NG NZ AC PE CY

缩写原意: Overflow of = OV NV [No Overflow] Direction df = DN (decrement) UP (increment) Interrupt if = EI (enabled) DI (disabled) Sign sf = NG (negative) PL (positive) Zero zf = ZR [zero] NZ [ Not zero] Auxiliary Carry af = AC NA [ No AC ] Parity pf = P

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

疯狂的暑假学习之  汇编入门学习笔记 (十)--  标志寄存器 参考: <汇编语言> 王爽 第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

标志寄存器

段寄存器,通用寄存器,隐藏寄存器.这节课再学一个寄存器,叫做标志寄存器. 旗帜标志寄存器(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