当我在汇编语言中对A79CDB48h进行负操作时,我得到CF(进位标志)设置为1.有人可以解释为什么会发生这种情况
答案 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;也许是其他人;随你;他们设计的进位标志与其他进位标志的工作方式完全相反。即,1
和0
状态可能与您的想法完全相反。
简短版本:一般规则是,不要使用Jc
和Jnc
。改为使用算术条件指令。