Maskinnära programmering i C och assembler
Maskinnära programmering i C och assembler
Maskinnära programmering i C och assembler
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