从ARM汇编书中,我有这个表来检查来自N(负)和V(溢出)标志的条件。使用加法器电路如下,我试图了解是什么使得(大于或等于)条件可以用(N = V)来检查。我可以通过一些测试检查这种情况是否正常。
案例1:当结果为正或零时,应该没有溢出。
案例2:当出现溢出时,结果应为负数。
我的问题是人们如何能够在数学上得出这个条件?
答案 0 :(得分:1)
请注意,已经在SO上询问并回答了这个问题。不知道何时/何地。
#include <stdio.h>
int main ( void )
{
unsigned int ra;
unsigned int rb;
unsigned int rc;
unsigned int xa,xb,xc;
unsigned int za,zb,zc;
unsigned int rd;
int sa,sb,sc;
unsigned int n,v;
for(ra=0;ra<=7;ra++)
{
for(rb=0;rb<=7;rb++)
{
rc=ra-rb;
xa=ra&3;
xb=(~rb)&3;
xc=xa+xb+1;
za=ra&7;
zb=(~rb)&7;
zc=za+zb+1;
if(((xc>>2)&1)!=((zc>>3)&1))
{
v=1;
}
else
{
v=0;
}
n=(rc>>2)&1;
sa=ra; if(sa&4) sa|=0xFFFFFFF8;
sb=rb; if(sb&4) sb|=0xFFFFFFF8;
sc=rc&7; if(sc&4) sc|=0xFFFFFFF8;
for(rd=4;rd;rd>>=1) if(rd&ra) printf("1"); else printf("0");
printf(" - ");
for(rd=4;rd;rd>>=1) if(rd&rb) printf("1"); else printf("0");
printf(" = ");
for(rd=8;rd;rd>>=1) if(rd&rc) printf("1"); else printf("0");
printf(" %u %u ",n,v);
printf("(%+2d) - (%+2d) = (%+2d) ",sa,sb,sc);
if(n==v) printf("*"); else printf(" ");
if(sa>=sb) printf("x"); else printf(" ");
printf("\n");
}
}
return(0);
}
000 - 000 = 0000 0 0 (+0) - (+0) = (+0) *x
000 - 001 = 1111 1 0 (+0) - (+1) = (-1)
000 - 010 = 1110 1 0 (+0) - (+2) = (-2)
000 - 011 = 1101 1 0 (+0) - (+3) = (-3)
000 - 100 = 1100 1 1 (+0) - (-4) = (-4) *x
000 - 101 = 1011 0 0 (+0) - (-3) = (+3) *x
000 - 110 = 1010 0 0 (+0) - (-2) = (+2) *x
000 - 111 = 1001 0 0 (+0) - (-1) = (+1) *x
001 - 000 = 0001 0 0 (+1) - (+0) = (+1) *x
001 - 001 = 0000 0 0 (+1) - (+1) = (+0) *x
001 - 010 = 1111 1 0 (+1) - (+2) = (-1)
001 - 011 = 1110 1 0 (+1) - (+3) = (-2)
001 - 100 = 1101 1 1 (+1) - (-4) = (-3) *x
001 - 101 = 1100 1 1 (+1) - (-3) = (-4) *x
001 - 110 = 1011 0 0 (+1) - (-2) = (+3) *x
001 - 111 = 1010 0 0 (+1) - (-1) = (+2) *x
010 - 000 = 0010 0 0 (+2) - (+0) = (+2) *x
010 - 001 = 0001 0 0 (+2) - (+1) = (+1) *x
010 - 010 = 0000 0 0 (+2) - (+2) = (+0) *x
010 - 011 = 1111 1 0 (+2) - (+3) = (-1)
010 - 100 = 1110 1 1 (+2) - (-4) = (-2) *x
010 - 101 = 1101 1 1 (+2) - (-3) = (-3) *x
010 - 110 = 1100 1 1 (+2) - (-2) = (-4) *x
010 - 111 = 1011 0 0 (+2) - (-1) = (+3) *x
011 - 000 = 0011 0 0 (+3) - (+0) = (+3) *x
011 - 001 = 0010 0 0 (+3) - (+1) = (+2) *x
011 - 010 = 0001 0 0 (+3) - (+2) = (+1) *x
011 - 011 = 0000 0 0 (+3) - (+3) = (+0) *x
011 - 100 = 1111 1 1 (+3) - (-4) = (-1) *x
011 - 101 = 1110 1 1 (+3) - (-3) = (-2) *x
011 - 110 = 1101 1 1 (+3) - (-2) = (-3) *x
011 - 111 = 1100 1 1 (+3) - (-1) = (-4) *x
100 - 000 = 0100 1 0 (-4) - (+0) = (-4)
100 - 001 = 0011 0 1 (-4) - (+1) = (+3)
100 - 010 = 0010 0 1 (-4) - (+2) = (+2)
100 - 011 = 0001 0 1 (-4) - (+3) = (+1)
100 - 100 = 0000 0 0 (-4) - (-4) = (+0) *x
100 - 101 = 1111 1 0 (-4) - (-3) = (-1)
100 - 110 = 1110 1 0 (-4) - (-2) = (-2)
100 - 111 = 1101 1 0 (-4) - (-1) = (-3)
101 - 000 = 0101 1 0 (-3) - (+0) = (-3)
101 - 001 = 0100 1 0 (-3) - (+1) = (-4)
101 - 010 = 0011 0 1 (-3) - (+2) = (+3)
101 - 011 = 0010 0 1 (-3) - (+3) = (+2)
101 - 100 = 0001 0 0 (-3) - (-4) = (+1) *x
101 - 101 = 0000 0 0 (-3) - (-3) = (+0) *x
101 - 110 = 1111 1 0 (-3) - (-2) = (-1)
101 - 111 = 1110 1 0 (-3) - (-1) = (-2)
110 - 000 = 0110 1 0 (-2) - (+0) = (-2)
110 - 001 = 0101 1 0 (-2) - (+1) = (-3)
110 - 010 = 0100 1 0 (-2) - (+2) = (-4)
110 - 011 = 0011 0 1 (-2) - (+3) = (+3)
110 - 100 = 0010 0 0 (-2) - (-4) = (+2) *x
110 - 101 = 0001 0 0 (-2) - (-3) = (+1) *x
110 - 110 = 0000 0 0 (-2) - (-2) = (+0) *x
110 - 111 = 1111 1 0 (-2) - (-1) = (-1)
111 - 000 = 0111 1 0 (-1) - (+0) = (-1)
111 - 001 = 0110 1 0 (-1) - (+1) = (-2)
111 - 010 = 0101 1 0 (-1) - (+2) = (-3)
111 - 011 = 0100 1 0 (-1) - (+3) = (-4)
111 - 100 = 0011 0 0 (-1) - (-4) = (+3) *x
111 - 101 = 0010 0 0 (-1) - (-3) = (+2) *x
111 - 110 = 0001 0 0 (-1) - (-2) = (+1) *x
111 - 111 = 0000 0 0 (-1) - (-1) = (+0) *x
所以它有效,这是一个开始。
什么样的情况导致正数,但仍然a大于b所以a-b> = 0得到n = 0,对于那些情况,当v = 0时,即delta小于4这种情况,因为你不能做一个积极的4但你可以做一个积极的。如果delta更大,则结果继续比4更正,这是有符号的溢出。
对于n = 1 a-b 这些案例 并且这些情况不能代表结果,签名溢出,但有趣的是比较仍然有效。000 - 100 = 1100 1 1 (+0) - (-4) = (-4) *x answer +4
001 - 100 = 1101 1 1 (+1) - (-4) = (-3) *x +5
001 - 101 = 1100 1 1 (+1) - (-3) = (-4) *x +4
010 - 100 = 1110 1 1 (+2) - (-4) = (-2) *x +6
010 - 101 = 1101 1 1 (+2) - (-3) = (-3) *x +5
010 - 110 = 1100 1 1 (+2) - (-2) = (-4) *x +4
011 - 100 = 1111 1 1 (+3) - (-4) = (-1) *x +7
011 - 101 = 1110 1 1 (+3) - (-3) = (-2) *x +6
011 - 110 = 1101 1 1 (+3) - (-2) = (-3) *x +5
011 - 111 = 1100 1 1 (+3) - (-1) = (-4) *x +4