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.

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

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

Saved successfully!

Ooh no, something went wrong!