- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十一章 标志寄存器
目录
11.1 ZF标志
11.2 PF标志
11.3 SF标志
11.4 CF标志
11.5 OF标志
11.6 adc指令
11.7 sbb指令
11.8 cmp指令
11.9 检测比较结果的条件转移指令
11.10 DF标志和串传送指令
11.11 pushf和popf
11.12 标志寄存器在Debug中的表示
引言
8086CPU的标志寄存器為16位,其中存储的信息通常被称为程序状态字(PSW)。
我们己经使用过8086CPU的ax、bx、cx、dx、si、di、bp、sp、ip、cs、ss、ds、es等13个寄存器了。
本章中的标志寄存器(以下简称为flag)是我们要学习的最后一个寄存器。flag 和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
8086CPU的flag寄存器的结构:
flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义。而0、2、4、6、7、8、9、10、11位都具有特殊的含义。
11.1 ZF标志
flag的第6位是ZF(zero flag),零标志位。它记录相关指令执行后,
结果为0 ,ZF = 1
结果不为0,ZF = 0
例如:
mov ax,1
sub ax,1
指令执行后,结果为0,则ZF = 1。
mov ax,2
sub ax,1
指令执行后,结果为1,则ZF = 0。
对于ZF的值,我们可以这样来看,ZF标记相关指令的计算结果是否为0,如果为0,则在ZF要记录下“是0”这样的肯定信息。
指令: mov ax,1
and ax,0
执行后,结果为0,则ZF=1,表示“结果是0”。
指令: mov ax,1
or ax,0
执行后,结果不为0,则ZF=0,表示“结果非0”。
注意:
在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令(进行逻辑或算术运算);
有的指令的执行对标志寄存器没有影响,比如:mov、push、pop等,它们大都是传送指令。
我们在使用一条指令的时候,要注意这条指令的全部功能,其中包括,执行结果对标记寄存器的哪些标志位造成影响。
11.2 PF标志
flag的第2位是PF,奇偶标志位。它记录指令执行后,结果的所有二进制位中1的个数:
为偶数,PF = 1;
为奇数,PF = 0。
示例
指令: mov al,1
add al,10
执行后,结果,其中有3(奇数)个1,则PF=0;
指令:mov al,1
or al,10
执行后,结果,其中有2(偶数)个1,则PF=1;
11.3 SF标志
flag的第7位是SF,符号标志位。它记录指令执行后,
结果为负,SF = 1;
结果为正,SF = 0。
我们需要先来认识一下有符号数与补码;
有符号数与补码
我们知道计算机中通常用补码来表示有符号数据。计算机中的一个数据可以看作是有符号数,也可以看成是无符号数。
比如: ,可以看作为无符号数 1 ,或有符号数+1; ,可以看作为无符号数129,也可以看作有符号数-127。
(最高位/第一位是符號位)
这也就是说,对于同一个二进制数据,计算机可以将它当作无符号数据来运算,也可以当作有符号数据来运算。
示例
mov al
add al,1
结果: (al)
我们可以将add指令进行的运算当作无符号数的运算,那么add指令相当于计算129+1,结果为130);
也可以将add指令进行的运算当作有符号数的运算,那么add指令相当于计算-127+1,结果为-126)。
不管我们如何看待,CPU 在执行add等指令的时候,就已经包含了两种含义,也将得到用同一种信息来记录的两种结果。关键在于我们的程序需要哪一种结果。SF 标志,就是CPU对有符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。
如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。
这也就是说,CPU在执行add等指令时,是必然要影响到SF标志位的值的。至于我们需不需要这种
文档评论(0)