汇编-11.0-标志寄存器
1.标志寄存器
(1).用来存储相关指令的某些执行结果;
(2).用来为CPU执行相关指令提供的行为依据;
(3).用来控制CPU的相关工作方式。
flag寄存器是按位起作用的,每一位都有专门的含义,记录特定的信息。
flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何意义,而0、2、4、6、8、9、10、11位都具有特殊的含义。
2.ZF标志
flag的第六位是ZF标志位,零标志位。它记录相关指令执行后,其结果是否为0.如果为0,
那么zf=1,如果不为0,那么zf=0.
3.PF标志
flag的第二位是PF,奇偶标志位。它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。如果1的个数为偶数,pf=1,如果为奇数,
那么pf=0.
4.SF标志
flag额第七位是SF,符号标志位。它记录相关指令执行后,其结果是否为负,如果为负,sf=1;如果不是,则sf=0.
SF标志,就是CPU对有符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号来运算的时候,
可以通过它来的知结果的正负。如果我们将数据当作无符号值则没有意义,虽然相关的指令影响了它的值。
5.CF标志
flag的第0位是CF,进位标志位。一般情况下,在进行无符号运算时,它记录了运算结果的最高有效位向更高的进位值,
或从更高位的借位值。
对于位数为N的无符号来说,其对应的二进制的最高位,即第N-1位,就是它的最高有效位,而假想存在的第N位,
就是相对于最高有效位的更高位。
6.OF标志
由于在进行有符号运算时,可能发生溢出而造成结果的错误。则CPU需要对指令执行后是否产生溢出进行记录。
flag的第11位时OF位,溢出标志位。一般情况下,OF记录了有符号数运算的结果是否发生了溢出。如果发生溢出,OF=1;
如果没有,OF=0。
CF和OF的区别:CF是对无符号运算有意义的标志位,而OF是对有符号运算有意义的标志位。
7.adc指令
adc是带进位加法指令,它利用了CF位上的记录的进位值。
指令格式:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+CF
在执行adc指令的时候加上CF的值的含义,是由于adc指令前面的指令决定的,也就是说,关键在于加上CF值是被什么指令设置。
显然,如果CF的值被sub指令设置的,那么它就是借位值;如果是add指令设置的,那么它就是进位值。
8.sbb指令
sbb是带借位减法指令,它利用了CF位上记录的借位值。
指令格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
9.cmp指令
cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。
其他相关指令通过识别这些影响的标志寄存器位来得知比较结果。
cmp指令格式:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2 但不保存结果,仅仅根据计算结果对标记寄存器进行设置。
同add、sub指令一样,CPU在执行cmp指令的时候,也包含两种意义:进行无符号数运算和进行有符号数运算。
在cmp指令使用时,需要知道OF寄存器有没有产生溢出;
(1).sf=1,of=0
of=0,说明没有溢出,逻辑上真正的结果正负=实际结果的正负;
因sf=1,实际结果为负,所以逻辑的结果为负。
(2).sf=1,of=1
of=1,说明有溢出,逻辑上真正的结果正负!=实际结果的正负;
因sf=1,实际结果为负,而又有溢出,这说明由于溢出导致了实际结果为负。
因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。
(3).sf=0,of=1
of=1,说明有溢出,逻辑上真正的结果正负!=实际结果的正负;
因sf=0,实际结果为非负,又有溢出,则结果非0。所以结果为正。
这说明是由于溢出导致了实际结果非负;
因为溢出导致实际结果为正,那么逻辑上真正的结果必然为负。
(4).sf=0,of=0
of=0,说明没有溢出,逻辑上真正的结果正负=实际结果的正负;
因sf=0,实际结果为非负,所以逻辑的结果为非负。
10.检测比较结果的条件转移指令
转移指的就是它能够修改IP,而“条件”指的是它可以根据某种条件,决定是否修改IP。
因为cmp指令可以同时进行有符号和无符号两种比较,根据cmp指令的比较结果进行转移的指令也分为两种,
即根据无符号数的比较转移的指令(它们检测zf、cf的值)和根据有符号的比较结果进行的条件转移指令
(它们检测sf、of和zf的值)。
常用的根据无符号数的比较结果进行转移的条件转移指令:
第一个字母都是j,表示jump;后面的字母表示:
如:如果(ah)=(bh),则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh).
cmp ah,bh je s add sh,bh jmp short ok s:add ah,ah ok:........ ;如果(ah)=(bh),则cmp ah,bh,使zf=1,而je检测zf是否为1 ;如果为1,将转移到标号s处执行指令add ah,ah.
11.DF标志和串传送指令
flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si、di的增减。
df=0 每次操作后si、di递减;
df=1 每次操作后si、di递减。
传送一个字节指令:
格式:movsb
功能:执行movsb指令相当于进行下面几步操作。
(1).((es)*16+(di))=((ds)*16+(si))
(2)如果df=0则:
(si)=(si)+1
(di)=(di)+1
如果df=1则:
(si)=(si)-1
(si)=(di)-1
movsb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增或递减。
传送字指令:
格式:movsw
movsw的功能是将ds:si指向的内存字单元中的字送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或者减2.
movsb和movsw都和rep配合使用,格式如下:
rep movsb
用汇编语法来描述rep movsb的功能就是:
s:movsb
loop s
rep的作用是根据cx的值,重复执行后面的传送指令。由于每一次执行movsb指令si和di都会递增或递减指向后一个单元或前一个单元,
则rep movsb就可以循环实现(cx)个字符的传送。
12.pushf和popf
pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器。
pushf和popf,是直接访问标志寄存器的一种方法。
13.标记寄存器在Debug中的表示
在Debug中,标志寄存器是按照有意义的各个标志位单独表示的:
表示意义: