零旗和带旗有什么区别?
对于零标志,上面写着
mov ax , 0FFFF ;
inc ax ; AX= 0 , ZF=1旗子上写着
mov al , 0FFh
add al , 1 ; CF=1,AL=00AL的值等于零,那么为什么零标志没有设置为1呢?
发布于 2012-06-08 12:49:36
听起来你好像明白旗子的意思/做什么,以防万一:
零标志非常简单,如果操作结果是零,则设置零标志,否则将是清楚的。
进位标志使用了很多种方式,但在这种情况下,使用add操作时,它是执行位,是无符号溢出。
假设你把小数92和5相加,没有问题,如果你加上92和12,你得到104,但是如果你有一台十进制计算机,或者你有一小片纸,结果你只能拿两位数,那么答案是04而不是104,答案可能会被认为是错误的,这取决于你想做什么。当您在做这个数学时,您对自己说2+2 = 4,然后9+ 1 =0携带1。也就是说,进位是从进位到下一列的,但是处理器有有限的列。
add逻辑(子使用add)不知道或不关心有符号(两个补码)与无符号数字(即两个补码的优点),您将操作数输入到相同的逻辑中,得到相同的答案。不同之处在于溢出,无符号溢出是执行位。如果处理器有签名溢出(我说的通常不是特定于一个处理器),则检测结果是否包含不足以存储答案的信息。例如,0x80 + 0x80 = 0x00。无符号,即128 + 128,你会得到一个有符号溢出,无符号它是-128 + -128,结果是-256。您添加了两个负数,减号加减数等于减数,但最后得到的是0x00,这是一个正数,溢出。因此,对于支持这两种溢出的8位系统,0x80 + 0x80将给出这两种溢出(加上零标志作为额外的奖励)。
无论指令集是什么,如果您使用的标志,您需要查找和或记住每个指令影响的标志(您正在使用设置标志)。每个指令集都有不同的标志规则,并不是每个alu指令都会影响所有的标志等等。当您有一个inc指令独立于一个可以用于执行inc的add (小的)立即指令时,设计人员有一个影响标志,而另一个没有。对于这种情况,尤其是当您拥有相同寄存器、EAX、AX、AH、AL的这些拆分定义时,您可以对寄存器的各个部分执行操作吗?即使寄存器的其余部分不是零,您是否也声明AH操作为零?这是一个基于操作大小的定义还是根据您操作的部分之外的整个寄存器定义的?这里的每个人都可能知道答案,但是当你第一次开始学习这个处理器时,当你看到寄存器定义时,这应该是第一个想法。在你查找答案并记住它之前,你应该在每次你想从指令中得到标志的时候去查找它。设计人员会有意地将操作放在不使用标志以保存执行操作所需指令的操作中。有些人可能不会强迫旗标始终是决策分支之前的指令,有些(mips)分支本身就是alu操作和决策(没有标志)。
你的问题的答案是在文档中查找它,养成查找它的习惯。不要假设所有alu操作都会影响所有标志,请查找指示并注册。“为什么”的答案是因为这是他们想要做的,这就是事实,除非你是一个设计新处理器的团队,作为一个程序员,你得到了你得到的东西,使用it...Your问题本身就会产生对不同答案的期望,你会从16位切换到8位操作,然后你从add to inc.切换到add to inc,无论是一个还是两者都是完全有效的,设计者可以改变定义,期望他们改变定义。
发布于 2012-06-08 10:07:14
不,在这两种情况下都会设置零标志。证据就在布丁里:

INC指令不影响进位标志。在x86指令集中有点古怪,但几乎可以肯定的是,在使用ADC计算任意精度加法时,有意允许递增指针或索引。
https://stackoverflow.com/questions/10945166
复制相似问题