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