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.
XCC12 Kodgenerering<br />
Under detta moment ska vi ge en detaljerad<br />
beskrivning av hur XCC12 genererar kod för<br />
MC68HCS12. Momentet innehåller en rad<br />
uppgifter avsedda för självverksamhet.<br />
Minnesdisposition<br />
Programkod <strong>och</strong> data indelas i olika segment,<br />
figuren nederst på denna sida beskriver hur<br />
minnesdispositionen för ett komplett program,<br />
under exekvering, kan se ut. Figuren förstås bäst<br />
mot bakgrund av hur ett program översätts, sparas<br />
(eventuellt på en hårddisk), laddas till primärminnet<br />
<strong>och</strong> exekveras.<br />
prefix<br />
Prefixet, eller som det också kallas, startup,<br />
placeras alltid först. Detta är nödvändigt för att<br />
programmet ska ha en känd startpunkt. Jämför med<br />
den tidigare övningen med ”appstart”. Prefixet<br />
ingår i den så kallade runtime-miljön som<br />
installerades tillsammans med kompilatorn.<br />
programkod<br />
Här placeras all programkod. Den får inte vara<br />
självmodifierande, dvs segmentet förutsätts vara<br />
read-only. Kompilatorn gör en "bild" av maskinkod<br />
som laddas i minnet. Av tradition namnges detta<br />
segment "text".<br />
initierade data<br />
Deklarationer som<br />
int a = 2;<br />
char array[] = {"String of Text"};<br />
kan användas för att deklarera initierade globala<br />
variabler. Innehållet är definierat från start, men<br />
kan komma att ändras under exekvering.<br />
Kompilatorn måste göra en "bild" även av detta<br />
segment för att dessa initialvärden ska kunna laddas<br />
till minnet före exekvering. XCC använder två<br />
olika segment ”data” <strong>och</strong> ”cdata” (constant<br />
data) för initierade globala variabler.<br />
Run-Time, existerar<br />
endast då programmet<br />
exekveras<br />
Image, skapas av<br />
kompilator/länkare<br />
laddas till minnet<br />
omedelbart före<br />
exekvering<br />
stack<br />
heap<br />
icke initierade data<br />
(bss)<br />
initierade data<br />
(data)<br />
programkod<br />
(text)<br />
prefix<br />
EXEMPEL<br />
Arbetsbok för MC12<br />
Beroende på hur en textsträng deklareras kommer<br />
kompilatorn att placera den i olika segment:<br />
Satsen<br />
printf("Denna text ...");<br />
ger samma resultat på bildskärmen som:<br />
char reftext[]={"Denna text ..."};<br />
printf("%s", reftext);<br />
dvs en textsträng skrivs ut.<br />
Kompilatorn betraktar dock textsträngarna på helt<br />
olika sätt. I det första fallet är det en konstant<br />
sträng, som inte kan refereras av programmet från<br />
någon annan punkt än just i printf-satsen. Eftersom<br />
den inte kan refereras kan den heller inte ändras,<br />
textsträngen är därför read-only, <strong>och</strong> placeras i<br />
cdata-segmentet.<br />
I det andra fallet är det omedelbart klart att denna<br />
texsträng kan refereras även från andra ställen i<br />
programmet, t.ex:<br />
strcpy(reftext, "Annan text...");<br />
Textsträngen kan därför inte placeras i cdatasegmentet,<br />
i stället hamnar den i data-segmentet.<br />
oinitierade data<br />
Deklarationer som:<br />
int a;<br />
char array[34];<br />
osv, används för att deklarera icke initierade<br />
globala variabler. Eftersom variablerna inte har<br />
något definierat innehåll från start behöver<br />
kompilatorn bara hålla reda på var, i minnet dessa<br />
hamnar. Det behövs alltså ingen "bild". Oinitierade<br />
variabler placeras därför i ett särskilt segment. Av<br />
tradition kallas detta ”bss”, block started by<br />
symbol.<br />
Initial stackpekare<br />
Början för dynamisk<br />
minnesallokering<br />
Programmets startpunkt<br />
91