Forum: Mikrocontroller und Digitale Elektronik Assemblerproblem/nachfrage


von Linuxdxs (Gast)


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
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Gib ein Origin an:
.org

von Karl H. (kbuchegg)


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.
1
menu1:
2
     .db   low( hauptm )
3
     .db   high( hauptm )

geht nicht? Das wär das erste was ich probieren würde.
1
menu1:
2
     .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.

von Linuxdxs (Gast)


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

von Florian L. (muut) Benutzerseite


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.

von Karl H. (kbuchegg)


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?
1
haupt_menu_text:
2
     .db     "Hauptmenue", 0
3
clock_menu_text:
4
     .db     "Uhr stellen", 0
5
temp_menu_text:
6
     .db     "Temp einstellen", 0
7
8
main_menu:
9
     .dw   haupt_menu_text
10
     .dw   clock_menu_text
11
     .dw   temp_menu_text
12
     .dw   0

So sollte das doch gehen.

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

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

Der Aufruf sieht dann z.B. so aus:
1
 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:
1
menutab:
2
.dw mt0,mt1,mt2,mt3,mt4,mt5,mt6
3
4
mt0:    .db 4,0
5
mt1:    .db 4,"Max. Temperatur",13,5,39,"C",0,0
6
mt2:    .db 4,"Hysterese",13,5,39,"C",0,0
7
mt3:    .db 4,"Ausschalt-Zeit",13,6," mmm:ss",0,0
8
mt4:    .db 4,"Alarmton-Start",13,5,0
9
mt5:    .db 4,"Alarmton-Sweep",13,5,0
10
mt6:    .db 4," (c) 03/2007 by",13,"www.hanneslux.de",0

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

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

...

von linuxdxs (Gast)


Lesenswert?

Super, Ihr habt mir super schnell weitergeholfen, vielen Dank nochmal!

von Hannes L. (hannes)


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):
1
;  lcd_data             ;Übergibt das Byte (ASCII-Zeichen) im Register "tmp" 
2
                        ;zur Textausgabe. Dabei sind folgende Steuerzeichen
3
                        ;möglich:
4
                        ;1:  Blinken ausschalten
5
                        ;2:  akt. Ausgabe-Position als Blinkanfang setzen
6
                        ;3:  akt. Ausgabe-Position als Blinkende setzen
7
                        ;4:  Bildschirm löschen
8
                        ;8:  Cursor home (ohne Löschen)
9
                        ;13: CR, Zeilenwechsel, Rest der Zeile wird gelöscht

...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.