2016-11-12 55 views
1

我中遇到的两种可能性是怎么进位标志可以进行设置:subq和cf如何协同工作?

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的补和转化价值做减法?

感谢

+2

你为什么不尝试它? x86会减去,所以它会将CF设置为1.一些体系结构确实使用CF进行减法运算。 – Jester

+0

我不知道如何测试这个?我怎么去看看结果?我在介绍系统类;一切都在C.我可以查看反汇编,但我不知道如何查看状态寄存器?我可以编程一些东西来尝试推断发生了什么,但我很想知道如何实际查看标志。 –

+0

使用调试器。 '(gdb)p $ eflags'给出'$ 1 = [CF PF SF IF OF]'另外,如果你用C编码,你为什么要关心标志?编译器会照顾他们...... – Jester

回答

1

Understanding Carry vs. Overflow conditions/flags了解更多关于随身携带。

当然是SUB的任何实现仍具有保持相同的架构可见的行为,其中包括标志结果。

不要紧的ALU的内部工作原理,只有结果是什么,零负非零产生进位,所以所有的x86 CPU会在这种情况下设定CF。任何不是不是x86的CPU。

请参阅参考资料,以英特尔的x86手册(和很多其他不错的链接)的标签维基;我确定在官方手册的某处有一段关于设置标志的行为。