22.08.2013 Views

Maskinnära programmering i C och assembler

Maskinnära programmering i C och assembler

Maskinnära programmering i C och assembler

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Globala variabler, minnesallokering<br />

Betrakta följande C-program bestående enbart av<br />

deklarationer av globala variabler:<br />

/*<br />

*/<br />

globals.c<br />

Deklaration av globala variabler<br />

short shortint;<br />

long longint;<br />

int justint;<br />

int intvec[10];<br />

struct {<br />

int s1;<br />

char s2;<br />

char* s3;<br />

} komplex;<br />

UPPGIFT 125:<br />

Skapa en ny källtext "globals.c" enligt ovanstående.<br />

Lägg filen till projektet. Välj<br />

Make<br />

för att kompilera filen.<br />

Nu skapas filen "globals.S" i underbiblioteket<br />

"codegen/debug". Öppna denna fil.<br />

SLUT PÅ UPPGIFT 125.<br />

CC12 - GMV Cross C compiler ....<br />

genfile "C:/xcc/src/globals.c"<br />

segment bss<br />

define _shortint<br />

_shortint:<br />

rmb 2<br />

define _longint<br />

_longint:<br />

rmb 4<br />

define _justint<br />

_justint:<br />

rmb 2<br />

define _intvec<br />

_intvec:<br />

rmb 20<br />

define _komplex<br />

_komplex:<br />

rmb 5<br />

Först genereras några inledande rader med text där<br />

XCC skriver ut aktuell version av kompilatorn<br />

(visas endast delvis).<br />

"genfile"-direktivet anger den absoluta sökvägen<br />

till källtextfilen. Informationen används exempelvis<br />

av länkaren vid varnings- eller fel- meddelanden.<br />

Observera att den absoluta sökvägen kan se<br />

annorlunda ut i ditt eget exempel.<br />

Eftersom deklararade variabler inte är initierade<br />

väljer kompilatorn:<br />

segment bss<br />

som segment för påföljande <strong>assembler</strong>direktiv.<br />

Eftersom variablerna är deklarerade globala sker<br />

alla referenser till dem med namn så att samtliga<br />

referenser (även från andra källtextfiler) kan lösas<br />

upp vid den slutliga länkningen. Det är ju normalt<br />

Arbetsbok för MC12<br />

först då som alla globala variabler är kända.<br />

Direktivet:<br />

define _shortint<br />

innebär att variabelnamnet får ett globalt scope<br />

(synlighet). Observera också den inledande<br />

understrykningen. Alla globala namn, såväl<br />

funktioner som variabler förses med detta av<br />

kompilatorn. På så sätt undviks namnkonflikter<br />

mellan exempelvis rutiner som skrivs i <strong>assembler</strong><br />

<strong>och</strong> placeras i programbibliotek, <strong>och</strong> funktioner<br />

som definierats i ett C-program. shortint är en<br />

variabel av typen short.<br />

ANSI-C definitionen av datatypen short:<br />

"Typen är synonym för: short int, signed<br />

short <strong>och</strong> signed short int. Det är ett<br />

heltal med tecken som kan representeras med 16<br />

bitar."<br />

Efter symbolnamnet _shortint har XCC<br />

placerat direktivet<br />

rmb 2<br />

vilket alltså reserverar 2 bytes för variabeln.<br />

På motsvarande sätt ser vi att variabeln _longint<br />

av typen long tilldelas 4 bytes i segmentet <strong>och</strong> att<br />

variabeln _justint av typen int tilldelas 2<br />

bytes. För XCC12 gäller alltså att typen short <strong>och</strong><br />

typen int är likvärdiga. Observera dock att detta<br />

inte gäller generellt för C. Datatypen int kan<br />

implementeras som 4-bytes i vissa system. Detta är<br />

exempelvis fallet för processorer som t.ex<br />

MC68000. Konsekvensen av detta är att man bör<br />

tänka sig för vid deklaration av int-typer, dvs om<br />

man har anledning att tro att variabeln i fråga kan<br />

tänkas tilldelas större värden än vad som ryms i en<br />

short så ska den deklareras som long. Denna<br />

tumregel måste följas som man vill skapa portabla<br />

program, dvs C-källkod som kan kompileras om i<br />

olika miljöer, för olika maskiner, <strong>och</strong> ändå fungera<br />

som avsett.<br />

Grundtanken med datatypen int, som ju<br />

egentligen kan betraktas som överflödig, är att den<br />

ska representera heltal som enkelt kan hanteras av<br />

den använda målprocessorns instruktionsrepertoir.<br />

Eftersom MC68HC12 inte direkt kan utföra<br />

instruktioner på 32-bitars tal måste variabler av typ<br />

long behandlas på ett speciellt sätt vid<br />

kodgenereringen. Vi återkommer till detta strax.<br />

De ”grundläggande datatyperna” i C är:<br />

char<br />

short (int)<br />

int<br />

long (int)<br />

pekare<br />

float<br />

double<br />

long double<br />

de tre sistnämnda avsedda för flyttal med olika<br />

precision. Vi återkommer till flyttalshantering.<br />

93

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!