精华内容
下载资源
问答
  • 标志寄存器

    千次阅读 2019-09-17 18:18:26
    滴水逆向三期-标志寄存器 1.PE结构 2.下断点 3.WIN32 API9 4.什么是函数调用 5.熟悉堆栈——画过堆栈图 6.call JCC 标志寄存器 断点小理解:程序跑到MessageBox的时候就停下来 一个函数刚开始执行的时候,这个栈顶...

    滴水逆向三期-标志寄存器

    1.PE结构
    2.下断点
    3.WIN32 API9
    4.什么是函数调用
    5.熟悉堆栈——画过堆栈图
    6.call JCC 标志寄存器
    断点小理解:程序跑到MessageBox的时候就停下来
    一个函数刚开始执行的时候,这个栈顶存储的就是调用这个函数时候函数的返回地址
    JE根本不管你们上面是什么,他只看标志寄存器,标志寄存器符合他的条件了就跳,不符合了就不跳
    JE他如果发现这个zero flag控制是1的话他就跳否则他就不跳

    在这里插入图片描述所有的JCC都是由标志寄存器控制的
    鼠标的位置不是0吗,然后我们双击变成1
    只要找到关键的点,不跳的改成跳就ok,叫爆破,找到关系跳转(有基础的!看那个滴水逆向三期的标志寄存器这期-。-由于我上面的知识点也不太熟悉,就无法很好解释啦!大家去自行理解啦!)

    标志寄存器

    在这里插入图片描述
    标志寄存器32位的 CF PF AF ZF SF OF这几个位要背下来的(第几位)
    1.进位标志寄存器(carry flag):如果运算结果的最高位产生了一个进位或者借位(比如两个数相加往前面加了一个值叫进位,同样两个数相减不够减需要管前面的数借个值叫借位)(在我们眼中是不存在什么进位和借位的,减法是什么是一个正数加一个负数,所有数的加减都是一样的都是加法),那么,值为1,否则为0
    (最高位)要记住,是最高位产生了一个进位或者借位
    在这里插入图片描述
    标志寄存器中可以看到了EFL是所有数的一个汇总 上面的是常用的一个标志寄存器,是od已经帮我们拆好的,因为方便可以看出变化所以提前把那些1改成了0
    在这里插入图片描述
    上面的那个mov eax,0x5555FFFF add eax,1 加完后最高位并没有变 所以标志寄存器c的位置没有变化
    试一下8位寄存器的 mov al,0xFF add al,1研究这些位的时候一定要去确定这些的数据宽度,数据宽度都不确定的话,最高位哪里找,F8后发现c的位置变成了1所以c位看的是最高位,最高位由数据的宽度决定的FF+1就越位了
    在这里插入图片描述
    看图来说,有人会有疑问说,EAX不应该是55560100 为什么是55560000因为刚才我们只看8位,实际上我们1已经进去了,但是进到了c中,所以这个1其实没有丢,为什么不放到前面,因为这样是不允许的,因为只看8位,所以事先一定要确定数据宽度是多少,如果不确定数据宽度其他都没有意义
    2.奇偶标志PF(Parity Flag),奇偶标志PF用于反映运算结果中1的个数的奇偶性,如果1的个数为偶数,则PF的值为1,否则为0
    mov al,3并不是说是3这个数,而是我们要把他改成2进制,然后去看1的个数

    在这里插入图片描述F8第一个的时候看eax的后两位因为al是8位寄存器,6代表的是0110看到了p的位置变成了1,然后再加2的时候变成了8变成了1000,可以看到p的位置变成了0
    3.辅助进位标志AF(Auxiliary Carry Flag):
    在发生下列情况时,辅助进位标志AF的值为1,否则其值为0
    在字操作时,发生低字节向高字节进位或者借位时
    在字节操作时,发生低4位向高4位
    在这里插入图片描述
    mov eax,0x55EEFFFF add eax,2
    在这里插入图片描述
    F8之后发现变化了,以此类推类推32位的 16位的等
    4.零标志位ZF(Zero Flag),零标志ZF用来反映运算结果是否为0
    如果运算结果为0,则值为1,否则值为0,在判断运算结果是否为0时,可以用此标志位
    mov不算运算
    在这里插入图片描述
    XOR是异或运算,所以EAX和EAX异或都是为0的,还有个功能就是EAX清零功能同样还有改变标志寄存器的作用 F8后可以看到 zero flag为1了,mov eax,0和这个xor eax,eax的区别就是,mov这个指令是不改变标志寄存器的,所以不能说不能说这个两个是一样的
    5.符号标志位SF(Sign Flag),符号标志SF用来反映运算结果的符号位,他与运算结果的最高位相同
    在这里插入图片描述
    可以看到s的位置变成了1
    6.溢出标志位OF(Overflow Flag):比如有一个杯子,放水放满了再放就出去了,叫溢出,但是怎么区别看起来都是最高位的问题
    CF是我们在做无符号运算的时候应该注意的寄存器,假设做的运算是有符号的运算那我们就去看O位
    在这里插入图片描述
    正+负永远都不会溢出
    正+正如果等于负数,说明有溢出
    负+负如果是正数,那么就溢出了
    1.无符号,有符号都不溢出
    mov al,8
    add al,8
    2.无符号溢出,有符号不溢出
    mov al,0ff
    add al,2
    3.无符号不溢出,有符号溢出
    mov al,7f
    add al,2
    4.无符号,有符号都溢出
    mov al,0FE
    add al,80
    看这些的时候都要去看是不是有符号的还是无符号的,正负肯定不溢出

    ——————2019.9.17 DT

    展开全文
  • 对8086CPU的标志寄存器中的OF、DF、IF、TF、SF、ZF、AF、PF、CF标志位进行了相关的介绍!

    一、基本介绍:

    CPU的内部的寄存器中,有一类特殊的寄存器(对于不同的处理机,其个数和结构都可能不同);它具有以下三种作用!

     这种特殊的寄存器在8086CPU中,被称为标志寄存器flag。8086CPU的标志寄存器有16位,其中存储的信息通常又被称为程序状态字PSW)。

    flag和其他寄存器不一样,其他寄存器是用来存储数据的,都是一个寄存器作为一个整体具有一个含义的。但是flag寄存器是每一位都有专门的含义的,记录着特定的信息!

    flag寄存器各位示意图

    flag寄存器在上图中显示空白的位,在8086CPU中没有被使用,因此不具有任何的含义;其他被标识的位都具有特殊的含义。

    二、各个标志位介绍:

    OF标志:溢出标志位(有符号数)

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

    CF和OF之间的区别:CF是针对于无符号数运算,OF位是针对于有符号数运算。

    代码举例:

    mov al,0F0H
    
    add al,88H

    指令执行之后,CF=1,OF=1。如果把该运算看作无符号数运算,则0F0H+88H产生了进位,故CF=1;如果把该运算看作有符号数运算,则0F0H+88H发生溢出,OF=1。

    mov al,0F0H
    
    add al,78H

    指令执行之后,CF=1,OF=0。如果把该运算看作无符号数运算,则0F0H+78H产生了进位,故CF=1;如果把该运算看作有符号数运算,则0F0H+78H不发生溢出,OF=0。

    因此,CF和OF所表示的进位和溢出,是分别对于无符号数和有符号数运算而言的彼此之间没有任何的关系。


    DF标志:方向标志位

    flag的第10位是DF,方向标志位;仅仅用于串处理指令中,控制着地址的变化方向

    DF=0;每次操作之后地址递增;即从低地址向高地址处理数据串。

    DF=1,每次操作之后地址递减,即从高地址向低地址处理数据串。

    由于flag寄存器中的DF位决定着串传送指令执行之后,SI、DI的改变方向;因此8086CPU也提供了相应的指令来对于DF位进行设置:

    CLD指令:将标志寄存器的DF位,置为0

    STD指令:将标志寄存器的DF位,置为1


    IF标志:中断允许标志位

    flag的第9位是IF,IF置为0,禁止其他的可屏蔽中断;如果允许处理可屏蔽中断,则将IF置为1。

    ——相关操作指令:

    STI指令:将IF设置为1,允许可屏蔽中断。

    CLI指令:将IF设置为0,禁止可屏蔽中断。


    TF标志:跟踪标志位

    flag的第8位是TF,跟踪标志位用于标识CPU是否允许单步中断,以进行程序调试。TF=0时,8086CPU处于正常状态;TF=1时,8086CPU处于单步状态,每执行一条指令就自动产生一次单步中断。

      8086的debug功能依赖于8086CPU的单步调试功能。


    SF位:符号标志位(有符号数)

    flag的第7位是SF,符号标志位。它记录着相关指令执行后其结果是否为负;如果结果为负,则SF=1;如果结果非负,则SF=0。

    在计算机里面,通常使用补码来表示有符号数据。计算机的一个数据既可以看作有符号数,亦可以看作无符号数。譬如:

    0000 0001B,可以看作为无符号数1,也可看做有符号数+1。

    1000 0001B,可以看作为无符号数129,也可以看作有符号数-127。

    这就说明计算机在计算相关的数据时,即可以看作有符号数的运算,亦可以看作无符号数的运算,关键在于使用者需要哪一个!例如:

    mov al,1000 0001B
    
    add al,1

    计算的结果就是:al=1000 0010B

    对于该运算,如果你把它看作无符号数的运算,那么就是129+1=130(1000 0010B);也可以将其看作有符号数的运算,那么就是-127+1=-126(1000 0010B)。

    SF标志,就是8086CPU对于有符号运算结果的一种记录,它记录了运算结果的正负无论你把运算看作有符号运算还是无符号运算,SF的值都会改变,不同的是,当你看作有符号运算时,它是有意义的;当你看作无符号运算时它是无意义的!

    mov al,1000 0001B
    
    add al,1

    运算结果为1000 0010B,SF=1;如果你把这个运算看作有符号数运算,那么结果为负。

    mov al,1000 0001B
    
    add al,0111 1111B

    运算结果是0,SF=1;如果你把这个运算看作有符号数运算,那么结果为正。


    ZF位:零标志位

    flag寄存器的第6位是ZF,零标志位;它记录着相关指令执行之后,其结果是否为零;如果结果为零,那么ZF=1,如果结果不为零,那么ZF=0。

    例如:

    mov ax,1
    
    sub ax,1

    执行之后,结果为零,则ZF=1。

    mov ax,2
    
    sub ax,1

    执行之后,结果为1,则ZF=0。


    AF位:调整标志位

    flag的第4位是AF,调整标志位;反映加减运算时最低半字节有无进位或者借位。最低半字节有进位或借位时,AF=1,否则AF=0。

    这个标志位主要由处理器内部使用,用于十进制算术运算的调整指令,用户一般不必关心。

    例如:8位二进制数运算0011 1010+0111 1100 = 1011 0110,低四位有进位,所以此时的AF=1。


    PF位:奇偶标志位

    flag寄存器的第2位是PF,奇偶标志位;它记录着相关指令执行之后,其结果的所有bit位中1的个数是否为偶数;如果1的个数为偶数,则PF=1,如果1的个数为奇数,则PF=0。

    例如:

    mov al,1
    
    add al,10

    执行之后,结果是0000 1011B;其中有3个1;因此PF=0。

    mov al,2
    
    or al,2

    执行之后,结果是0000 0010B;其中有1个1;因此PF=0。

    sub al,al

    执行之后,结果为0000 0000B;其中有0(偶数)个1;因此PF=1。


    CF标志:进位标志位(无符号数)

    flag的第0位是CF,进位标志位。一般情况下,在进行无符号数运算时,它记录了运算结果的最高有效位向更高位的进位值,或者从最高位的借位值

    以8位为例:

    ——进位举例:

    mov al,98H

    add al,al;执行之后,al的值变为30H,CF=1;此时CF记录了最高有效位向更高位的进位值。

    add al,al;执行之后,al的值变为60H,CF=0;此时CF记录了最高有效位向更高位的进位值。

    ——借位举例:

    mov al,97H

    sub al,98H;执行之后,al的值变为FFH,CF=1;此时CF记录了向更高位的借位值。

    sub al,al;执行之后,al的值变为0,CF=0;此时CF记录了向更高位的借位值。

    ——相关操作指令:

    CLC指令:将CF置为0。

    STC指令:将CF置为1。

    CMC指令:原来是0变为1,原来是1变为0。

    Ending... ...

    展开全文
  • 8086标志寄存器Flag Register is a 16-bit register, but there are only 9 flags available in the 8086 microprocessor. The rest 7 bits are hence left idle. 标志寄存器是一个16位寄存器,但是8086微处理器中...

    8086标志寄存器

    Flag Register is a 16-bit register, but there are only 9 flags available in the 8086 microprocessor. The rest 7 bits are hence left idle.

    标志寄存器是一个16位寄存器,但是8086微处理器中只有9个标志可用。 因此其余7位保持空闲状态。

    flag register 8086 microprocessor

    There are two categories of flag register:

    标志寄存器分为两类

    1. Condition flags

      条件标志

    2. Control flags

      控制标志

    1)条件标志 (1) Condition flags)

    The conditional flags are set or reset after any arithmetic or logical operation is performed on an 8 bit or 16-bit number. This category consists of the following 6 flags:

    在对8位或16位数字执行任何算术或逻辑运算之后,将设置或重置条件标志。 此类别包括以下6个标志:

    1. Carry Flag (CF): The carry flag will be set only if a carry is generated from the MSB of the result after doing any operation in 8086 Microprocessor.

      进位标志(CF):仅当在8086微处理器中执行任何操作后,从结果的MSB中产生进位时,才设置进位标志。

    2. Parity Flag (PF): Parity is related to the number of 1’s contained in the binary data. There exist two types of parity:

      奇偶校验标志(PF):奇偶校验与二进制数据中包含的1的数目有关。 存在两种类型的奇偶校验:

      • Even Parity: When the number of 1’s in the binary data are even.偶校验:当二进制数据中的1的数量为偶数时。
      • Odd Parity: When the number of 1’s in the binary data are odd.奇校验:当二进制数据中的1的数目为奇数时。

      For the flag, the PF is set if there exists an even parity in data after the execution of the instruction. Else the flag is reset.

      对于标志,如果在执行指令后数据中存在奇偶校验,则设置PF。 否则,该标志被重置。

    3. Auxiliary-Carry Flag (AF): This flag is set if there is a generation of carrying from a nibble, i.e. 4 bits of data.

      辅助传送标志(AF):如果有四位数据(即4位数据)产生了进位,则设置此标志。

    4. Zero Flag (ZF): If the result after performing the required operation (Arithmetic or Logical) on the instructions is zero, in that case, the zero flags are set to 1. Else, it remains reset.

      零标志(ZF):如果在指令上执行了所需的操作(算术或逻辑)后结果为零,在这种情况下,零标志将设置为1。否则,它将保持复位状态。

    5. Sign Flag (SF): If the result after performing any arithmetic or logic operation in the given instruction is negative, then the sign flag is set to 1. Else, for a positive result, the sign flag remains reset.

      符号标志(SF):如果在给定指令中执行任何算术或逻辑运算后结果为负,则将标志标志设置为1。否则,对于正结果,标志标志保持复位状态。

    6. Overflow Flag (OF): This Flag will be set if the register gets overflowed with data after any arithmetic or logic operation. This happens in cases when the carry is getting in in MSB, but there is no space in the register to store the carried out bit.

      溢出标志(OF):如果在进行任何算术或逻辑运算后寄存器溢出数据,则将设置此标志。 这种情况发生在进位进入MSB,但寄存器中没有空间存储进位的情况下。

    2)控制标志 (2) Control flags)

    The control flags are used to navigate the microprocessor for certain operations. There are 3 types of control flags:

    控制标志用于导航微处理器以进行某些操作。 有3种类型的控制标志:

    1. Trap Flag (TF): This flag is used of we need single-step debugging in our code. If the TF is set, then the execution will be done step by step. Otherwise, the free-running operation will be done.

      陷阱标志(TF):使用此标志是因为我们需要在代码中进行单步调试。 如果设置了TF,则将逐步执行。 否则,将执行自由运行操作。

    2. Interrupt Flag (IF): This flag is used to enable the Interrupt. The microprocessor is capable of handling interrupts only if this flag is in the set mode. Otherwise, any interrupt raised while the execution of the instructions will not be handled by the microprocessor.

      中断标志(IF):该标志用于使能中断。 仅当该标志处于设置模式时,微处理器才能够处理中断。 否则,在执行指令期间引发的任何中断都不会由微处理器处理。

    3. Direction Flag (DF): This flag is used for string operations. If this flag is set, the string will be read from higher-order bits to lower order bits and vice versa.

      方向标志(DF):此标志用于字符串操作。 如果设置了此标志,则将从高阶位到低阶位读取字符串,反之亦然。

    翻译自: https://www.includehelp.com/embedded-system/flag-register-in-8086-microprocessor.aspx

    8086标志寄存器

    展开全文
  • 8086CPU标志寄存器

    千次阅读 2019-09-16 15:13:42
    标志寄存器又称程序状态字(PSW)CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下三种作用:用于存储相关指令的某些执行结果用来为CPU执行相关指令提供行为依据用来控制CPU的...

    标志寄存器又称程序状态字(PSW)

    CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下三种作用:

    • 用于存储相关指令的某些执行结果
    • 用来为CPU执行相关指令提供行为依据
    • 用来控制CPU的相关工作方式

    这种特殊的寄存器在8086CPU中,称为标志寄存器。8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW).标志寄存器和其他寄存器不一样,其它寄存器是用来存放数据的,都是整个寄存器具有一个含义.而标志寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息.

    8086CPU的标志寄存器如下图所示:

     

     

    一、ZF标志位

    标志寄存器的第6位是ZF(Zero Flag),零标志位。它记录相关指令执行后,其结果是否为0.如果结果为0,那么ZF=1(ZR/Zero);如果结果不为0,那么ZF=0(NZ/Not Zero).

    例如如下指令执行后ZF标志位为1(实验在DEBUG中进行,字面量默认为16进制):

    0AE0:0100 mov ax,1
    0AE0:0103 sub ax,1

    例如如下指令执行后ZF标志位为(实验在DEBUG中进行,字面量默认为16进制)0:

    0AE0:0100 mov ax,2
    0AE0:0103 sub ax,1

    例如如下指令执行后ZF标志位为1(实验在DEBUG中进行,字面量默认为16进制):

    0AE0:0100 mov ax,ffff
    0AE0:0103 inc ax

    特别注意:mov push,pop等传送指令不改变标志寄存器的值.

    二、PF标志位

    标志寄存器的第2位是PF(Parity Flag),奇偶标志位,它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数.如果1的个数为偶数,PF=1(PE/Parity Even);如果为奇数,PF =0(PO/Parity Odd)

    例如如下指令执行后PF标志位为1(实验在DEBUG中进行,字面量默认为16进制):

    0AE0:010C mov ax,1
    0AE0:010F add ax,2

    例如如下指令执行后PF标志位为0(实验在DEBUG中进行,字面量默认为16进制):

    0AE0:0100 mov ax,1
    0AE0:0103 inc ax

    三、SF标志位

    标志寄存器的第7位是SF(Sign Flag),符号标志位.它记录相关指令执行后,其结果是否为负.如果结果为负,SF=1(NG/Negative);如果非负,SF=0(PL/Positive).

    例如如下指令执行后SF标志位为0(实验在DEBUG中进行,字面量默认为16进制):

    0AE0:0100 mov ax,0
    0AE0:0103 add ax,1

    例如如下指令执行后SF标志位为1(实验在DEBUG中进行,字面量默认为16进制):

    0AE0:0100 mov ax,0
    0AE0:0103 add al,ff

    四、CF标志位

    标志寄存器的第0位是CF(Carry Flag),进位标志位.一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值.若发生借位或进位CF=1(CY/Carry),否则CF=0(NC/No Carry)

    例如如下指令执行后CF标志位为0(实验在DEBUG中进行,字面量默认为16进制):

    0AE0:0106 mov ax,1
    0AE0:0109 add ax,f

    例如如下指令执行后CF标志位为1(实验在DEBUG中进行,字面量默认为16进制):

    0AE0:0100 mov ax,1
    0AE0:0103 add ax,ffff

    注意:inc和loop指令不影响CF标志位

    五、OF标志位

    标志寄存器的第11位是OF(Overflow Flag),溢出标志位,一般情况下,OF记录了有符号数的运算结果是否发生了溢出,如果发生了溢出,OF=1(OV/Overflow);如果没有则OF=0(NV/Not Overflow)

    注意OF标志位和CF标志位的区别,例如如下指令执行后OF标志位为1,CF标志位为0(这里的字面量是10进制数):

    mov al,98
    add al,99

    例如如下指令执行后OF标志位为0,CF标志位为1(实验在DEBUG中进行,字面量默认为16进制):

    0AE0:0104 mov al,f0
    0AE0:0106 add al,78

    使用neg指令也会造成溢出:

    mov al,-128
    neg al

    可以看出OF标志位和CF标志位没有任何关系

    六、ADC指令

    ADC是带进位加法指令,它利用了CF位上记录的进位值,比如指令,adc ax,cx相当于ax=ax+cx+CF 

    下面实现一个64位整数相加的函数(这里用到32位寄存器,C++与汇编混用),函数原型如下:

    extern "C" 
    // 将a+b的值放在c所在的地址中
    void addLong(long long a, long long b,long long *c);

    汇编实现如下(32位寄存器与16位寄存器用法):

    
    ;.386
    .model flat,c
    ;public test_
    
    .code
    
    addLong proc
    
    
        push ebp
    	push ebx
        mov ebp,esp
    	; 12 20 28
    	mov ebx,[ebp+28]
    
    	mov eax,[ebp+12]
    	mov dword ptr [ebx],eax
    	mov eax,[ebp+20]
    	add dword ptr [ebx],eax
    
    	mov eax,[ebp+24]
    	mov dword ptr [ebx+4],eax
    	mov eax,[ebp+16]
    	adc dword ptr [ebx+4],eax
    
       
    
    
    	pop ebx
        pop ebp
        ret
    
    
    addLong endp
    end
    

    主函数如下(这里要声明函数,并配置Visual Studio对asm文件的编译方式):

    #include "iostream"
    
    using namespace std;
    extern "C" 
    // 将a+b的值放在c所在的地址中
    void addLong(long long a, long long b,long long *c);
    int main()
    {	
    	long long a = INT32_MAX;
    	long long b = INT32_MAX;
    	long long c = 0;
    	addLong(a, b, &c);
    	cout << c << endl;
    
    	system("pause");
    	return 0; 
    }

    输出结果:

    4294967294

    七、SBB指令

    ADC是带借位减法指令,它利用了CF位上记录的借位值,比如指令,sbb ax,cx相当于ax=ax-cx-CF 

    八、CMP指令

    CMP是比较指令,CMP的功能相当于减法指令,只是不保存结果.CMP指令执行后,将对标志寄存器产生影响.

    比如下面的指令:

    mov ax,8
    mov bx,3
    cmp ax,bx
    

    执行后AX=8,ZF=0,PF=1,SF=0,CF=0,OF=0

    其实我们通过CMP指令执行后相关标志位的值就可以看出比较结果.对于无符号数,cmp ax,bx:

    • 如果AX=BX,则AX-BX=0,所以ZF=1(条件转移指令:JE/JZ)
    • 如果AX≠BX,则AX-BX≠0,所以ZF=0(条件转移指令:JNE/JNZ)
    • 如果AX<BX,则AX-BX将产生借位,所以CF=1(条件转移指令:JB/JNAE)
    • 如果AX≥BX,则AX-BX不必产生借位,所以CF=0(条件转移指令:JNB/JAE)
    • 如果AX>BX,则AX-BX既不必产生借位,结果又不为0,所以CF=0并且ZF=0(条件转移指令:JA/JNBE)
    • 如果AX≤BX,则AX-BX将产生借位,结果可能为0,所以CF=1或者ZF=0(条件转移指令:JNA/JBE)

    对于有符号数cmp ah,bh:

    • 如果SF=1,OF=0,所以AH<BH(JL/JNGE)
    • 如果SF=1,OF=1,因为溢出导致的实际结果为负,那么逻辑上真正的结果为正,所以AH>BH(JG/JNLE)
    • 如果SF=0,OF=1,因为溢出导致的实际结果为正,那么逻辑上真正的结果为负,所以AH<BH(JL/JNGE)
    • 如果SF=0,OF=0,所以AH≥BH(JGE/JNL)

    九、DF标志和串传送指令

    标志寄存器的第10位是DF,方向标志位.在串处理指令中,控制每次操作后SI和DI的增减.DF=0(UP),每次操作后SI和DI递增;DF=1(DN/Down)每次操作后SI和DI递减.

    下面我们来看两个串传送指令movsb,执行该指令后相当于进行下面几个步骤(DF=0):

    mov byte ptr es:[di],ds:[si]
    inc si
    inc di

    movsw,执行该指令后相当于进行下面几个步骤(DF=0):

    mov word ptr es:[di],ds:[si]
    inc si
    inc si
    inc di
    inc di

    movsb和movsw一般都和rep配合使用,rep movsb等价于下面指令:

    s:movsb
    loop s

    CLD(Clear Director),STD(Set Director)指令分别是设置DF=0和DF=1

    下面实现一个类似于C语言中的memcpy函数作为例子:

    
    ;.386
    .model flat,c
    ;public test_
    
    .code
    
    memoryCopy proc
    
    ; 在80386保护模式中ES和DS具有相同的值且无法改变它们
        push ebp
    	push ecx
    	push esi
    	push edi
        mov ebp,esp
    	mov edi,[esp+20]
    	mov esi,[esp+24]
    	mov ecx,[esp+28]
    	cld
    	rep movsb
    	pop esi
    	pop edi
    	pop ecx
        pop ebp
        ret
    
    
    memoryCopy endp
    end
    
    #include "iostream"
    
    using namespace std;
    extern "C"
    void memoryCopy(void *dst, void *src, size_t size);
    int main()
    {	
    	int a = 10, b = 20;
    	memoryCopy(&a,&b,sizeof(int));
    	cout << a << endl;
    	system("pause");
    	return 0; 
    }

    注意:在80386保护模式中ES和DS具有相同的值且无法改变它们

    十、PUSHF和POPF指令

    PUSHF指令的功能是将标志寄存器的值压栈,POPF的指令是从栈中弹出数据,送入标志寄存器中.

    十一、AF标志位

    辅助进位标志位(Auxiliary Carry Flag)。当执行一个加法(或减法)运算,使结果的低4位向高4位有进位(或借位)时,AF=1(AC/Auxiliary Carry);否则AF=0(NA/No Auxiliary Carry).

     

    展开全文
  • 标志寄存器操作

    2021-06-02 16:10:58
    文章目录0x01 常见操作指令0x02 标志寄存器一、ZF标志二、PF标志三、SF标志四、CF标志五、OF标志六、DF标志位和串传送指令 0x01 常见操作指令 ​ 在 CISC 中对于标志寄存器存在一些指令对标志寄存器操作,常见的有...
  • 详解EFLAGS寄存器(标志寄存器

    千次阅读 2020-10-30 19:35:00
    标志寄存器它也是拿来存储数据的。 那他们有什么区别呢? 我们常用的寄存器,里面存的数据,都只有一个含义,而标志寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。 重点把CF/PF/AF/ZF...
  • 标志寄存器标志寄存器概述负数存储过程(划到最后面看)相关指令ZF标志寄存器PF标志寄存器SF标志寄存器CF标志寄存器OF标志寄存器DF寄存器 标志寄存器概述 在计算机中,有一个专用16位的寄存器FLAGS(标识寄存器)。 ...
  • 汇编的标志寄存器

    千次阅读 2019-10-02 11:31:57
    其中有6个状态标志位:OF、SF、ZF、AF、PF、CF,及3个控制标志位DF、IF、TF。 PSW在实现IF、FOR这类需要进行条件判断的语句时非常重要。为了能熟练编程,我们需要掌握以下这些细节。(汇编里细节很重要) 符号标志S...
  • 标志寄存器——存储了很多标记位,标识了CPU执行指令过程中的一系列状态,这些标志基本上是由CPU自动设置和修改,我们只需要理解或记住就行了(硬件或cpu大神除外) CF 进位标志 PF 奇偶标志 ZF 零标志 SF 符号...
  • 标志寄存器作用 x86架构CPU中,标志寄存器主要有3种作用: 存储相关指令执行后的结果,例如CF、PF、AF、ZF、OF标志位 执行相关指令时,提供行为依据,例如执行JE指令时会读取ZF的值,来决定是否进行跳转。 控制CPU...
  • 控制器、运算器、寄存器组成CPU   控制器:领导 运算器:员工,计算数据 寄存器:寄存数据信息,在内存与运算器之间 硬盘运算速度&lt;内存运算速度&lt;寄存器运算速度 寄存器:(寄存器16位[寄存器高...
  • 标志寄存器 EFL

    2019-12-04 11:53:17
    当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。 指令系统中没有专门的指令来改变标志位TF的值,但可直接通过文末介绍的方法来进行修改。 2. ...
  • 状态标志是16位标志寄存器PSW用来存放运算结果的特征,常用作后续条件转移指令的转移控制条件。其中7位没用,9位标志位分成两类:一类为状态标志,表示运算后结果的状态特征,它影响后面的操作。状态标志有CF...
  • 8086标志寄存器(Flag Register)

    千次阅读 2019-08-30 13:59:55
    标志寄存器设计为16位,实际使用9位,其中6位用以存放算术逻辑单元运算后的结果特征,称为状态标志;另外3位通过人为设置,用以控制8086的三种特定操作,称为控制标志。 6个状态标志位定义如下: 进位标志:...
  • 标志寄存器(PSW)

    千次阅读 2020-03-09 22:57:41
    标志寄存器 标志寄存器又称程序状态字PSW(Program Status Word) 标志Flag用于反映指令执行结果或控制指令的执行形式。许多指令执行后将影响有关的状态标志寄存器,不少指令的执行要利用某些标志,当然,也有很多指令...
  • 汇编语言之标志寄存器

    千次阅读 2016-11-01 18:10:59
    1、标志寄存器 CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下3种作 用: 1. 用来存储相关指令的某些执行结果。 2. 用来为CPU执行相关指令提供行为依据。 3. 用来控制...
  • 状态标志寄存器FLAGS

    千次阅读 2020-05-02 20:53:58
    FLAGS 称为标志寄存器或程序状态字(Program Status Word, PSW)。 标志寄存器是一个16 位的寄存器,8088 只使用了其中 9 位,分为两类:一类称为状态标志,反映指令执行结的特征,共有 6 位。另一类是控制标志,...
  • 这种寄存器被称为标志寄存器FLAG 8086CPU中标志寄存器是16位的。 0x1、ZF标志(Zero Flag) ZF标志是FLAG寄存器的第六位。零标志位 他记录指令执行后,其结果是否为0。 如果结果为0,ZF= 1 如果结果不为0,ZF= 0 ...
  • 标志寄存器(六个状态标志位)

    千次阅读 2020-09-19 16:27:42
    1、进位标志CF(Carry Flag) 如果运算结果的最高位产生了一个进位或错位,那么,其值为1,否则其值为0 2、奇偶标志(Parity Flag) 由于反应运算结果中(转化为二进制),"1"的奇偶性,也就是个数。"1"的个数为偶数,PF...
  • VS中标志寄存器表示

    2019-12-07 14:50:24
    溢出标志OF(Over flow flag)OV(1)NV(0) 方向标志DF(Direction flag)DN(1)UP(0) 中断标志IF(Interrupt flag)...
  • 寄存器简称 全称 =1 =0 详解 CF Carry Flag(进位标志) 进位 无进位 用于反映运算是否产生进位或借位。如果运算结果的最高位产生一个进位或借位,则CF置1,否则置0。运算结果的最高位包括字操作的第15位和...
  • 通用寄存器寄存器和变量差不多,目的都是用于保存一些即将操作的数据 EAX(accumulator) 寄存器:扩展累加寄存器(一般在乘/除中会被主动调用),也可以用于其他用途 ECX(Count) 寄存器:循环计数器,多数...
  • 标志寄存器(FLAGS,PSW,FR)简介

    千次阅读 2020-06-25 18:12:53
    标志寄存器简介 8086CPU中设立了一个两字节的标志寄存器,有9个标志位,其中6个用来表示运算结果的状态包括CF、PF、AF、ZF、SF、OF,称为状态标志位,另外3个是控制标志位,用来控制CPU的操作,包括IF、DF和TF。 各...
  • 标志寄存器(flag)

    2019-08-13 16:02:36
    8086CPU的标志寄存器有16位,其中储存的信息通常被称为程序状态字。 其他寄存器时用来存放数据的,整个寄存器具有一个含义。 flag寄存器是按位起作用的,它的每一位都有专门的含义,记录特定的信息。 8086CPU的...
  • 标志寄存器及其标志位

    万次阅读 2017-04-18 10:06:37
    标志寄存器: CPU内部的寄存器,(对于不同的处理机,个数和结构都可能不同)具有三种作用: 用来存储相关指令的某些执行结果; 用来为CPU执行相关指令提供行为依据; 用来控制CPU的相关工作方式。 8086CPU的...
  • 标志寄存器是在CPU内部的特殊寄存器,具有三种作用:1.存储运算结果 2.为一些指令提供执行依据 3.控制CPU的相关工作方式 8086的flag寄存器结构如下标志位在debug下的显示如下 常见运算标志位的解释OF(overflow ...
  • 8086状态标志寄存器含义

    千次阅读 2019-09-30 22:07:10
    只使用其中9位,6个状态标志位,3个控制标志位 用于存放指令执行过程中的结果和特征 标志位 全称 名称 =1 =0 CF Carry Flag 进位标志 CY/Carry/进位 NC/No Carry/无进位 PF Parity Flag 奇偶标志 PE/...
  • SF CF OF 等标志寄存器

    2019-12-07 12:09:55
    这些寄存器并不是各自独立的 而是在一个16位的FLAG寄存器
  • 汇编 标志寄存器和标志位

    千次阅读 2016-11-24 21:42:57
    8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。falg寄存器结构

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,921
精华内容 41,968
关键字:

标志寄存器