Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 减法进位_Assembly_X86_Status_Masm_Carryflag - Fatal编程技术网

Assembly 减法进位

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

我使用的是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

  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)对减法运算反转进位(以及进位和第二个操作数进位),但对加法运算则不反转。