-
        
+ Antworten
Ergebnis 1 bis 5 von 5

Thema: Variablen in Bascom an Assembler und zurück übergeben ?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282

    Variablen in Bascom an Assembler und zurück übergeben ?

    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 ?

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    Versuchs mal mit folgendem Weg:
    Code:
    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.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    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 ?

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    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

  5. #5
    Gast
    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 !

+ Antworten

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •