avrasm2: LWRD-Funktion gibt nur 1 Byte zurück?

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 05 10 2024  07:18:21      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
avrasm2: LWRD-Funktion gibt nur 1 Byte zurück?

    







BID = 606421

Lupin III.

Schriftsteller

Beiträge: 616
Wohnort: Salzburg
 

  


Ich möchte grade eine Sprung-Adressen-Tabelle in einem Programm erstellen.

Das habe ich mir so vorgestellt:
.db PATTERN1,LWRD(jump_adr1),\
PATTERN2,LWRD(jump_adr2)

LWRD sollte bits 0-15 zurückgeben, wenn man der Beschriebung glaubt. Das tut es auch, aber nur wenn man es in einem ".dw" Bereich verwendet. ".dw" will ich aber nicht verwenden, weil ich auch noch einzelne Bytes im selben Block habe (oben die "PATTERNx"s), und die würden dann mit 0x00 auf ein Word aufgefüllt.

Der einzige Weg herum scheint "HIGH(jump_adr1),LOW(jump_adr1)" zu schreiben. Dann steht das im Speicher, was ich will. Das ist aber nicht so übersichtlich, und etwas immer doppelt einzutippen (oder ändern zu müssen) ist auch lästig und fehleranfälliger.

Gibt's einen Trick, das nicht machen zu müssen?

BID = 606430

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

 

  

Und du bist dir sicher, dass das _so_ sein soll? Das erste Byte eines Words würde nicht immer eine grade Adresse haben. Die Frage ist dann, ob der AVR da überhaupt hinspringen kann. Sollte sich das herausstellen wäre die Lösung eben doch ein Paddingbyte, also ein Auffüllbyte.

Soweit ich weiß kann dieser Assembler auch so eine Art C-Präprozessor verarbeiten, packs also in ein Makro, welches dann zu deinen Vorstellungen expandiert.



_________________

BID = 606435

Lupin III.

Schriftsteller

Beiträge: 616
Wohnort: Salzburg

An die Stellen muss er nicht springen, da es sich nicht um einen Programm-Sprung handelt. Es ist zwar ein Bereich im Programm-Speicher, der eigentlich Wort-weise organisiert ist, es werden aber nur die Daten an der Stelle über Z-Register und "lpm" geladen, wobei dann Byte-weise zugegriffen werden kann. Die gelesenen Werte (zwei Bytes) geben die tatsächliche Sprungadresse an, an die gesprungen werden soll (über Z-Register und "icall"). Insgesamt ist das Ding einfach eine statische Tabelle, wo für bestimmte Taster-Kombinationen (in einem Byte kodiert), Sprungadressen hinterlegt sind. Das System funktioniert ja, wenn ich "HIGH(jump_adr1),LOW(jump_adr1)" schreibe. Es ist also einfach eine Frage der Übersichtlichkeit und Wartbarkeit, wenn ich stattdessen "LWRD(jump_adr1)" schreiben könnte (an der Tabelle, von denen es sogar mehrere je nach internem Programm-Zustand gibt, muss ich noch einige Male herumschrauben, während das Programm wächst). Die Labels sind der Aussagekraft wegen außerdem nicht so kurz wie hier im Beispiel, was das ganze nochmal aufbläht.

Makros habe ich an der Stelle nicht zum Laufen gebracht. Die verwirren den Compiler.

BID = 606442

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Gut, dann wäre zumindest das geklärt. Es ist also keine Sprungtabelle im eigentlichen Sinne, aber irgendwie dann doch .

sowas hier klappt nicht?

#define PG_ADDR (x) HIGH(x),LOW(x)

Ich kanns leider nicht ausprobieren, da ich den Assembler nicht habe. Ein Compiler macht was anderes.


Edit:
Kannst du nicht einfach so das Labelsymbol dort eintragen, z.B. mit label & 0xff und (label / 256) & 0xff? Oder meckert er dann?


_________________


[ Diese Nachricht wurde geändert von: DonComi am  6 Mai 2009 22:06 ]

[ Diese Nachricht wurde geändert von: DonComi am  6 Mai 2009 22:06 ]

BID = 606457

Lupin III.

Schriftsteller

Beiträge: 616
Wohnort: Salzburg

Ja, das machts (das #define)! Danke sehr! Ich bin beim Hilfe lesen wohl immer irgendwie an der Möglichkeit vorbei gerauscht. Und nachdem Makros an der Stelle nicht funktioniert haben, habe ich aufgegeben.


Offtopic :
Ein Assembler macht doch auch nur Maschinencode aus einem Menschen "lesbaren" Code. Ein Unterschied ist da nicht wirklich. Ein Assembler ist halt ziemlich hardware-nah (obwohl man ein mit C für einen AVR geschriebenes Programm auch nur schwer portieren kann)

BID = 606493

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Moin,

Ein Assemblierprogramm ("Assembler") erzeugt doch nur aus dem menschenlesbaren Assemblersprachen-Kode den (binären) Maschinenkode. Ein Compiler übersetzt (und macht noch viel mehr) den Hochsprachenkode in einen niedrigeren, z.B. in Assemblersprache. Danach läuft der Assembler über diesen Kode und erzeugt en Maschinenkode.

Man kann den GCC so aufrufen, dass der generierte Assemblersprachenkode in eine Datei geschrieben wird. Danach bricht er ab, ruft den as nicht mehr auf. Erst dieser würde den Binärkode erstellen.

Das ist immer so ein Problem: Der Begriff "Assembler" meint dieses Programm, während es oft synonym für "Assemblersprache" oder "-dialekt" gebraucht wird.

Edit:
P.S.: Ich will hier auf keinen Fall klugscheißern. Es mag viele Compiler geben, die ihren Assembler selbst haben. (denn der kommt schließlich vor dem Linker).


Zitat :
Ein Assembler macht doch auch nur Maschinencode aus einem Menschen "lesbaren" Code. Ein Unterschied ist da nicht wirklich. Ein Assembler ist halt ziemlich hardware-nah (obwohl man ein mit C für einen AVR geschriebenes Programm auch nur schwer portieren kann)

Naja, wie oben angeklungen, ist der Unterschied zu einem Compiler enorm groß. Es gibt zwar Assembler, die etwas mehr machen als nur binär zu kodieren, aber der Compiler ist auf jeden Fall "intelligenter" als ein einfacher Assembler.
Das heißt nicht, dass dieser wenig komplex ist. Der in deinem Fall kann ja sogar C-Präprozessor-Anweisungen verarbeiten. Es wird einem also schon was abgenommen, z.B. eben das Expandieren von Makros und z.T. auch die Verwaltung des Speichers (rudimentär).



Freut mich aber, dass es geklappt hat!

_________________


[ Diese Nachricht wurde geändert von: DonComi am  7 Mai 2009  3:22 ]

BID = 606494

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
Das heißt nicht, dass dieser wenig komplex ist.
Ich habe sogar mal auf einem x86 Macroassembler (aber nicht dem von BG) zwei Crossassembler geschrieben.
War eigentlich ganz leicht.

BID = 606495

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Moin perl,

Wieviele Zeilen waren die lang (nur Programmcode?)
Und für welche Zielarchitektur hat dein Assembler Code erzeugt?

Ich habe mal direkt in Assembler (-sprache ) einen Disassembler geschrieben. Allerdings nicht für x86 sondern für eine einfachere Architektur (AVR). Trotz kurzen Sicherungsintervalle meiner Entwicklungspartition ist der mir flöten gegangen
Sowas ist sehr ärgerlich...

_________________

BID = 606496

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Ach je, das ist wohl schon gut 25 Jahre her.
Ein paar Seiten werden es schon gewesen sein, aber praktisch nur Macros.
Ich hab das damals zuerst nur als Fingerübung für den SC/MP gemacht und kurz darauf produktionsmäßig für 8748 &Co.
Einen einfachen Assembler zu schreiben ist nicht schwer. Ein Kollege hat das damals sogar rein mit einer Macrofähigen Textverarbeitung (BG wusste da noch garnicht was das ist), für den 8085 gemacht.
Das waren sehr fortschrittliche Systeme, die wir damals den Schreibbüros der Behörden hier verkauft haben. Ausser WYSIWIG konnten die 1980 praktisch schon alles was MS-Word erst mehr als 10 Jahre später annähernd schaffte.
Ursprünglich stand Burroughs auf den Rechnern und IBM wurde mit "Imitated Burroughs Machines" übersetzt.


BID = 606543

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Nicht schlecht!
Konnte man mit dieser Textverarbeitung denn binäre Daten verarbeiten? Bevor jemand lacht, ich meine damit, mehr als nur reine Text-Dateien verarbeiten?
Irgendwie musste er ja den lauffähigen Kode zusammenbekommen.

_________________

BID = 606558

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Auch das geht, wenn man weiss wie man den Debugger aus der Textverarbeitung aufruft.
Haben wir auch gemacht, aber das war dann kein Crossassembler.
Die späteren Versionen der Textverarbeitung (auf x86 Rechnern laufend), konnte man auch regulär in einen Hex-Editor-Modus umschalten um die eigenen Files zu verhunzen.
Ausserdem war das Betriebsysstem in der Lage Textdokumente zu erkennen und hat routinemäßig fremde Programme, die mit den Formatangaben etc. nichts anfangen können, die Files ohne diese lesen lassen. Die bekamen dann also nacktes ASCII präsentiert.
Wenn man den Rucksack mit den Formatangaben auch haben wollte, musste man eine spezielle Open-Mode wählen.

Wenn man für einen anderen Prozessor Code erzeugt, braucht man ja eh noch externe Hardware, z.B. um die EPROMs zu brennen. Dann kann man auch ASCII-Daten transportieren. Die JEDEC-Files, die viele Entwicklungspakete erzeugen, sind ja nichts anderes.



BID = 606560

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Äh, klar.
Ich habe mal wieder zu komplex gedacht, nicht umsonst gibts reine ASCII-Verfahren, binäre Daten zu repräsentieren... Meine Güte, und ich komm nicht drauf, dabei arbeite ich täglich mit ihex (Intel Hex Format) ...

Ist aber auf jeden Fall interessant, was ihr da gemacht habt!

_________________


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag       heute wurden bisher 6 Beiträge verfasst
© x sparkkelsputz        Besucher : 182126982   Heute : 785    Gestern : 5499    Online : 449        5.10.2024    7:18
1 Besucher in den letzten 60 Sekunden        alle 60.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.109872102737