Navigation:  Compiler > Assembler >

Datenzugriff

Vorherige SeiteZurück zur Kapitel ÜbersichtNächste Seite

 

Globale Variablen

 

Im Bytecode Interpreter liegen in den Registern 8 und 9 ein 16-Bit Zeiger auf das Ende des Speicherbereichs der globalen Variablen. Möchte man auf eine globale Variable zugreifen, die in der ".def" Datei definiert wurde, so erhält man die Adresse der Variablen, wenn man die Position der Variablen von R8,R9 abzieht. Dies sieht dann so aus:

 

 

    ; global variable access example

    ; write 0042 to global variable glob1

    MOVW R26,R8          ; get Ram Top from register 8,9

    SUBI R26,LOW(glob1)  ; subtract index from glob1 to get address

    SBCI R27,HIGH(glob1)

 

Liegt dann die Adresse der globalen Variable im X Registerpaar  (R26,R27), dann kann man den gewünschten Wert (in unserem Beispiel 42) dort hineinschreiben:

 

    LDI  R30,LOW(42)

    ST   X+,R30

    CLR  R30             ; the high byte of 42 is zero

    ST   X,R30

 

 

 

Parameterübergabe

 

Parameter werden auf dem Stack des Bytecode Interpreters übergeben. Der Stackpointer (SP) sitzt im Registerpaar R10,R11. Werden Parameter übergeben, so werden sie der Reihe nach auf den Stack geschrieben. Da der Stack nach unten wächst, sieht in unserem Beispiel (integer a, floating point b, byte c) das Speicherlayout folgendermaßen aus:

 

SP+5: a  (typ integer, länge 2)

SP+1: b  (typ float, länge 4)

SP+0: c  (typ byte, länge 1)

 

 

Möchte man nun a und c addieren, so findet man a bei SP+5, und c bei SP. Im folgenden Assembler Code wird der SP (R10,R11) in das Registerpaar Y (R28,R29) kopiert, und dann indirekt über Y die beiden Parameter a und c geladen.

 

    ; example for accessing and returning parameter

    ; we have int proc2(int a, float b, byte c);

    MOVW R28, R10 ; move parameter stack pointer into Y

    LDD R26, Y+5  ; load parameter "a" into X (R26)

    LDD R27, Y+6

 

    LDD R30, Y+0  ; load byte parameter "c" into Z (R30)

    CLR R31       ; hi byte zero because parameter is byte

 

Man hat jetzt die beiden Parameter a und c in den Registerpaaren X und Z. Nun kann man die Zahlen addieren.

 

    ADD R26, R30  ; add Z to X

    ADC R27, R31

 

 

 

Rückgabe von Werten

 

In der Routine proc2 wird auch die Summe zurückgegeben. Rückgabewerte werden auf den Parameter Stack (PSP) des Bytecode Interpreter geschrieben. Der Zeiger auf den PSP liegt im Registerpaar R6,R7. Man muß vorher allerdings eine 4 auf den PSP Zeiger addieren, dann kann man den Wert dort speichern. Im Gegensatz zur Parameterübergabe spielt der Typ des Rückgabeparameters keine Rolle. Auf dem Parameterstack sind alle Parameter immer 4 Bytes lang.

 

 

    ; return a + c

      MOVW R30, R6      ; copy stack pointer from R6

      ADIW R30, 4       ; add 4 to sp  - ADIW only works for R24 and greater

      MOVW R6, R30      ; copy back to stack pointer location

 

      ST   Z+, R26      ; store X on stack

      ST   Z, R27