mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assemblerproblem/nachfrage


Autor: Linuxdxs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe da ein kleine Wissenslücke. Ich will mit dem Assembler 
folgendes machen. Ich habe gewisse sachen die ich im Display augeben 
möchte, z.B. die Buchstabenfolge "Hauptmenue" habe ich jetzt 
folgendermaßen im Assembler angelegt:

hauptm:
db. "Hauptmenue";00

Wie kann ich dem Assembler beibringen, daß er die Anfangsadresse, die ja 
der Assembler selber vergibt, in zwei Speicherzellen meiner Wahl, im 
Programmspeicher, ablegt.

: Verschoben durch Admin
Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gib ein Origin an:
.org

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Linuxdxs schrieb:

> hauptm:
> db. "Hauptmenue";00
>
> Wie kann ich dem Assembler beibringen, daß er die Anfangsadresse, die ja
> der Assembler selber vergibt, in zwei Speicherzellen meiner Wahl, im
> Programmspeicher, ablegt.
menu1:
     .db   low( hauptm )
     .db   high( hauptm )

geht nicht? Das wär das erste was ich probieren würde.
menu1:
     .dw   hauptm
müsste auch gehen, allerdings weiß ich dann nicht in welcher Reihenfolge 
die Bytes abgelegt werden.

Aber im Grunde ist es ganz einfach: Auch wenn der Assembler eine 
konkrete Speicheradresse festlegt verknüpft er dann doch den Labelnamen 
mit dieser Adresse. Für dich als Programmierer ist dieser Labelname die 
Adresse im Speicher, an der etwas abgelegt ist. Überall dort, wo du eine 
Zahl benutzen kannst (in deinem Fall eine Adresse) kannst du klarerweise 
auch den Labelnamen nehmen. Er fungiert als Platzhalter für eine 
spezifische Adresse.

Autor: Linuxdxs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, schon klar. Ich möchte aber eine Tabelle generieren lassen, in der 
ich das erste Element anspringe und dann alle zwei Bytes eine Adresse 
habe, die dann nacheinander in die Z-Register eingedragen werden und 
dann auf die reele Anfangsadresse des Wortes zeigen.
z.B.:

    Adresse von Hauptmenu
         Adresse des Schriftzuges "Hauptmenue"
         Adresse des Schriftzuges "Uhr stellen"
         Adresse des Schriftzuges "Temp einstellen"
                                    .
                                    .
                                    .
                                    .

Autor: Florian Löffler (Firma: Studi) (muut) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich mach das bei kleinen Menüs so, dass ich z.B. für die 
Überschriften überall die selbe Länge habe, notfalls mit Leerzeichen 
aufgefüllt.

Dann alle hintereinander ins Flash, die Startadresse lässt sich dann aus 
Startadresse + gemeinsame Länge * Index
ansprechen.
Ist meist ganz praktisch, da man sich das Löschen des Displays spart.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Linuxdxs schrieb:
> Ja, schon klar. Ich möchte aber eine Tabelle generieren lassen, in der
> ich das erste Element anspringe und dann alle zwei Bytes eine Adresse
> habe, die dann nacheinander in die Z-Register eingedragen werden und
> dann auf die reele Anfangsadresse des Wortes zeigen.
> z.B.:
>
>     Adresse von Hauptmenu
>          Adresse des Schriftzuges "Hauptmenue"
>          Adresse des Schriftzuges "Uhr stellen"
>          Adresse des Schriftzuges "Temp einstellen"
>                                     .
>                                     .
>                                     .
>                                     .


Ja, und?
Was hindert dich jetzt daran?

haupt_menu_text:
     .db     "Hauptmenue", 0
clock_menu_text:
     .db     "Uhr stellen", 0
temp_menu_text:
     .db     "Temp einstellen", 0

main_menu:
     .dw   haupt_menu_text
     .dw   clock_menu_text
     .dw   temp_menu_text
     .dw   0

So sollte das doch gehen.

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Oder man schreibt sich gleich eine Routine, die indizierte Texte ausgibt 
(siehe Anhang).

Der Aufruf sieht dann z.B. so aus:
 printt menutab,mp          ;Menütext ausgeben
wobei mp ein Register ist, das die Nummer des aktuellen Menüpunktes 
enthält.

Die Tabelle mit den Texten sieht dann z.B. so aus:
menutab:
.dw mt0,mt1,mt2,mt3,mt4,mt5,mt6

mt0:    .db 4,0
mt1:    .db 4,"Max. Temperatur",13,5,39,"C",0,0
mt2:    .db 4,"Hysterese",13,5,39,"C",0,0
mt3:    .db 4,"Ausschalt-Zeit",13,6," mmm:ss",0,0
mt4:    .db 4,"Alarmton-Start",13,5,0
mt5:    .db 4,"Alarmton-Sweep",13,5,0
mt6:    .db 4," (c) 03/2007 by",13,"www.hanneslux.de",0

Ein weiteres Beispiel aus demselben Programm, Aufruf:
 clr wl                     ;Index auf Ausgabestring 'Aus' setzen
 sbic relport,relbit        ;Relais eingeschaltet? - nein...
 ldi wl,1                   ;ja, Index auf Ausgabestring 'Ein' ändern
 sbrc flags,timeout         ;Hat Timeout schon stattgefunden? - nein...
 ldi wl,2                   ;ja, Index auf String 'Timeout' ändern
 printt einaustab,wl        ;indizierten String ausgeben

Und die zugehörige Tabelle:
einaustab:
.dw txtaus,txtein,txtout
txtaus: .db "Aus",0
txtein: .db "Ein",0
txtout: .db "Timeout",0

...

Autor: linuxdxs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, Ihr habt mir super schnell weitergeholfen, vielen Dank nochmal!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum besseren Verständnis sei noch erwähnt, dass meine LCD-Routine 
"lcd_data" noch ein paar Formatierungszeichen erkennt und abarbeitet. 
Dies wären (Auszug aus Kommentar zur Routine):
;  lcd_data             ;Übergibt das Byte (ASCII-Zeichen) im Register "tmp" 
                        ;zur Textausgabe. Dabei sind folgende Steuerzeichen
                        ;möglich:
                        ;1:  Blinken ausschalten
                        ;2:  akt. Ausgabe-Position als Blinkanfang setzen
                        ;3:  akt. Ausgabe-Position als Blinkende setzen
                        ;4:  Bildschirm löschen
                        ;8:  Cursor home (ohne Löschen)
                        ;13: CR, Zeilenwechsel, Rest der Zeile wird gelöscht

...

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wichtige Regeln - erst lesen, dann posten!
    * Aussagekräftigen Betreff wählen
    * Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, 
...)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.