-         
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: assembler

  1. #1
    gast
    Gast

    assembler

    vielleicht kann mir wer erklären, was das prog hier machen soll:

    Code:
    define wert  byte[1]
    define adr   word[2]
    define b2    byte[2]
    define w3    word[3]
    define w4    word[4]
    
    
    gosub LOAD_GETBYTE
    
    define GETBYTE &HA2
    
    for adr=0 to &H1FFF
      sys GETBYTE
      PRINT adr,":" wert
    next
    
    end
    
    
    #LOAD_GETBYTE
      b2=&HC6
      w3=&HB7A1
      w4=&H8100
    return

    das zugehörige assembler-prog schaut so aus:

    Code:
    LDA	$4711
    STA	$A1
    RTS
    danke schonmal im voraus

  2. #2
    Gast
    wär hilfreich, wenns mir schnell wer sagen könnte

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.01.2004
    Ort
    München
    Alter
    66
    Beiträge
    214
    Das CCBASIC Programm liest alle Bytes ab Adresse 0 bis Adresse &H1FFF und zeigt sie über RS232 an.
    Das Assembler-Programm brauchst Du dazu nicht.

  4. #4
    Gast
    könntest dus mir ein bisl genauer erklären, ich verstehs noch net ganz..

    also zuerst die variablendef. is klar, dann wir den 3 werten etwas zugewiesen (wozu genau?), die zeile is mir unklar:

    define GETBYTE &HA2

    und wie kommt dann was in wert rein?

    getbyte muss ja auch als assemblerroutine eingebunden werden..

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.01.2004
    Ort
    München
    Alter
    66
    Beiträge
    214
    Also: der Trick ist die Speicherbelegung bei CCBASIC:
    byte[1] liegt auf Adresse &HA1, byte[2] auf &HA2 usw.

    Im Unterprogramm #LOAD_GETBYTE werden diese Variablen mit einem (noch unvollständigen) Assemblerprogramm belegt:
    byte[2] = &HA2 = &HC6 -- der opcode des Befehls LDA
    word[2] = HhA3/4 ist noch nicht berschreiben; aber da liegt ja "adr", und das kriegt nachher in der FOR-Schleife die Werte &H000 bis &H1FFF -- das ist dann die Adresse für den LDA - Befehl
    word[3] = &HA5/6 = &HB7A1 -- der Befehl STA $A1: speichert das Resultat nach &HA1 = byte[1] = "wert".
    word[4] = &HA7/8 = &H8100 -- 81 ist der Befehlt RTS; die 00 wird nicht mehr durchlaufen.

    In der FOR-Schleife wird mit der Änderung von "adr" also die Adresse des LDA - Befehls des Assemblerprogramms gesetzt.

    SYS GETBYTE ruft das Assemblerprogramm auf (GETBYTE ist ja &HA2);
    der LDA - Befehl liest jetzt das Byte an Adresse "adr", der STA - Befehl speichert's nach $A1 = "wert", und das Assembler-Programm kehrt mit RTS zurück.

    Jetzt kann "wert" (liegt ja auf Adresse &HA1 !) mit PRINT ausgegeben werden.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.01.2004
    Ort
    München
    Alter
    66
    Beiträge
    214
    Ach so:
    "getbyte muss ja auch als assemblerroutine eingebunden werden":

    In diesem Fall wird die Assembler-Routine nicht per SYSCODE eingebunden, sondern wird mit den BASIC Wertzuweisungen selbst "gesetzt".
    Ist nicht schön (zu Lesen, für uns Menschen), macht aber für den Rechner keinen Unterschied, woher die Bytes kamen...

  7. #7
    Gast
    jap aber das assemblerprogramm, das man schreibt, entspricht ja dem von ganz oben .. und da versteh ich net, wieso das immer in der schleife aufgerufen wird, was macht es und wie kommt dann der bytewert in "wert".

    wozu is &HA2

  8. #8
    Gast
    sorry, hab net die obige message übersehen

  9. #9
    Gast
    wie weiß der prozessor, dass lda danach 2 byte für das argument verwendet .. man kann lda auch nur ein byte übergeben

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.01.2004
    Ort
    München
    Alter
    66
    Beiträge
    214
    LDA: das stimmt; das ist generell so bei dieser CPU: die Befehle können unterschiedliche Adressierungs-Arten haben. Damit die CPU das erkennen kann, haben sie auch unterschiedliche Op-Codes:

    LDA = Load Accumulator from Memory:
    Code:
    Source        Addressing       
    Forms         Modes          OpCode Operands
    LDA (opr)     IMM            A6         ii
    LDA (opr)     DIR            B6         dd
    LDA (opr)     EXT            C6         hh ll
    LDA ,X        IX             F6
    LDA (opr),X   IX1            E6         ff
    LDA (opr),X   IX2            D6         ee ff
    Hier ist es der LDA mit dem OpCode "C6" -- also "Extended Addressing", es folgt noch die Adresse, bestehend aus high byte und low byte.

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

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