PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen in Bascom an Assembler und zurück übergeben ?



albundy
05.12.2004, 13:45
Ich muß Variablen in Bascon an eine Sub mit Assembler übergeben, bekomme es aber nicht hin.
Beispiel:

Dim Variable1 as Byte, Variable2 as Byte
Declare Sub Asm_prog(Wert1 as Byte, Wert2 as Byte)

Variable1=100 : Variable2=25
Call Asm_prog(Variable1,Variable2)
Print Variable1 ->sollte jetzt 125 sein

Sub Asm_prog(Wert1 as Byte,Wert2 as Byte)
$asm
.def Variable1 = r17 ->so würde ich es machen
.def Variable2 = r18 ->im reinen Assembler
add Variable1,Variable2
$end asm
end sub

Wie bekommt man das hin, dass bei Print "125" erscheint ?
8-[

oe9vfj
05.12.2004, 18:31
Versuchs mal mit folgendem Weg:


Sub Asm_prog(Wert1 as Byte,Wert2 as Byte)
Loadadr Wert2, Z ' Addresspointer von Wert2 in Z-Pointer
ld r18, Z ' Inhalt von Wert2 in R18 (Z-Pointer)
Loadadr Wert1, Z
ld r17, Z
add r17, r18
st Z, r17 ' addierten Wert ins SRAM zurückschreiben
End Sub


Im Help-File findest Du unter Loadadr einige Hinweise.

albundy
05.12.2004, 19:25
Hallo und Danke für die Antwort oe9vfj
Die Idee ist gut, hat aber leider die Einschränkung, dass man nur maximal 6 Byte übergeben kann. ( Pointerregister X,Y und Z ) Das mit den 2 Werten war ja nur ein Beispiel.
Gibt es noch eine andere Möglichkeit ?

oe9vfj
06.12.2004, 07:19
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

06.12.2004, 15:44
Hallo Josef,

>ich glaube hier gibt es ein Missverständnis.

Allerdings, ich habe anfangs nur unter "Loadadr" nachgesehen und dort steht sehr wenig. ( Die Hilfe in Bascom finde ich sowieso total daneben)

>Y kann nicht benutzt werden, da hier BASCOM die Informationen über die Pointer in Subs oder Funktionen speichert.

Unter "Loadadr" steht nur:
LOADADR var , reg / var A variable which address must be loaded into the register pair X, Y or Z
Habe eben noch ausführlich unter "Mixing ASM and BASIC" nachgelesen und verstehe jetzt deine Ausführungen.

>Ich hoffe, das konnte Dir ein wenig weiterhelfen.
Du hast mir sehr geholfen, vielen Dank !