Assembly 减法进位
我使用的是MASM32 使用此代码:Assembly 减法进位,assembly,x86,status,masm,carryflag,Assembly,X86,Status,Masm,Carryflag,我使用的是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标志 5 - 10 = 5 + (-10) = 0x05 + (0xF5 + 1) = 0x05 + 0xF6 = 0xFB 0000010
mov eax,5
sub eax,10
将设置CF状态标志。但用我的铅笔和纸,我实际上看到MSB没有任何进位。是的,我知道从较小的数字减去较大的数字集CF。但我想知道为什么
因为使用此代码:
mov eax,5
mov ebx,10
not ebx
add ebx,1
add eax,ebx
永远不会设置CF标志
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
你是对的,因为它不起作用。减法运算是第二个操作数倒过来,进位倒过来的加法运算。一些处理器系列反转执行一些NOT。听起来你正在看一个在减法运算中反转进位的东西
因此,如果5-10给出进位(借位),然后在同一处理器上尝试10-5,则不应看到进位集(无借位)
你的第二个例子是加法运算,进位在我所知道的任何处理器上都没有反转,进一步支持进位是表示借位的正逻辑。在第一种情况下,进位标志被设置,因为你从较小的数字中减去较大的数字。在第二种情况下,让我们假设eax是8位寄存器
eax=00000101=05
ebx=00010000=10
not ebx=11101111
+ 1
---------------------
11110000
+ 0101
---------------------
11110101
未发生溢出,即未设置进位标志。是8086编程还是什么?所有x86在进行减法运算时反转进位的操作肯定是相同的?对,这就是为什么我将其编辑为处理器系列。我的意思是,如果比较x86、arm、avr、msp430、6502、z80等之间的进位标志,有些反转进位,有些反转进位。在一个家族甚至是一家公司中,我希望他们使用相同的解决方案。也许你第一次看到这个问题时我正在编辑它,正如你指出的,我不想造成混淆,即在这方面,一个x86可能与另一个不同。感谢指出+2当使用相同的逻辑时,硬件产生相同的答案加法或减法,不同之处在于该处理器如何处理进位。听起来这个处理器系列(x86)对减法运算反转进位(以及进位和第二个操作数进位),但对加法运算则不反转。