王爽汇编语言第十一章——标志寄存器

第十一章——标志寄存器

1、8086cpu的标志寄存器都是16位,其中存储的信息通常被称为程序状态字(psw)。

2、flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。而flag寄存器是按位起作用的。也就是说,它的每一位都有专门的含义,记录特定的信息。

3、Flag 的1、3、5、12、13、14、15位在8086cpu中没有使用,不具有任何意义。而0、2、4、6、7、8、9、10、11都具有特殊的意义。

4、ZF标志:flag的第6位是ZF,零标志位。它记录相关指令执行后,结果为0,ZF=1;结果不为0,ZF=0。

对于ZF的值,我们可以这样来看:ZF标记相关指令的计算结果是否为0,如果为0,则在ZF要记下“是0”这样的肯定信息。

5、在8086cpu的指令集中,有的指令的执行是影响标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令(进行逻辑或算术运算)。

有的指令的执行对标志寄存器没有影响,比如:mov、push、pop等,它们大都是传送指令。

6、flag的第2位是PF,奇偶标志位。它记录指令执行后,结果的所有二进制位中1的个数:为偶数,PF=1;为奇数,PF=0。

7、Flag的第7位是SF,符号标志位。它记录指令执行后,结果为负,SF=1;结果为正,SF=0。

8、我们知道计算机中通常用补码来表示有符号数据。计算机中的一个数据可以看作是有符号数,也可以看作是无符号数。

例:00000001B,可以看作为无符号数1,或有符号数+1。

10000001B,可以看作为无符号数129,或有符号数-127。

9、SF标志,就是cpu对有符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负;如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。这也就是说,cpu在执行add等指令时,是必然要影响到SF标志位的值的,至于我们需不需要这种影响,那就看我们如何看待指令所进行的运算了。

10、某些指令将影响标志寄存器中的多个标志位,这些被影响的标记为比较全面地记录了指令的执行结果,为相关的处理提供了所需的依据。

11、Flag的第0位是CF,进位标志位。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。对于位数为N的无符号数来说,其对应的二进制信息的最高位,即第N-1位。而假想存在的第N位,就是相对于最高有效位的更高位。

12、我们知道,当两个数据相加的时候,有可能产生从最高有效位向更高位的进位。比如,两个8位数据:98H+98H,将产生进位。由于这个进位值在8位数中无法保存,我们就简单地说这个进位值丢失了。其实cpu在运算的时候,并不会丢弃这个进位值,而实记录在一个特殊的寄存器的某一位上。8086cpu就要flag的CF位来记录这个进位值。

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

14、溢出只对有符号数运算而言;进位只对无符号数运算而言。

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

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

功能:adc ax,bx→(ax)=(ax)+(bx)+CF

加法可分为两步来执行:(1)低位相加(2)高位相加再加上低位产生的进位值

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

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

功能:sbb ax,bx→(ax)=(ax)-(bx)-CF

17、cmp是比较指令,功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

18、Cmp指令

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

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

当cmp指令用于有符号数时:我们在考察SF(得知实际结果的正负)的同时考察OF(得知有没有溢出),就可以得知逻辑上真正结果的正负。

例:cmp ah,bh

如果SF=1,OF=0

OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负。因SF=1,实际结果为负,所以,逻辑上真正的结果为负,所以(ah)<(bh)。

19、因为cmp指令可以同时进行两种比较,无符号数和有符号数比较。所以根据cmp指令的比较结果进行转移的指令也分为两种,即:

根据无符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF的值。

根据有符号数的比较结果进行转移的条件转移指令,它们检测SF、OF和ZF的值。

20、flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后,si(指向原始偏移地址)、di(指向目标偏移地址)的增减。

DF=0:每次操作后,si、di递增

  DF=1:每次操作后,si、di递减

格式1:movsb

功能:以字节为单位传送

((es)*16+(di))=((ds)*16+(si))

如果DF=0,则:(si)=(si)+1 (di)=(di)+1

如果DF=1,则:(si)=(si)-1 (di)=(di)-1

movsb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器DF位的值,将si和di递增或递减。

格式2:movsw

功能:以字为单位传送

movsw的功能是将ds:si指向的内存单元中的字送入es:di中,然后根据标志寄存器DF位的值,将si和di递增2或递减2。

21、movsb和movsw进行的是串传送操作中的一个步骤。一般来说,movsb和movsw都和rep配合使用,格式如下:

rep movsb。rep的作用是根据cx的值,重复执行后面的串传送指令。由于每执行一次movsb指令,si和di都会递增或递减,则rep movsb就可以循环实现(cx)个字符的传送。

22、由于flag的DF位决定着串传送指令执行后,si和di改变的方向,所以cpu应该提供相应的指令来对DF位进行设置,从而使程序员能够决定传送的位置。8086cpu提供下面两条指令对DF位进行设置:

cld指令:将标志寄存器的DF位置0。

std指令:将标志寄存器的DF位置1。

23、使用串传送指令进行数据的传送,需要给它提供一些必要的信息,它们是:(1)传送的原始位置:di:si

(2)传送的目的位置:es:si (3)传送的长度:cx(4)传送的方向:DF

24、pushf和popf:

Pushf:将标志寄存器的值压栈

Popf:从栈中弹出数据,送入标志寄存器中

Pushf和popf为直接访问标志寄存器提供了一种方法

猜你喜欢

转载自blog.csdn.net/weixin_42617472/article/details/82883327
今日推荐