我已经为如何设置进位标志提供了两种可能性:
0x00_00_00_00_00_00_00_00 - 0x80_00_00_00_00_00_00_00
(下划线显示字节)
如果通过减法做到这一点,我们将不得不借用我们没有的东西,这应该将CF设置为1.
但是,我认为ALU不会减去,而只是添加两个补码。 0x80_00_00_00_00_00_00_00的二进制补码是0x80_00_00_00_00_00_00_00。所以, 0x00_00_00_00_00_00_00_00 - 0x80_00_00_00_00_00_00_00不会携带63位中的任何位,这会将CF设置为0.
对于x86中的64位值,以下哪种情况有效?
ALU实际上是执行减法还是转换为2的补码,转换后的值是否进行减法?
由于
答案 0 :(得分:1)
请参阅Understanding Carry vs. Overflow conditions/flags了解有关携带的更多信息。
是的,当然,SUB的任何实现仍然必须保持相同的体系结构可见行为,包括标志结果。
ALU如何在内部工作并不重要,只有结果是什么,零减去非零产生进位,所以任何x86 CPU都会在这种情况下设置CF.任何没有的CPU都不是x86。
有关英特尔x86手册(以及许多其他优秀链接)的链接,请参阅x86标记维基;我确信在官方手册的某处有一个关于标志设置行为的部分。