【问题标题】:Carry flag in substraction减法进位标志
【发布时间】:2012-09-02 16:29:32
【问题描述】:

我正在使用 MASM32。

使用此代码:

mov eax,5
sub eax,10

CF 状态标志将被设置。但是使用我的铅笔和纸,我实际上看到 MSB 没有任何进位。是的,我知道从少数大数集 CF 中减法。但我想知道为什么?

因为使用了这段代码:

mov eax,5
mov ebx,10
not ebx
add ebx,1
add eax,ebx

CF 标志永远不会被设置。

【问题讨论】:

  • 是8086编程还是什么?

标签: assembly x86 status masm carryflag


【解决方案1】:
5 - 10 = 5 + (-10) = 0x05 + (0xF5 + 1) = 0x05 + 0xF6 = 0xFB

  00000101 -- 0x05
  11110101 -- 0xF5
+ 00000001 -- 0x01
==========
  11111011 -- 0xFB

这持续 16 位或 32 位或 64 位 0+1+0 = 1,进位 0

在它没有执行的意义上你是对的。减法是第二个操作数反转并且进位反转的加法。一些处理器系列反转执行一些不。听起来您正在查看一些可以反转减法执行的东西。

因此,如果 5 - 10 给出进位(借位),然后在同一处理器上尝试 10 - 5,您应该看不到进位位设置(没有借位)。

您的第二个示例是加法操作,进位不会在我知道的任何处理器上反转,进一步支持进位位是表示借位的正逻辑。

【讨论】:

  • 在减法时,在反转进位方面,所有 x86 的行为肯定都相同吗?
  • 对,这就是为什么我将其编辑为处理器系列。我的意思是,如果你比较 x86、arm、avr、msp430、6502、z80 等之间的进位标志,有些会反转进位,有些则不会。在一个家庭甚至一个公司中,我希望他们使用相同的解决方案。
  • 也许当你第一次看到它时我正在编辑它,正如你所指出的,我不想造成混淆,即在这方面一个 x86 可能与另一个不同。感谢您指出 +2
【解决方案2】:

在第一种情况下,设置进位标志是因为您从较小的数字中减去了较大的数字。在第二种情况下,假设 eax 是 8 位寄存器

    eax=00000101=05
    ebx=00010000=10
not ebx=11101111
         +     1
---------------------
        11110000
         +  0101
 ---------------------
        11110101

没有发生溢出,即没有设置进位标志。

【讨论】:

  • 硬件产生相同的答案加法或减法,因为使用相同的逻辑,不同的是如何处理该处理器的进位。听起来这个处理器系列(x86)对减法进行反转执行(以及进位和第二个操作数),但对加法没有反转。
猜你喜欢
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 2016-11-05
  • 2015-07-29
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多