2012-09-02 63 views
5

我正在使用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标志不会被永远设置。

+0

是8086编程还是什么? – nKandel

回答

5
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,则不应该看到进位位设置(无借位)。

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

+1

当然,所有的x86在执行减法操作时都会执行相同的操作。 – harold

+0

对,这就是为什么我编辑它说处理器家族。我的意思是如果你比较x86,arm,avr,msp430,6502,z80等之间的进位标志,一些反转执行,一些不。在一个家庭甚至一家公司,我希望他们使用相同的解决方案。 –

+1

好吧,错过了 – harold

1

在第一种情况下,进位标志被设置,因为你从one.In第二情况小减去更大数目的允许假设EAX是8位寄存器,然后

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

不溢出是发生即没有进位标志置位。

+2

硬件产生相同的答案增加或减少,因为使用相同的逻辑,不同之处在于如何处理该处理器的执行。它听起来像这个处理器系列(x86)反转执行(以及进位和第二个操作数)进行减法,但不加反转。 –