当我用汇编语言对 A79CDB48h 进行负操作时,我将 CF(进位标志)设置为 1。有人可以解释为什么会发生这种情况
2 回答
首先,假设我们正在处理 x86 架构,它的定义与英特尔参考手册中的一样。
IF DEST = 0
THEN CF ← 0;
ELSE CF ← 1;
FI;
DEST ← [– (DEST)]
这种安排背后的一个可能原因是,该功能可以作为广义加法/减法的副作用来实现
DEST ← [ TEMP - (DEST) ]
当操作码为 NEG 时, TEMP 可以是[R/M]
或立即数 0。作为副作用,ALU 将计算 CF 和其余标志,就像在两个通用寄存器之间进行操作一样。这种安排简单地允许重复使用昂贵的硬件。后来的处理器只是简单地确认了规范,即使实现不是基于相同的微编码架构。
使困惑 ?可以理解。
我将假设您正在使用某种类型的 x86 机器。
在这种情况下,进位标志的行为与您期望的不同。相反,它遵循这些规则......
“...如果源操作数为 0,则 CF 标志设置为 0;否则设置为 1。根据结果设置 OF、SF、ZF、AF 和 PF 标志......”
我从THIS PAGE中选择了它。查看“受影响的标志”框。
我忘记了哪个英特尔手册记录了这个,所以有人请帮助这个人提供一个链接。
他们这样做是有原因的,他们通过记录异常来处理它。目前,您的工作是忍受这种混乱并编写代码来适应它。
如果你正在做类似的事情......
Neg Eax ;Negate some value
Jc It_was_positive ;It was a positive number
Jmp It_was_negative ;It was negative
...然后将您的Jc
指令更改为有符号算术条件跳转之一;并警告:我不在为您的特定问题编写代码,因此对于您的迫切需要,这可能是完全错误的。在你信任它之前测试它。
哦,警告你未来的努力:其他公司的其他芯片根据自己的意愿定义进位标志的行为。我认为是微芯片;也许是其他人;任何; 他们设计的进位标志与其他进位标志的工作方式完全相反。即,1
and0
状态的含义可能与您的想法完全相反。
简短版本:一个好的一般规则是,不要使用Jc
and Jnc
。请改用算术条件指令。