Uttrycksevaluering

1.3.1. Utgå från att följande deklarationer är gjorda på global nivå.
int a,b,c;

Visa en kodsekvens, i ARM assemblerspråk, som evaluerar följande uttrycks värde till register R0.
a) -b;
b) ~b;
c) a * -b;
d) a * (b+c);
e) a * b + c;

Lösning:
a)
    LDR	    R0,b
    NEG	    R0,R0
b)
    LDR	    R0,b
    MVN	    R0,R0
c)
    LDR	    R3,b
    NEG	    R3,R3
    LDR	    R0,a
    MUL	    R0,R0,R3
d)
    LDR	    R3,b
    LDR	    R2,c
    ADD	    R3,R3,R2
    LDR	    R0,a
    MUL	    R0,R0,R3
e)
    LDR 	R3,a
    LDR 	R2,b
    MUL 	R3,R3,R2
    LDR	    R2,c
    ADD	    R0,R3,R2

1.3.2. Deklarationen
int a,b,c;

är given. Ange den bästa kodningen av tilldelningssatsen:
a = b + c;

De olika lösningsalternativen är graderade från -1p..3p.
a)
LDR R1,b
LDR R2,c
ADD R0,R1,R2
STR R0,a
b)
LDR R1,=b
LDR R2,=c
ADD R0,R1,R2
STR R0,a
c)
LDR R1,b
LDR R2,c
ADD R0,R1,R2
LDR R7,=a
STRB R0,[R7]
d)
LDR R1,b
LDR R2,c
ADD R0,R1,R2
LDR R7,=a
STR R0,[R7]
e)
LDR R3,=b
LDR R2,=c
LDRB R3,[R3]
LDRB R2,[R2]
SUB R3,R3,R2
SXTB R3,R3
LDR R2,=a
STR R3,[R2]

Svar: d(3p), c,e(0p), a,b(-1p)

1.3.3. Deklarationen
unsigned short a,b,c;

är given. Ange den bästa kodningen av tilldelningssatsen:
a = b + c;

De olika lösningsalternativen är graderade från -1p..3p.
a)
LDRH R1,b
LDRH R2,c
ADD R0,R1,R2
STRH R0,a
b)
LDR R1,=b
LDRB R1,[R1]
LDR R2,=c
LDRB R2,[R2]
ADD R0,R1,R2
LDR R7,=a
STRB R0,[R7]
c)
LDR R1,=b
LDRH R1,[R1]
LDR R2,=c
LDRH R2,[R2]
ADD R0,R1,R2
LDR R7,=a
STRH R0,[R7]
d)
LDRH R1,b
LDRH R2,c
ADD R0,R1,R2
LDR R7,=a
STRH R0,[R7]
e)
LDR R1,=b
LDR R1,[R1]
LDR R2,=c
LDR R2,[R2]
ADD R0,R1,R2
LDR R7,=a
STRH R0,[R7]

Svar: c(3p), b,e(0p), a,d(-1p)

1.3.4. Deklarationerna
int a;
char b,c;

är givna. Ange den bästa kodningen av tilldelningssatsen:
a = b - c;

De olika lösningsalternativen är graderade från -1p..3p.
a)
LDR R3,=b
LDR R2,=c
LDRH R3,[R3]
LDRH R2,[R2]
SUB R3,R2,R3
SXTH R3,R3
STRH R3,a
b)
LDR R1,b
LDR R2,c
SUB R0,R1,R2
LDR R7,=a
STR R0,[R7]
c)
LDR R3,=b
LDR R2,=c
LDRB R3,[R3]
LDRB R2,[R2]
SUB R3,R2,R3
SXTB R3,R3
LDR R2,=a
STR R3,[R2]
d)
LDR R1,=b
LDR R2,=c
SUB R0,R1,R2
LDR R7,=a
STR R0,[R7]
e)
LDR R3,=b
LDR R2,=c
LDRB R3,[R3]
LDRB R2,[R2]
SUB R3,R3,R2
SXTB R3,R3
LDR R2,=a
STR R3,[R2]

Svar: e(3p), c(2p), a,d(-1p)

1.3.5. Utgå från att följande deklarationer är gjorda på global nivå.
int a,b,c;

Visa en kodsekvens, i ARM assemblerspråk, som evaluerar följande uttrycks värde till register R0.
a) a & 4;
b) a & b;
c) ~(a&8);
d) ~a&8;

a)
    MOV	    R3,#4
    LDR	    R2,a
    AND	    R0,R2,R3
b)
    LDR	    R3,b
    LDR	    R2,a
    AND	    R0,R2,R3
c)
    MOV	    R3,#8
    LDR	    R2,a
    AND	    R0,R2,R3
    MVN	    R0,R0
d)
    MOV 	R3,#8
    LDR	    R2,a
    MVN	    R2,R2
    AND	    R0,R2,R3

1.3.6. Deklarationen
unsigned int ua;

är given. Ange alternativet för den bästa kodningen av följande tilldelningssats:
ua = ua >> 5;

De olika lösningsalternativen är graderade från -1p..3p.
a)
LDR R6,=ua
LDR R0,[R6]
LSL R0,#5
STR R0,[R6]
b)
LDR R6,=ua
LDR R0,[R6]
ASR R0,#5
STR R0,[R6]
c)
LDR R6,=ua
LDR R0,[R6]
LSR R0,#5
STR R0,[R6]
d)
LDR R0,ua
LSR R0,#5
STR R0,ua
e)
LDR R0,=ua
LSL R0,#5
STR R0,ua

Svar: c(3p), a,b(0p), d,e(-1p)

1.3.7. Deklarationen
int a;

är given. Ange alternativet för den bästa kodningen av följande tilldelningssats:
a = a >> 5;

De olika lösningsalternativen är graderade från -1p..3p.
a)
LDR R0,a
LSR R0,#5
STR R0,a
b)
LDR R6,=a
LDR R0,[R6]
ASR R0,#5
STR R0,[R6]
c)
LDR R6,=a
LDR R0,[R6]
LSL R0,#5
STR R0,[R6]
d)
LDR R6,a
LDR R0,[R6]
LSR R0,#5
STR R0,[R6]
e)
LDR R0,=a
LSL R0,#5
STR R0,a

Svar: b(3p), c,d(0p), d,e(-1p)

1.3.8. Utgå från att följande deklarationer är gjorda på global nivå.
short b,c;
extern short f(void);

Visa en kodsekvens, i ARM assemblerspråk, som evaluerar följande uttrycks värde till register R0.
c * f();

    BL      f
    LDR     R3,=c
    LDRH    R3,[R3]
    MUL     R0,R3


1.3.9. Utgå från att följande deklarationer är gjorda på global nivå.
int b,c;
extern int f(void);

Visa en kodsekvens, i ARM assemblerspråk, som evaluerar följande uttrycks värde till register R0.
c * f() - b;

    BL      f
    LDR     R3,c
    MUL     R0,R0,R3
    LDR     R3,b
    SUB     R0,R0,R3	


1.3.10. Utgå från att följande deklarationer är gjorda på global nivå.
char f(void);
int a,b;

Visa en kodsekvens, i ARM assemblerspråk, som evaluerar följande uttrycks värde till register R0.
f() + a * ~( b & 4 );

    BL      f
    SXTB    R0,R0
    LDR	    R3,b
    MOV	    R2,#4
    AND	    R3,R3,R2
    MVN	    R3,R3
    LDR	    R2,a
    MUL	    R2,R2,R3
    ADD	    R0,R0,R2