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.

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

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

Saved successfully!

Ooh no, something went wrong!