4

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

对于零标志,它说

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

对于携带标志,它说

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

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

4

2 回答 2

4

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

零标志非常简单如果操作的结果是零零标志将被设置否则它将被清除

进位标志有多种使用方式,但在这种情况下,对于加法操作,它是进位位,即无符号溢出。

假设你将两个十进制数字 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,这是一个正数,溢出。

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

您的问题的答案是在文档中查找,养成查找的习惯。不要假设所有 alu 操作都会影响所有标志,请查找相关指令和寄存器。“为什么”的答案是因为这就是他们想要做的事情,它就是这样,除非你在一个设计新处理器的团队中,作为程序员,你得到你得到的东西,使用它......你的问题本身会导致对不同答案的期望,您从 16 位操作切换到 8 位操作,然后从添加切换到 inc,其中一个或两个对于设计人员更改定义是完全有效的,期望他们这样做。

于 2012-06-08T12:49:36.660 回答
3

不,在这两种情况下都会设置零标志。证据在布丁中:

在此处输入图像描述

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

于 2012-06-08T10:07:14.307 回答