-         
+ Antworten
Ergebnis 1 bis 4 von 4

Thema: ASM Direktiven -> Ein paar Fragen

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    28
    Beiträge
    2.624

    ASM Direktiven -> Ein paar Fragen

    Hi! :o)
    Ich stoße öfters auf ein paar mir unbekannte Direktiven, kann mir jemand ihre Aufgaben erklären?

    Danke! :o)

    .BYTE
    .CSEG
    .DSEG
    .ESEG
    .DB
    .DW
    .ORG
    .SET

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    29
    Beiträge
    674
    Ich hab im Moment ein Buch über AVRs ausgeliehen, da steht über die ganzen Direktiven eine Erläuterung und die Syntax drin. Ich hab die Erläuterungen für die gewünschten Direktiven mal abgetippt, falls du noch weitere oder auch die Syntax haben willst, kann ich das gern machen.

    .BYTE
    Reserviert ein Byte für eine Variable oder mehrere Bytes für eine Tabelle.

    .CSEG
    Markiert den Beginn eines Code-Segments. In einem Code-Segment steht das Programm oder man kann Werte in den Programmspeicher schreiben(vgl. .DSEG).

    .DSEG
    Markiert den Beginn eines Datensegments. In einem Datensegment stehen üblicherweise Byte-Direktiven und Labels.

    .ESEG
    Markiert den Beginn eines EEPROM-Segments. Im Gegensatz zum Datensegment darf im EEPROM-Segment keine BYTE-Direktive stehen.

    .DB
    Definiert ein konstantes Byte oder mehrere konstante Bytes im Programmspeicher oder EEPROM, je nachdem ob diese Direktive im Code- oder EEPROM-Segment steht.

    .DW
    Definiert ein konstantes 16-Bit Wort oder mehrere konstante 16-Bit Worte im Programmspeicher oder EEPROM, je nachdem ob diese Direktive im Code- oder EEPROM-Segment steht.

    .ORG
    Setzt den Anfang eines Code-, Daten- oder EEPROM-Segments auf einen neuen Wert.

    .SET
    Weist einem Symbol einen Wert zu. Das Symbol kann später umdefiniert werden.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    28
    Beiträge
    2.624
    Hi Pascal!
    Das Buch habe ich auch! ;o)
    Wie funktionieren nur die ganzen Direktiven?
    Bei .DW und .DB stand im Internet irgendwas von LPM, was ist das und wie funktioniert das?
    Was hat .CSEG/.DSEG/.ESEG mit .DB/.DW zu tun?
    Was machen .BYTE/.SET/.ORG genau?
    Mit .ORG kann man ja den FLASH-Pointer auf eine bestimmte Adresse setzen, oder?
    Wenn man ...
    Code:
    .org 0x0005
    label1:
      ...
    
    .org 0x0007
    label2:
      ...
    ..., dann bleibt da ja eine Lücke zwischen den Plätzen im Flash, oder? Ist das schlimm?
    Könnte man jetzt einfach in diese Lücke so eine Zahlentabelle einfügen, Beispiel:
    Code:
    .org 0x0005
    label1:
      ...
    
    .org 0x0006
    tabelle:
      .dw "Ein Beispiel-Text."
    
    .org 0x0007
    label2:
      ...
    Reicht die Lücke von .org 0x0006 bis 0x0007, oder muss die Lücke größer sein?

    Danke nochmal für Deine Hilfe! :o)

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    07.07.2004
    Beiträge
    95
    In deinem Beispiel nutzt Du den Speicherplatz x0005 gar nicht. (Ein Lable wird nicht in Maschienensprache übersetzt)

    Zwischen x0006 und x0007 hast Du im Programmspeicher 16Bit Platz (Korrigiert mich, es ist bei mir schonwieder lage her) Dein Beispiel Text ist deutlich länger. Kann mich auch nicht erinnern, dass der Assembler, den ich verwendet habe überhaupt Zeichen in Bytecode umgesetzt hat, deshalb habe ich mir auch ein kleines Delphiprogramm geschrieben, das die ASCII Wandelung vorweg vornahm.
    P.S.: Huubs geht doch:

    .db "Hello\n" // is equivalent to:
    .db 'H', 'e', 'l', 'l', 'o', '\\', 'n'
    To create the equivalent to the C-string "Hello, world\n", do as follows:
    .db "Hello, world", '\n', 0
    Es fehlt eine Deklaration, ob Dein geschriebener Code im Programmspeicher oder im EEPROM stehen soll.

    Sinnvoll wäre:
    Code:
    .CSEG
    .
    .
    .
    rjmp nach_dem_datensegment
    
    .DSEG
    
    tabelle:
      .dw 128, 1078, 4, ....
    
    .CSEG
    
    nach_dem_datensegment:
    
    .
    .
    .
    
    .ESEG
    tabelle2:
      .dw 128, 1078, 4, ....
    Hier hast Du jetzt die gleiche Tabelle zweimal, eineml zwischen dem Code, und einmal im EEPROM.
    die Festlegung mit .ORG ist (meine ich) nicht erforderlich. Ich habe diese nur am Anfang verwendet, um die Interrupt Vektoren zu treffen. (vielleicht etwas übertriben, aber die Interruptvectoren sind die Einzigen Speicheradressen, die wirklich stimmen müssen.
    Ob sich Dein Programm jetzt leicht verschiebt oder nicht ist eigentlich egal, hauptsache ist, Du kannst mit dem Lable "tabelle" die Daten im Datensegment addressieren, und dieses steht dicht genug an Stelle, an der Du die Tabelle auslesen möchtest.

    Es gab da bei Atmel mal ne ordentliche Anleitung... Developer Tools User Guide oder so... Kanns grad nicht finden, schau mal ob ichs noch hab

+ Antworten

Berechtigungen

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