Hallo,

ich glaube hier gibt es ein Missverständnis.

Man kann nicht beliebig viele (Stackgröße!) aber doch einige Variablen übergeben.

Mit
LoadAdr VariablenName, Z oder
LoadAdr VariablenName, X
wird der Pointer zu der Variablen in die Pointer-Register Z oder X geladen.
Y kann nicht benutzt werden, da hier Bascom die Informationen über die Pointer in Subs oder Funktionen speichert.

Der Vorgang:

LoadAdr Variable1, Z
ld r24, Z

kann beliebig für andere Variablen wiederholt werden, dabei natürlich ein anderes Register (als r24) benutzen, da sonst die Information überschrieben wird.

Obiges Beispiel ist für eine Variable mit einem Byte. Für eine Word-Variable schaut das ganze so aus:

LoadAdr Variable2, X
ld r24, X+
ld r25, X

oder auch
Loadadr Variable2, Z
ld r24, Z
ld r25, Z+1

wenn man den Variablenpointer nicht verändern will, weil man ihn später noch braucht. Die Variante mit Z+ 'Offset' ist nur mit Z möglich. Der X-Pointer bietet diese Möglichkeit nicht.

Loadadr ist eine Hilfsfunktion von Bascom um mit BASCOM-Variablen im ASM-Code zu arbeiten.
Sofern es sich um globale Variable handelt, macht Bascom daraus beim kompilieren zwei LDI Befehle wie

ld zl, lowByte(VariablenAdresse)
ld zh, highByte(VariablenAdresse)

Wenn in einem Sub oder Function die Variablen übergebene Parameter oder Locale Variablen sind, ist die Adresse auf dem sogenannten Soft-Stack gespeichert (Y-Pointer). Die Umsetzung des Befehls Loadadr von Bascom während des kompilierens könnte dann zum Beispiel so aussehen:

ld zl, Y+2
ld zh, Y+3

Wenn man einen Funktionswert zurückgeben will verwendet man z.B.:

LoadAdr FunktionsName, Z
st Z, r24

Bei Funktionsname ist natürlich der entsprechende Name der Funktion einzusetzen, sowie der Registername zu verwenden, in welchem der Rückgabewert steht.

Ich hoffe, das konnte Dir ein wenig weiterhelfen.

Josef