繁体   English   中英

零标志和进位标志之间的区别是什么?

[英]what is the diffrence between zero flag and carry flag ?

零标志和进位标志有什么区别?

对于零标志,它说

mov ax , 0FFFF ; 
inc ax ; AX= 0 , ZF=1

对于进位标志说

mov al , 0FFh
add al , 1  ; CF=1,AL=00

AL的值等于零,那么为什么零标志未设置为1?

不,两种情况下都将置零标志。 证明在布丁中:

在此处输入图片说明

INC指令不影响进位标志。 x86指令集中的一个奇怪现象,但几乎可以肯定是有意做的,以允许在使用ADC计算任意精度加法时增加指针或索引。

听起来好像您了解这些标志的含义/作用,以防万一:

如果运算结果为零,则零标志非常简单,否则将设置零标志,否则将很清楚

进位标志有多种使用方式,但在这种情况下,通过加法运算可以使用进位位,即无符号溢出。

假设您将两个十进制数字92和5相加得到97,没问题,如果您将92和12相加得到104,但是如果您拥有一个十进制计算机或一小块纸并且只能容纳两个结果是数字,那么答案是04而不是104,根据您要执行的操作,答案可能被认为是错误的。 在进行数学运算时,您对自己说2 + 2 = 4,那么9 + 1 = 0携带1。这是您将那个携带进位到下一列的原因,但是处理器的列数有限。

加法逻辑(子运算符使用加法)不知道或不关心有符号(二进制补码)与无符号数(这是二进制补码的美),您将操作数输入相同的逻辑即可得到相同的答案。 溢出的地方不同,无符号溢出是进位位。 如果处理器具有签名溢出(我一般来说不是专门针对一个处理器),则检测结果是否没有足够的信息来存储答案。 例如,0x80 + 0x80 = 0x00。 unsigned是128 + 128,您将得到一个有符号的溢出,unsigned是-128 + -128,结果是-256。 您添加了两个负数,负号加上负号等于负号,但最终结果是0x00,这是一个正数,溢出。 因此对于同时支持两种溢出的8位系统,0x80 + 0x80会同时产生两种溢出(加上零标志作为额外的奖励)。

无论使用什么标志设置指令,都需要查找和存储受每条指令影响的标志(用于设置标志)。 每个指令集都有不同的标志规则,并非每个alu指令都会影响所有标志,等等。如果您将inc指令与带有(小的)立即指令的加法分开使用(可用于执行inc),则是在设计人员将有一个影响标志,而另一个则没有。 对于这样的情况,尤其是当您具有相同寄存器EAX,AX,AH,AL的这些拆分定义时,您可以对寄存器的小数部分进行运算,即使其余部分将AH运算都声明为零,的寄存器不为零? 它是基于操作大小还是您所操作部分之外的整个寄存器的定义? 这里的每个人都可能知道答案,但是当您第一次开始学习该处理器时,一旦看到寄存器定义,那应该是第一个想法。 并且,在您查找并记住答案之前,您每次想要从指令中获取标志时都应查找它。 设计人员将有意将操作放入不会与标志混淆的位置,以节省执行操作所需的指令。 有些可能不会强制标志始终是决定分支之前的指令,有些(可能是)分支本身是alu操作和决策(无标志)。

您的问题的答案是在文档中查找它,养成查找它的习惯。 不要假定所有alu操作都会影响所有标志,请查找它以查找有问题的指令和寄存器。 回答“为什么”的原因是,这就是他们的想法,这就是事实,除非您是在设计新处理器的团队中,作为程序员,您将得到所得到的,然后使用它……您的问题本身会导致期望得到不同的答案,您将16位操作转换为8位操作,然后将其从加法转换为inc,这对于设计人员更改其定义(期望它们)是完全有效的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM