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
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
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.
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 ...
..., dann bleibt da ja eine Lücke zwischen den Plätzen im Flash, oder? Ist das schlimm?Code:.org 0x0005 label1: ... .org 0x0007 label2: ...
Könnte man jetzt einfach in diese Lücke so eine Zahlentabelle einfügen, Beispiel:
Reicht die Lücke von .org 0x0006 bis 0x0007, oder muss die Lücke größer sein?Code:.org 0x0005 label1: ... .org 0x0006 tabelle: .dw "Ein Beispiel-Text." .org 0x0007 label2: ...
Danke nochmal für Deine Hilfe! :o)
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:
Es fehlt eine Deklaration, ob Dein geschriebener Code im Programmspeicher oder im EEPROM stehen soll..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
Sinnvoll wäre:
Hier hast Du jetzt die gleiche Tabelle zweimal, eineml zwischen dem Code, und einmal im EEPROM.Code:.CSEG . . . rjmp nach_dem_datensegment .DSEG tabelle: .dw 128, 1078, 4, .... .CSEG nach_dem_datensegment: . . . .ESEG tabelle2: .dw 128, 1078, 4, ....
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
Lesezeichen