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.
UPPGIFT 138:<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. I<br />
denna uppgift skickas en vektor som parameter.<br />
Observera dock att inte hela vektorn ska placeras på<br />
stacken utan endast en pekare till vektorns första<br />
element (C-konvention).<br />
size = scalar( pvec , PVECSIZE );<br />
där följande deklaration har gjorts:<br />
#define PVECSIZE 32<br />
int pvec[PVECSIZE];<br />
int size;<br />
Kontrollera ditt svar genom att kompilera till<br />
<strong>assembler</strong>kod.<br />
parameter... refereras med offset...<br />
PVECSIZE<br />
pvec<br />
SLUT PÅ UPPGIFT 138.<br />
UPPGIFT 139:<br />
Översätt följande funktion till <strong>assembler</strong>kod.<br />
Register D används för returvärde.<br />
int max( int x , int y )<br />
{<br />
if( x >= y ) return x;<br />
return y;<br />
}<br />
Kontrollera ditt svar genom att kompilera till<br />
<strong>assembler</strong>kod.<br />
SLUT PÅ UPPGIFT 139.<br />
Vi har nu sett hur datatyperna int <strong>och</strong> pekare<br />
hanteras i register D då de skickas till <strong>och</strong> från<br />
funktioner.<br />
32-bitars aritmetik<br />
Arbetsbok för MC12<br />
Om vi vill utföra aritmetik på datatypen long<br />
(eller float) blir det annorlunda. För det första<br />
måste vi då använda två 16-bitars register för<br />
parametrar <strong>och</strong> returvärden, för det andra används<br />
färdiga funktioner för att utföra operationerna.<br />
Med XCC12 följer ett färdigt programbibliotek för<br />
32-bitars operationer. Biblioteket heter libcc (C-<br />
Compiler library). Källtexter till kompilatorbiblioteken<br />
libcc hittar du i<br />
{INSTALL}\src\libcc\common<br />
Låt oss illustrera användningen av funktioner i<br />
libcc med följande exempel:<br />
EXEMPEL<br />
Betrakta följande tilldelning:<br />
long la,lb,lc;<br />
main()<br />
{<br />
la = lb + lc;<br />
}<br />
För exemplet genererar XCC12 kod enligt följande:<br />
* 0008 |main()<br />
segment text<br />
define _main<br />
_main:<br />
* 0009 |{<br />
* 0010 | la = lb + lc;<br />
ldd 2+_lc<br />
ldx _lc<br />
pshd<br />
pshx<br />
ldd 2+_lb<br />
ldx _lb<br />
pshd<br />
pshx<br />
jsr add32<br />
leas 8,sp<br />
std 2+_la<br />
stx _la<br />
* 0011 |}<br />
rts<br />
Observera hur registerparet X/D används för att<br />
placera parametrarna på stacken. Notera att<br />
funktionen add32 definierats utan '_'konventionen.<br />
Detta görs för att minska risken för<br />
namnkonflikt med användardefinierade funktioner.<br />
Efter add32 finns resultatet av additionen i<br />
registerparet X/D.<br />
Motsvarande hantering gäller för flyttal.Du kan läsa<br />
mer om libcc i XCC's hjälpsystem (Libraries |<br />
Compiler Libraries).<br />
Komplexa typer som parametrar <strong>och</strong><br />
returvärden<br />
En hel 'struct' returneras genom att den kopieras<br />
till en temporär lagringsplats på anroparens stack.<br />
För funktioner som returnerar komplexa datatyper<br />
99