2

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

4

2 回答 2

4

首先,假设我们正在处理 x86 架构,它的定义与英特尔参考手册中的一样。

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

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

 DEST ← [ TEMP - (DEST) ]

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

于 2014-01-13T10:32:44.553 回答
2

使困惑 ?可以理解。

我将假设您正在使用某种类型的 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指令更改为有符号算术条件跳转之一;并警告:我不在为您的特定问题编写代码,因此对于您的迫切需要,这可能是完全错误的。在你信任它之前测试它。

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

简短版本:一个好的一般规则是,不要使用Jcand Jnc。请改用算术条件指令。

于 2014-01-13T20:20:22.153 回答