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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Arbetsbok för MC12<br />

XCC12 genererar följande kod:<br />

...<br />

* 0007 |callfunc( aa , ab )<br />

segment text<br />

define _callfunc<br />

_callfunc:<br />

pshy<br />

tfr sp,y<br />

* 0008 |{<br />

* 0009 | aa = 1;<br />

movw #1,4,y<br />

* 0010 | ab = 2;<br />

movw #2,6,y<br />

* 0011 |}<br />

puly<br />

rts<br />

Observera hur parametrarna refereras via Y med<br />

positiv offset.<br />

98<br />

4<br />

6<br />

gamla Y msb<br />

gamla Y lsb<br />

PC msb<br />

PC lsb<br />

ab msb<br />

ab lsb<br />

aa msb<br />

aa lsb<br />

Y <strong>och</strong> SP<br />

minskande<br />

adress<br />

Returvärden från funktioner<br />

För funktioner som returnerar ett värde gäller<br />

vanligtvis att detta värde alltid finns i register D<br />

efter funktionsanropet. Undantaget är följande fall:<br />

• Funktion returnerar long, returvärdet finns i<br />

registerparet X/D med msw i X <strong>och</strong> lsw i D.<br />

• Funktion returnerar float, double eller<br />

long double, alla typerna behandlas som<br />

float i XCC12, returvärdet finns i registerparet<br />

X/D med msw i X <strong>och</strong> lsw i D.<br />

• Funktion returnerar struct, utrymme för<br />

returvärde allokeras av anropande funktion.<br />

UPPGIFT 135:<br />

Översätt följande funktionsanrop till <strong>assembler</strong>kod.<br />

do_nothing();<br />

där följande deklaration har gjorts:<br />

void do_nothing(void);<br />

Kontrollera ditt svar genom att kompilera till<br />

<strong>assembler</strong>kod.<br />

SLUT PÅ UPPGIFT 135.<br />

UPPGIFT 136:<br />

Översätt följande funktionsanrop till <strong>assembler</strong>kod.<br />

Register D används för returvärde.<br />

result = do_something();<br />

där följande deklarationer har gjorts:<br />

int do_something(void);<br />

int result;<br />

Kontrollera ditt svar genom att kompilera till<br />

<strong>assembler</strong>kod.<br />

SLUT PÅ UPPGIFT 136.<br />

UPPGIFT 137:<br />

Översätt följande funktionsanrop till <strong>assembler</strong>kod.<br />

Ange också hur parametrar refereras i den anropade<br />

funktionen. Register D används för returvärde.<br />

result = max(low,high);<br />

där följande deklaration har gjorts:<br />

int result,low,high;<br />

int max( int , int );<br />

Kontrollera ditt svar genom att kompilera till<br />

<strong>assembler</strong>kod.<br />

parameter... refereras med<br />

offset...<br />

low<br />

high<br />

SLUT PÅ UPPGIFT 137.

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

Saved successfully!

Ooh no, something went wrong!