如何将GE的ARM条件代码(N = V)?

时间:2017-05-30 13:54:18

标签: arm logic

enter image description here

从ARM汇编书中,我有这个表来检查来自N(负)和V(溢出)标志的条件。使用加法器电路如下,我试图了解是什么使得(大于或等于)条件可以用(N = V)来检查。我可以通过一些测试检查这种情况是否正常。

enter image description here

案例1:当结果为正或零时,应该没有溢出。

  1. 当x == y时,N = 0,V = 0 => N = V OK
  2. 当x> y(1> 0),N = 0,V = 0 =>行
  3. 当0> -1,N = 0,V = 0 =>好的
  4. 案例2:当出现溢出时,结果应为负数。

    1. 在2比特系统中,b01(1)-b11(-1)= b10(-2),V = 1& N = 1(结果为负)
    2. 我的问题是人们如何能够在数学上得出这个条件?

1 个答案:

答案 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

并且这些情况不能代表结果,签名溢出,但有趣的是比较仍然有效。