汇编语言和carryflag中的否定操作

时间:2014-01-13 09:59:28

标签: assembly carryflag

当我在汇编语言中对A79CDB48h进行负操作时,我得到CF(进位标志)设置为1.有人可以解释为什么会发生这种情况

2 个答案:

答案 0 :(得分:3)

首先,假设我们正在处理x86架构,它在Intel reference手册中定义。

 IF DEST = 0
   THEN CF ← 0;
   ELSE CF ← 1;
 FI;
 DEST ← [– (DEST)]

这种安排背后的一个可能原因是该特征可以作为广义加法/减法的副作用实现

 DEST ← [ TEMP - (DEST) ]

当操作码是NEG时,TEMP可以是[R/M]或者是0。 作为副作用,ALU将计算CF和其余标志,就好像操作是在两个通用寄存器之间进行的一样。这种安排只允许重复使用昂贵的硬件。后来的处理器只是简单地确认了规范,即使实现不是基于相同的微编码架构。

答案 1 :(得分:2)

困惑?可以理解的。

我将假设你正在使用各种各样的x86机器。

此实例中的进位标记表现不像您期望的那样。相反,它遵循这些规则......

“... 如果源操作数为0,则CF标志设置为0;否则设置为1.根据结果设置OF,SF,ZF,AF和PF标志。 / EM> ....“

我从THIS PAGE选了那个。查看“受标志影响”框。

我忘了哪个英特尔手册有这个记录,所以有人,请通过链接帮助这个人。

他们有理由这样做,他们通过记录它来处理异常。目前,你的工作就是忍受困惑并编写代码以适应它。

如果你正在做某事......

 Neg    Eax                    ;Negate some value
 Jc     It_was_positive        ;It was a positive number
 Jmp    It_was_negative        ;It was negative

...然后将您的Jc指令更改为其中一个已签名的算术条件跳转;并且警告:我不是在为你的具体问题编写代码,所以这对你的迫切需求来说可能是完全错误的。在你信任之前测试一下。

哦,警告你未来的努力:来自其他公司的其他芯片根据自己的愿望定义进位旗的行为。我认为这是Microchip;也许是其他人;随你;他们设计的进位标志与其他进位标志的工作方式完全相反。即,10状态可能与您的想法完全相反。

简短版本:一般规则是,不要使用JcJnc。改为使用算术条件指令。