<< Subrutiner, parametrar och lokala variabler | Exempelsamling MOP |
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:
@ 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.
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.
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
<< Subrutiner, parametrar och lokala variabler | Exempelsamling MOP |