C Control PRO Unit Mega 128 198219 用户手册

产品代码
198219
下载
页码 429
220
Compiler
© 2013 Conrad Electronic
    
; 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 ge-
wü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  bei SP.  Im folgenden Assemb-
ler Code wird der SP  (R10,R11) in das  Registerpaar Z (R30,R31) kopiert,  und  dann  indirekt  über  Z
die beiden Parameter a und c geladen.
    
; example for accessing and returning parameter
    
; we have int proc2(int a, float b, byte c);
    MOVW R30, R10 
; move parameter stack pointer into Z
    LDD R24, Z+
5
  
; load parameter "a" into R24,25
    LDD R25, Z+
6
    LDD R26, Z+
0
  
; load byte parameter "c" into X (R26)
    CLR R27       
; hi byte zero because parameter is byte
Man hat  jetzt  die beiden Parameter a und  in den Registerpaaren X und R24,R25.  Nun kann  man
die Zahlen addieren.
    ADD R24, R26  
; add X to R24, R25
    ADC R25, R27