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 溢出vs携带标志,真正的基本术语_Assembly_Arm_Carryflag - Fatal编程技术网

Assembly 溢出vs携带标志,真正的基本术语

Assembly 溢出vs携带标志,真正的基本术语,assembly,arm,carryflag,Assembly,Arm,Carryflag,我一直在试图弄清楚溢出和携带(对于ARM7,但足够基本,我指的是适用于任何东西的术语) 我想我终于有了它——但我想检查一下我的“真正的基本理解”是否正确,所有的复杂性是否都消除了,它是否真的可以归结为: unsigned => V = 0 V = 1 => bit n is incorrect C = 1 => bit n+1 'exists' 谢谢,关于溢出,这些状态位与无符号vs Two补码有关 加法本身是符号独立的,这就是二补的美。一个逻辑块可用于无符号和有符号的

我一直在试图弄清楚溢出和携带(对于ARM7,但足够基本,我指的是适用于任何东西的术语)

我想我终于有了它——但我想检查一下我的“真正的基本理解”是否正确,所有的复杂性是否都消除了,它是否真的可以归结为:

unsigned => V = 0   
V = 1 => bit n is incorrect
C = 1 => bit n+1 'exists'

谢谢,

关于溢出,这些状态位与无符号vs Two补码有关

加法本身是符号独立的,这就是二补的美。一个逻辑块可用于无符号和有符号的加法和减法运算。对于无符号与有符号的加法或减法,唯一重要的地方是溢出位、无符号溢出(也称进位)和有符号溢出(也称溢出)

自从我们在小学学习了进位之后,进位希望变得更加明显:

   7
  +4
=====
您需要“携带一个”才能进行添加。在二进制中完全相同,只是处理器通常有固定数量的位置,在这些位置上,操作的宽度与您有多少纸张有关

因此,对于任何加法,如果设置了msbit的
执行
,则会出现无符号溢出,我们没有足够的位来容纳列数

现在这导致了一些混乱,因为进位也被用于减法,这成为了一个实现的东西,所以我不一定(也不是个人)记住arm做这个,x86做那个,等等。但是记住,一种计算2补数的方法,是“倒数加1”。例如,当你想从7中减去5时,你在逻辑中要做的不是加-5,而是加上5的补数,然后设置(反转)进位

    1  <- invert or set the carry in bit
  111  <- 7 (0b111)
+ 010  <- ones complement of 5 (0b101)
=====
结果是2(2b010)和执行

不,
执行
并不意味着无符号溢出。进行减法运算时,请将
执行
视为从溢出角度反转。这里是一些处理器变化的地方。当运算为减法运算时,一些运算会反转
进位标志的结果,因此上述ALU运算可能导致该减法运算的
进位标志
为1或
进位标志
为0,具体取决于处理器,这也意味着如果处理器支持,则在使用借用进行减法运算时,
进站
在进站途中会反转或不反转

那么签名溢出呢

让我们看看三种位模式:

    unsigned signed
000  0       0
001  1       1
010  2       2
011  3       3
100  4      -4
101  5      -3 
110  6      -2
111  7      -1
例如,如果我们要添加位模式2b011+2b010,无符号的是3+2=5,有符号的是3+2=-3…嗯,这是错误的。签名溢出将告诉您这一点。执行
时,不会为该操作设置无符号溢出,但会设置有符号溢出。对于x86,甚至可能有半溢出和完全溢出?不止一个溢出?有些人有一个带有
AL
AH
AX
之类的东西

反正

  0100  < - carry in and out
   011
 + 010
======
   100
0100<-进进出出
011
+ 010
======
100
请注意,msbit的
进位
是1,而
执行
是0,这就是我们检测有符号溢出的方式


是的,你可以认为它是错误的,因为符号是错误的。但从数学角度来看,这并不是错的,位符号是错的,因为没有足够的位来存储答案,这与7+5=12=0b1100的无符号加法没有什么不同。如果我们有一个3位加法器,我们将得到7+5=4,执行表示没有足够的空间来存储结果的所有位。无符号溢出。

溢出标志指示是否发生了有符号溢出。进位标志表示应该进行进位。。但我的意思是“什么时候发生的”。如果第n位(如果有符号)被(错误地)更改,则出现有符号溢出,如果有一些理论上的n+1位,则出现进位,对吗?此外,无符号加法也不会导致溢出,对吗?因此,对于加法,结果的位模式不关心无符号与有符号,输入操作数和输出是相同的。乘法确实关心有符号与无符号。尝试组合3位模式及其有符号与无符号结果,如果3位输入相乘,则允许产生6位结果……还要注意,mips add unsigned是一个非常糟糕且令人困惑的助记符名称。它只是指带有无符号溢出(执行)检测的加法,而不是有符号与无符号加法,因为这太傻了。谢谢。那么V是进位和出位的异或,对吗?tldr:我的手术大体上说是正确的(有点像)?
  0100  < - carry in and out
   011
 + 010
======
   100