Forum: Mikrocontroller und Digitale Elektronik Asammbler nicht richtig verstehe


von Lord_Gismo (Gast)


Lesenswert?

So also ich habe vor ganz kurzen angefangen mich dem assambler code zu 
beschäftigen auf grund dessen das ich in der arbeit nun mit Atmel 
Controllern arbeiten soll. So nun habe ich mir viel durch gelsen und 
versucht zu verstehn leider sind diese ganzen Asammbler Tutors für 
einsteiger sehr merkwürdig gestrinkt es wird nicht wirklich auf den 
einsteiger eingegangen und mit fremdbegriffen nur um sich geworfen. Nun 
ja nichts desto trotz habe ich angefangen mir die informationen nach und 
nach zusammen zu fassen und umzu schrieben nun bin ich aber an den Piont 
Registern hängen gelbliben da ich werder ihr arbeitsweise noch sonst 
irgendwie was dazu versthe. so nun meine Frage kennt einer von euch 
entwerder ein gutes Tutor wo mal wirklicdh was gut drinne beschrieben 
ist ohne das man wirklich schon arnung von der Materie hat oder kann mit 
zumindest einer von euch erklären was diese Point Register wie machen. 
????

Würde mich sehr über eine Antwort freuen

von foo (Gast)


Lesenswert?

Höre er auf mit dieser Gossensprache!

von Sebastian E. (der_andere_sebastian)


Lesenswert?

Bei mir scheitert es leider gerade am Verständnis, was denn eigentlich 
"Point Register" sind. Heißen die wirklich so, oder ist das ein 
Tippfehler?

von Lord_Gismo (Gast)


Lesenswert?

ne die sollen nach dem was ich hier vorliegen haben  wirklich Pointer 
Register sein die sollen irgendwas mit  Programmzeigern zu tun haben ich 
denke aber mal ich bin hier im falschen forum nur in dem für elektronik 
und µC habe ich kaum was über die eigentliche programirung gelesen von 
so einen AtMega 8

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es scheint mir um Assembler auf "Atmel-Controllern" zu gehen, das 
jedenfalls legt das eher wirre Geschreibsel des Threadstarters nahe.

-> Verschoben.

von Marvin M. (Gast)


Lesenswert?

@Lord Gismo:
Das Tutorial http://www.mikrocontroller.net/articles/AVR hast Du schon 
durchgearbeitet?
Falls es Verständnisprobleme gibt, dann frage einfach. Es ist immer 
schwierig, aus der Sicht eines "Wissenden" ein Tutorial für Anfänger zu 
schreiben. Durch Deine Fragen besteht evtl. die Möglichkeit, das 
Tutorial zu verbessern und für Anfänger verständlicher zu machen.
Ansonsten könnte Dir auch das Tutorial hier 
http://www.roboternetz.de/wissen/index.php/AVR_Assembler_Einf%C3%BChrung 
und 
http://www.roboternetz.de/wissen/index.php/AVR-Einstieg_leicht_gemacht 
weiterhelfen.

von Guido Körber (Gast)


Lesenswert?

Ein ganz wichtiger Tip: Beim Programmieren, egal mit welcher Sprache, 
ist es wichtig sehr präzise zu sein. Das fängt beim Umgang mit der 
natürlichen Sprache an. Ignoriert man da schon Syntax und Grammatik, 
dann wird es beim Programmieren wohl nur Frust geben.

"Point Register" ist ein Tippfehler, "Pointer Register" dagegen nicht.

von Peter D. (peda)


Lesenswert?

Man sollte sich vielleicht fragen, warum überhaupt ein anderer einen 
Blick auf solch ein Geschreibsel werfen sollte, wenn offensichtlich 
wird, daß ja nicht mal der Autor sein Geschreibsel eines nochmaligen 
Blickes für würdig erachtet und es mit tausenden Tippfehlern abschickt.

Selbst wer noch mit Modem surft, kann seine Frage in aller Ruhe offline 
formulieren und nochmal durchlesen.


Peter

von Chapmy (Gast)


Lesenswert?

Dass der OP evtl. nicht aus dem deutschsprachigen Raum stammt, ist euch 
wohl nicht in den Sinn gekommen, bevor ihr eure großkotzigen, dümmlichen 
Kommentare verfasst habt, oder?

von Klaus (Gast)


Lesenswert?

Man kann ziemlich genau erkennen, ob einer der Sprache nicht so recht 
mächtig ist, oder ob einer einfach nur schlampig schreibt.

Beispiel: 'Point Register'. Das is einfach nur Schlampig. Wenn das der 
einzige Fehler wäre, wärs ok, aber der ganze Text is nur so 
dahingerotzt.

von Meister E. (edson)


Lesenswert?

@Chapmy

>Asammbler

In welcher Sprache schreibt man das so?


Der Beitrag

>Autor: Guido Körber (Gast)
>Datum: 11.08.2008 11:15

hat es sehr schön auf den Punkt gebracht.


Gruss,
Edson

von Matthias L. (matze88)


Lesenswert?

Wenn es so wäre (ich muss sagen, das sieht für mich nicht nach einer 
Wissenslücke der deutschen Sprache sondern wirklich nach geschludere 
aus), kann man das dazu schreiben und sich dennoch Mühe geben, wichtige 
Punkte richtig zu schreiben und vor allem den Text etwas zu 
strukturieren. Pointer Register ist kein deutsches Wort, Assembler 
ebenfalls nicht. Warum also sollte das nicht funktionieren?

Dennoch: Ich habe gaaaanz grob verstanden, was der OP versucht uns zu 
sagen, finde es aber einfach unhöflich, zu erwarten, dass auf so 
geschriebene Beiträge geantwortet wird. Um nun nicht ganz sinnlos hier 
zu schreiben meine Hilfe dazu:

Pointer Register sind die obersten 6 Register des µCs. Eigentlich sind 
sie nichts besonderes, bieten aber eine zusätzliche Möglichkeit:
Sie werden jeweils in 2er Paaren als X Y und Z Register/Pointer 
bezeichnet. Sie können beschrieben werden, wie alle anderen 
high-register (r16-r31) auch, sind ja auch solche (Bsp: Z ist r30:r31).

Die Extrafunktion ist dabei, dass man sie sehr leicht zur Adressierung 
des Srams benutzen kann.
Normalerweise kannst du einzelne Werte aus dem SRam ins register lesen:
lds r16, 0x100 (sram adresse), lädt den Wert aus der Sram Zelle 0x100 
ins register R16.

Hast du nun größere Strukturen im SRam, kann man das ganze vereinfachen:
ldi ZH, HIGH(0x100) (->1)
ldi ZL, LOW(0x100) (->0)

wait_loop:
sbic (test ob uart byte gesendet/puffer leer, weiß grad nicht welches 
ioreg/bit)
rjmp wait_loop    ; loop bis uart wieder bereit
ld r16, Z+        ; sram byte in r16 kopieren und Z pointer um 1 erhöhen
out UDR, r16      ; byte aus r16 ans uart ausgeben
cpi ZL, 0xFF      ; gucken, ob wir fertig sind
brne wait_loop    ; falls nicht -> nächstes byte


Dieses Programm sendet nun 255 Bytes ab der SRam adresse 100 durchs 
uart. Ohne pointer-adressierung wäre das nicht so leicht möglich.

Ich erinnere mich übrigens an mein erstes Programm: Eine sehr simple 
Lüftersteuerung, steuerbar übers Uart. Ich war damals noch relativ jung, 
vielleicht 15 oder so?(edit: habe gerade mal meine Rechnungen aus 
Interesse durchgekramt, das ganze war Ende 2003) Das Programm habe ich 
auf nem AT90S4423 oder so? komplett ohne SRAM benutzung geschrieben. Ich 
wusste einfach nicht, wie ich das SRam benutze und hab mich auch 
garnicht danach umgeschaut. Habe mich aber schon gewundert, wie man denn 
mit diesen 32 Registern alleine ein komplexes Programm schreiben soll 
:-) Dennoch hat alles funktioniert und ich konnte 4 Lüfter über die UART 
steuern :-)

Inzwischen bin ich bei C angelangt, meine Assemblerkenntnisse möchte ich 
dennoch nicht missen, da man häufig gucken kann, was der Compiler mal 
wieder für nen Mist verzapft hat und sich überlegen kann, wie man ihm 
das ausreden kann (jaaa, er versteht mich einfach nicht, aber es gibt 
immer irgend eine Lösung)

cu
Matze

von Mensch_Z (Gast)


Lesenswert?

Hut ab

es ist ja ein Lloard,der da schwreibt....
das klingelingt eben etwas aanderws !

Hut auf

von Lord_Gismo (Gast)


Lesenswert?

Entschuldigt bitte mein "geschreibsel". Ich habe es nicht Böse Gemeint. 
Werde in Zukunft versuchen alles ein bisschen besser zu machen.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

@Lord Gismo

versuche erst mal,  direin gewisses Basisverständniss vom Innenleben 
eines Mikrocontrollers zuzulegen (verschiedene Tutorien mögen das 
umfangreich erläutern)

Diese Basiswissen ist erst mal nicht sehr Prozessor-spezifisch, und gilt 
übergreifend, z.B.
- was ist eine ALU (Arithmetic-Logic-Unit, Rechenwerk)
- was sind (lesbare und/oder schreibbare) Speicherbereiche
- was sind I/O Ports (Ein-Ausgabe-Adressen)
- was sind Register innerhalb eines Prozessors
- was sind Zeiger (auf Speicherbereiche)
- was sind Zeiger-Register (pointer-Register)
- was ist ein Interupt (Unterbrechungsanforderung)

wenn du das im groben verstanden hast, dann wird dir auch folgendes 
klar:

Die Syntax (Schreibweise) eines Assembler-Befehls mag 
prozessorspezifisch sein, die Semantik (Bedeutung) eines Befehls ähnelt 
sich aber in vielen Stellen. Daher verwende ich hier mal eine 
"Pseudo-Sprache".

Das mit der Pointer (Zeiger)-Arithmetik hat einen ganz einfachen 
Hintergrund: Sofern es Pointer (-Register) in einem Controller gibt, 
dann dienen diese UNTER ANDEREM dem indirekten Zugriff auf 
Speicherzellen.

Anstelle von:
::: lade mir den Inhalt von Speicherstelle 4711 in das Register R1 (für 
einn Controller OHNE Pointer-Funktionen)


kann man dann befehle nutzen wie:
::: lade mir den Inhalt der Speicherstelle, auf die das Pointer-Register 
P1 zeigt, in das Register R1 [Dies setzt voraus, daß das 
Pointer-Register P1 vorher mit dem Zeigerwert 4711 befüllt wurde]


Dies alleine wäre ja noch nicht so aufregend, aber als weiteren Nutzen 
können Controller mit Pointer-Fähigkkeiten noch folgendes machen:

Nimm an, du willst auf einen zusammenhängenden Bereich innerhalb des 
Speichers zugreifen (z.B. um Speicherinhalte von Adresse A (= 4711 .. 
4721)  nach Adresse B (= 0815 .. 0825) zu kopieren oder verschieben). 
Entweder machst du das jetzt "von Hand" , d.h. du speicherst dir in 
irgendwelchen Registern die Quell- und die Zieladressen, und zählst mit 
einer Schleife diese Werte hoch,

ODER:  du nutzt 2 Pointer (Register), die diese Hochzählerei für dich 
machen

---

Weiteres Beispiel zu Pointern:

Der "Stack" ist ein bestimmter Bereich innerhalb des Speichers, auf dem 
Inhalte verschiedenster Art abgelegt (gestapelt) werden. Dies können 
z.B. Rücksprungadresen von Programmen sein, oder Dateninformationen. 
Zur Verwaltung des Stacks (einer oder mehrerer) gibt es "Stackpointer"

Wenn nun ein Unterprogrammaufruf erfolgt (CALL xxxxx) dann springt dein 
Assemblerprogramm "irgendwo hin" (nämlich zu der Speicheradresse wo das 
Unterprogramm begint. Die Rücksprungadresse (von wo das Hauptprogramm 
"losgesprungen" ist wird "automatisch" auf den Stack gelegt, und der 
Stackpointer verweist auf die Adresse im Stack, wo sich die 
Rücksprungadresse befindet.

Wenn das Unterprogramm endet (z.B. durch RET), dann muß ja der 
Controller wissen wohin er zurückkehren muß. Dazu wird der Inhalt der 
Speicherstelle, auf dem der Stackpointer zeigt, wieder in den 
Programmzähler zurück übertragen, und der Stackpointer korrigiert.

von Lord_Gismo (Gast)


Lesenswert?

@  Wegstaben Verbuchsler

Danke,


mit der Antwort kann ich was anfangen vielen Dank

von Martin (Gast)


Lesenswert?

Ein gibt auch immer noch so Dinger, die heißen Bücher. Diese Bücher gibt 
es sogar zum Thema Mikrocontroller.

Wenn man eine aussagekrätige Antwort haben möchte, dann sollte im ersten 
Beitrag der genaue Mikrocontrollertyp erwähnt werden. Atmel ist ein 
Hersteller der unter anderem 8051, AVR und ARMs herstellt.

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.