|
Navigation: Compiler > Assembler > Datenzugriff |
![]() ![]()
|
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