PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASM Direktiven -> Ein paar Fragen



Florian
25.08.2004, 14:36
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

Pascal
26.08.2004, 14:30
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.

Florian
26.08.2004, 17:39
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 ...

.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:

.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)

LoD
26.08.2004, 18:57
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:



.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