零标志和进位标志有什么区别?
对于零旗,它说
mov ax , 0FFFF ;
inc ax ; AX= 0 , ZF=1
对于携带标志,它说
mov al , 0FFh
add al , 1 ; CF=1,AL=00
AL
的值等于零,为什么零标志不设置为1?
答案 0 :(得分:3)
不,在两种情况下都会设置零标志。证据在于布丁:
INC指令不影响进位标志。 x86指令集中的一个怪癖,但几乎可以有意识地在计算ADC的任意精度加法时允许递增指针或索引。
答案 1 :(得分:2)
听起来你明白旗帜的意思/做法,以防万一:
如果操作结果为零,则零标志非常简单,零标志将被设置,否则将清除
进位标志有多种使用方式,但在这种情况下使用加法运算,它是进位位,无符号溢出。
假设您添加两个十进制数字92和5,您得到97,没问题,如果您添加92和12,您得到104,但如果您有十进制计算机或有一小块纸,你可以怎么办?结果只有两位数,那么答案是04而不是104,答案可能会被认为是错误的,这取决于你想要做什么。当你在做那个数学运算时,你对自己说2 + 2 = 4,然后9 + 1 = 0进位1.这是进位来自你携带那个到下一列,但处理器的列数有限
添加逻辑(sub使用添加)不知道或不关心有符号(二进制补码)和无符号数(这是两个补码的美),你将操作数提供给你得到相同答案的相同逻辑。溢出时,无符号溢出的位置是执行位。如果处理器有签名溢出(我通常说不是特定于一个处理器),则检测结果是否包含足够的信息来存储答案。例如,0x80 + 0x80 = 0x00。无符号即128 + 128,你得到一个带符号的溢出,unsigned是-128 + -128,结果是-256。您添加了两个负数,减去加减去等于减号,但最终得到的是0x00,这是一个正数,溢出。因此,对于支持两种溢出的8位系统,0x80 + 0x80将同时提供溢出(加上零标志作为额外的奖励)。
无论指令集是什么,如果您使用标志,您需要查找和/或记住受每条指令影响的标志(您用来设置标志)。每个指令集都有不同的标志规则,并不是每个alu指令都会影响所有的标志等。如果你有一个inc指令与一个可以用来执行inc的(小)立即指令的add相加的情况,那么设计师会有一个影响标志而另一个没有。对于像这样的情况,特别是你有相同寄存器的这些拆分定义,EAX,AX,AH,AL,你可以对寄存器的分数进行操作,你是否宣布AH操作为零,即使其余的寄存器不是零?它是基于操作大小的定义还是在您操作的部分之外的整个寄存器?这里的每个人都可能知道答案,但是当你第一次开始学习这个应该首先想到的处理器的时候看到寄存器定义。直到你查找答案并记住它,你应该在每次想要从指令中获取标志时查找它。设计人员会故意将操作放在那些不会弄乱标志的地方,以节省执行操作所需的指令。有些人可能不会强迫标志始终是决策分支之前的指令,一些(mips)分支本身就是alu操作和决策(没有标志)。
你的问题的答案是在文档中查找,养成查找它的习惯。不要假设所有alu操作都会影响所有标志,查找指令和寄存器。 “为什么”的答案是因为这就是他们想要做的事情,它就是这样,除非你是一个团队设计一个新的处理器,作为一个程序员,你得到你得到的,使用它...你的问题本身会导致对不同答案的期望,你从16位切换到8位操作,并且从一个add切换到inc,其中一个或两个对于设计者改变定义是完全有效的,期望它们。