Uppgifter på hela kapitlet

1.7.1. För att referera absoluta adresser, exempelvis portar, krävs att en konstant (den absoluta portadressen) förses med lämpliga explicita typkonverteringar. Visa korrekta typkonverteringar (ANSI-C) i följande fall där portadressen är 0x40000000:
a) 8-bitars port där portens innehåll betraktas som tal utan tecken.
b) 8-bitars port där portens innehåll betraktas som tal med tecken.
c) 16-bitars port där portens innehåll betraktas som tal utan tecken.
d) 16-bitars port där portens innehåll betraktas som tal med tecken.

a) (( volatile unsigned char *)	0x40000000)
b) (( volatile signed char *)	0x40000000)
c) (( volatile unsigned short *) 0x40000000)
d) (( volatile signed short *)	0x40000000)


1.7.2. För att referera absoluta adresser, exempelvis portar, krävs att en konstant (den absoluta portadressen) förses med lämpliga explicita typkonverteringar. Visa korrekta typkonverteringarna, i följande fall där portadressen är 0x40012000. Använd C99 utvidgningen stdint.h för maximal portabilitet
a) 8-bitars port där portens innehåll betraktas som tal utan tecken.
b) 8-bitars port där portens innehåll betraktas som tal med tecken.
c) 16-bitars port där portens innehåll betraktas som tal utan tecken.
d) 16-bitars port där portens innehåll betraktas som tal med tecken.

#include <stdint.h>
a) (( volatile uint8_t *) 0x40012000)
b) (( volatile int8_t *) 0x40012000)
c) (( volatile uint16_t *) 0x40012000)
d) (( volatile int16_t *) 0x40012000)


1.7.3. Visa typdeklarationer för funktioner som tillåter att funktionen kan anropas direkt från ett C-program via en pekarvariabel av denna typ.
a) typen vfunc har inga parametrar och inget returvärde.
b) typen pfunc har en parameter av typen unsigned char, men inget returvärde.
c) typen rfunc har inga parametrar men returvärde av typen unsigned char.

a)
typedef void (* vfunc )(void);
b)
typedef void (* pfunc )(char);
c)
typedef char (* rfunc )(void);


1.7.4. Visa med typdeklarationer och makron hur du kan skapa symboler för funktioner på fasta adresser i minnet på ett sådant sätt att funktionerna kan anropas direkt från ett C-program.
a) typen reentry_t och funktionen reentry har inga parametrar och inget returvärde, på adress 0x8000201.
b) typen outchar_t och funktionen outchar har en parameter av typen unsigned char, men inget returvärde, på adress 0x8000209.
c) typen tstchar_t och funktionen tstchar har inga parametrar men returvärde av typen unsigned char, på adress 0x800020D.

a)
typedef void (* reentry_t )(void);
#define reentry ((reentry_t) (0x8000201))
b)
typedef void (* outchar_t)(char);
#define outchar ((outchar_t) (0x8000209))
c)
typedef char (* tstchar_t)(void);
#define tstchar ((tstchar_t) (0x800020D))


1.7.10. Funktionen int g( int ) är definierad. Visa hur följande funktion kan kodas i assemblerspråk:

int f( int val ) { int i; int bits = 0; for( i=0 ; i< val; i++ ) { bits = bits | g(i); } return bits; }
@ Registerallokering:
@ R0, parameter och returvärde
@ R4 ”i”
@ R5 ”bits”
@ R6 ”val” spill från R0
f:
PUSH		{R4,R5,R6,LR}
@ 'prolog'
	MOV		R6,R0	@ spillregister R6
	MOV		R5,#0  		@ bits = 0;
@ 'uttryck 1'
	MOV		R4,#0	@ i = 0;
@ 'For_continue' – 'uttryck 2'
.L1:
	CMP		R4,R6	@ i - val
	BGE		.L2		@ i < val, komplementvillkor
@ 'satser'
	MOV		R0,R4
	BL		g			@ g(i);
	ORR		R5,R5,R0		@ bits = bits | g(i);
@ 'uttryck 3'
	ADD		R4,R4,#1		@ i++;
	B		.L1
@ 'For_Break'
.L2:
	MOV		R0,R5	@ “bits” -> R0 (returvärde)
	POP		{R4,R5,R6,PC}


1.7.21. I standard-C biblioteket finns funktionen strlen, för att bestämma längden av en ASCII-sträng i minnet. Strängslut markeras med tecknet ’\0’, dvs. 0. Funktionen returnerar antalet tecken i strängen förutom det avslutande nolltecknet. strlen kan implementeras på följande sätt, visa hur funktionen kan kodas i assemblerspråk.

int strlen( char * str ) { int rval = 0; while( *str++ ) rval++; return rval; }
strlen:
@ Registeranvändning:
@  R0= &str
@  R1= rval
@  R2= temporärregister
	MOV	R1,#0		@ rval = 0;
.L0:
	LDRB	R2,[R0]		@ R2 = *str
	CMP	R2,#0		@ *src != 0
	BEQ	.L1
	ADD	R0,R0,#1	@ str++
	ADD	R1,R1,#1	@ rval++
	B	.L0
.L1:
	MOV	R0,R1		@ return rval;
	BX	LR	


1.7.22. I standard-C biblioteket finns funktionen strcpy, för att kopiera en ASCII-sträng i minnet. Strängslut markeras med tecknet ’\0’, dvs. 0 och detta tecken ska vara det sista som kopieras. Funktionen returnerar dest och kan implementeras på följande sätt, visa hur detta kan kodas i assemblerspråk.

char *strcpy( char *dest, char * src ) { char *rval = dest; do{ *dest++ = *src++; } while( *(src-1) ); return rval; }
strcpy:
@ Registeranvändning:
@  R0= &dest
@  R1= &src
@  R2= temporärregister
@  R3= lokal variabel rval
	MOV	R3,R0	@ rval = dest
.L0:
	LDRB	R2,[R1]	@ R2 = *src
	STRB	R2,[R0]	@ *dest = R2
	ADD	R1,R1,#1	@ src++
	ADD	R0,R0,#1	@ dest++
	CMP	R2,#0	@ *src != 0
	BNE	.L0
	MOV	R0,R3
	BX	LR