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
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
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.
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
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?
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.
@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
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
@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.
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.