Fält och sammansatta typer

1.5.1. De globala variablerna int j,c och vecc är definierade enligt: int j; char c, vecc[80]; Koda följande tilldelningar i assemblerspråk: a) c = vecc[0]; b) c = vecc[24]; c) c = vecc[j]; d) c = vecc[j+1];

a)
	LDR	R3,=vecc
	LDRB	R2,[R3]
	LDR	R3,=c
	STRB	R2,[R3]
b)
	LDR	R3,=vecc
	LDRB	R2,[R3,#24]
	LDR	R3,=c
	STRB	R2,[R3]
	c)
	LDR	R3,j
	LDR	R2,=vecc
	LDRB	R2,[R2,R3]
	LDR	R3,=c
	STRB	R2,[R3]
d)
	LDR	R3,j
	LDR	R2,=vecc
	ADD	R3,R2,R3
	LDRB	R2,[R3,#1]
	LDR	R3,=c
	STRB	R2,[R3]


1.5.2. De globala variablerna k, s och vecs är definierade enligt: int j; short s, vecs[80]; Koda följande tilldelningar i assemblerspråk: a) s = vecs[0]; b) s = vecs[24]; c) s = vecs[j]; d) s = vecs[j+1];

a)
	LDR	R3,=vecs
	LDRH	R2,[R3]
	LDR	R3,=s
	STRH	R2,[R3]
b)
	LDR	R3,=vecs
	LDRH	R2,[R3,#48]
	LDR	R3,=s
	STRH	R2,[R3]
c)
	LDR	R3,j
	LSL	R3,R3, #1
	LDR	R2,=vecs
	LDRH	R2,[R3,R2]
	LDR	R3,=s
	STRH	R2,[R3]
d)
	LDR	R3,j
	ADD	R3,R3,#1  
	LSL	R3,R3,#1
	LDR	R2,=vecs
	LDRH	R2,[R3,R2]
	LDR	R3,=s
	STRH	R2,[R3]


1.5.3. De globala variablerna i,j och veci är definierade enligt: int j; int i, veci[80]; Koda följande tilldelningar i assemblerspråk: a) i = veci[0]; b) i = veci[24]; c) i = veci[j]; d) i = veci[j+1];

a)
	LDR	R3,veci
	LDR	R2,=i
	STR	R3,[R2]
b)
	LDR	R3,=veci
	LDR	R2,[R3,#96]
	LDR	R3,=i
	STR	R2,[R3]
c)
	LDR	R3,j
	LSL	R3,R3,#2
	LDR	R2,=veci
	LDR	R2,[R3,R2]
	LDR	R3,=i
	STR	R2,[R3]
d)
	LDR	R3,j
	ADD	R3,R3,#1
	LSL	R3,R3,#2
	LDR	R2,=veci
	LDR	R2,[R3,R2]
	LDR	R3,=i
	STR	R2,[R3]


1.5.4. Vi har de globala deklarationerna: int i; char vc[20]; Visa en kodsekvens som evaluerar uttrycket vc[i]-vc[i+1] till register R0.

	LDR	R3,i
	LDR	R2,=vc
	ADD	R1,R2,R3	@ R1 = vc[i]
	LDRB	R3,[R2,R3]	@ R3 = M(char)(vc + i)
	LDRB	R2,[R1,#1]	@ R2 = M(char)(vc + i + 1)
	SUB	R0,R3,R2	@ R0 = (M(char)(vc + i))- (M(char)(vc + i + 1))


1.5.5. Vi har de globala deklarationerna: int i; char vc[20]; short vs[20]; Visa en kodsekvens som evaluerar uttrycket vc[i]+vs[i] till register R0.

	LDR	R3,i
	LDR	R2,=vc
	LDRB	R2,[R2,R3]	@ R2 = M(char)(vc+i)
	LSL	R3,R3,#1	@ R3 = i*2 (sizeof(short))
	LDR	R1,=vs
	LDRH	R3,[R3,R1]	@ R3 =M(short)(vs + i*2 )
	ADD	R0,R2,R3	@ R0 = M(vc+i) + M(vs + i*2 )


1.5.6. Vi har de globala deklarationerna: int i,j; char mc[8][16]; Visa en kodsekvens som evaluerar uttrycket mc[i][4] till register R0.

@ adress = mc + (i*16) + 4
	LDR	R3,i
	LSL	R3,R3,#4	@ R3 = i*16
	LDR	R2,=mc
  	ADD	R3,R2,R3	@ R3 = mc + (i*16)
	LDRB	R0,[R3,#4]	@ R0 = M(char) (mc + (i*16) + 4)


1.5.7. Vi har de globala deklarationerna: int i,j; char mc[8][5]; Visa en kodsekvens som evaluerar uttrycket mc[3][j] till register R0.

@ adress = mc + (3*5) + j
	LDR	R3,j
	LDR	R2,=mc
	ADD	R3,R2,R3	@ R3 = mc + j
	LDRB	R0,[R3,#15]	@ R0 = M(char)( mc+j+(3*5) )


1.5.8. Vi har de globala deklarationerna: int i,j; short ms[8][16]; Visa en kodsekvens som evaluerar uttrycket ms[7][j] till register R0.

@ adress = ms + (  7*16 + i  ) * sizeof(short) 
	LDR	R3,j
	ADD	R3,R3,#112	@ R3 = j+(7*16)
	LSL	R3,R3,#1	@ R3 = (j+(7*16))*2 
	LDR	R2,=ms				
	LDRH	R0,[R3,R2]	@ R0 = M(short) ((j+(7*16))*2)


1.5.9. Vi har de globala deklarationerna: int i,j; short ms[8][16]; Visa en kodsekvens som evaluerar uttrycket ms[i][3] till register R0.

@ adress = ms + (i*16 + 3) * sizeof(short)
	LDR	R3,i				
	LSL	R3,R3,#5	@ R3 = i*32 = i * 16 * 2
	LDR	R2,=ms
	ADD	R3,R2,R3	@ R3 = ms + i*16*2
	LDRH	R0,[R3,#6]	@ R0 = M(short) (ms + i*16*2 + 3*2 )


1.5.10. Vi har de globala deklarationerna: int i,j; int vm[10][5]; Visa en kodsekvens som evaluerar uttrycket vm[i][j] till register R0.

@ adress = vm+( (i*5) + j )* sizeof(int) 
	LDR	R3,i
	LSL	R2,R3,#2	@ R2=i*4
	ADD	R3,R2,R3	@ R3 = (i*4)+i = (i*5)
	LDR	R2,j		
	ADD	R3,R3,R2	@ R3=(i*5)+j
	LSL	R3,R3,#2	@ R3 = ((i*5)+j)*4   
	LDR	R2,=vm
	LDR	R0,[R3,R2]	@ R0 = M(int) ( ((i*5)+j)*4 )


1.5.11. Vi har de globala deklarationerna: int i,j; char vm[10][10]; Visa en kodsekvens som evaluerar uttrycket vm[i][j+1] till register R0.

@ adress = vm + i*10 + j + 1
	LDR	R3,i
	LDR	R1,j
	LSL	R2,R3,#2	@ R2 = (i*4)
	ADD	R3,R2,R3	@ R3 = (i*4+i)	
	LSL	R2,R3,#1	@ R2 = (i*4+i)*2 = i*10
	LDR	R3,=vm
	ADD	R3,R3,R2	@ R3 = vm + i*10 
	ADD	R3,R3,R1	@ R3 = vm + i*10 + j
	LDRB	R0,[R3,#1]	@ R0 = M(char)( vm + i*10 + j+1 )


1.5.12. Vi har deklarationen:

struct {
	int	a;
	char	b;
	short	c;
	COORD	d;	
} st;
Visa kodsekvenser som evaluerar följande uttryck i register R0.

a)	st.c;
b)	st.d.y
a)
	LDR	R3,=st
	LDRB	R0,[R3,#6]	@ R0 = st + 6 (offset_c)
b)
	LDR	R3,=st
	LDR	R0,[R3,#12]	@ R0=st.d.y (offset_d_y )