www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ASM verstehen lernen.


Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soo, ich habe mich nun nach zwei Jahren in C mal dazu durchgeschlagen 
ASM zu probieren.

Mitunter komme ich auch teilweise ganz gut zurecht in den ersten 
Schritten, jedoch tun sich, selbstverständlich einige Fragen auf über 
welche ich mir in C noch nie gedanken machen musste z.b.:

> Zu beachten ist außerdem, dass die ersten 16 Register (r0-r15)
> nicht von jedem Assemblerbefehl genutzt werden können.

Für was sind die ersten 16 Register gut?

Ich hoffe diesen Thread auch weiterhin mit meinen "doofen" ASM Fragen 
missbrauchen zu dürfen :D

Liebe Grüße.

Autor: Rau (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann nicht doof fragen nur dumm antworten
grüße.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rene K. schrieb:
> Für was sind die ersten 16 Register gut?

zum speichern von Daten, wie auch die anderen 16.

z.b. eine Direktes laden einer Konstante geht nur in die Register 16-32. 
(ldi). Das Rechnen mit add geht allen von 1-32

Autor: Vuvuzelatus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Für was sind die ersten 16 Register gut?

Für fast alles. Du kannst nur einige Instruktionen nicht damit benutzen, 
und zwar

ldi, sbr, cbr, ser, subi, sbci, cpi, andi, ori

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Für was sind die ersten 16 Register gut?

Da steht, das nicht jeder Assemblerbefehl anwendbar ist. Und nicht 
kein Assemblerbefehl. Auch sind nicht alle Assemblerbefehle auf alle 
'oberen' Register anwendbar.
Befehle werden bei AVRs in einem 16-Bit Befehlswort codiert. Darin sind 
auch die 'Nummern' der Register enthalten. 32 Register->5 Bit, 16 
Register->4 Bit. Durch die Reduzierung der Register bleiben mehr Bit für 
die Befehlscodierung übrig.

MfG Spess

Autor: Peter R. (pnu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>zu was sind die Register 0..15 gut

Zunächst zu allem, zu dem auch die Register 16..31 gut sind, ausgenommen 
die immediate-Befehle LDI,CPI...

Zm Anderen habe die Register r0 und r1 eine Sonderfunktion beim 
MUL-Befehl und r0 noch eine beim LPM-Befehl.

Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die hinreichten Infos zu diesen Registern, auch Spess 
vielen Dank für die Erläuterung des Grundes! ;)

Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man merkt, daß du nie am PC in assembler programmiert hast. die früheren 
x86 prozessoren hatten deutlich weniger register (AX, BX, CX, DX, SI, 
DI, BP, IP, SP und segmentregister DS, ES, FS, GS, CS, SS) als z.b. ein 
AVR, und zwei davon waren auch nicht so einfach nutzbar weil sie code 
und stack adressierten (CS:IP, SS:SP).

der hauptvorteil auf damaligen system war, daß man den recht langsamen 
speicherzugriff vermeiden konnte wenn man ausschließlich mit registern 
arbeitete. was schon im prozessor ist muß nicht erst aus dem speicher 
geholt werden. also hat man probiert so viele daten wie möglich in den 
registern zu halten. für zwischenergebnisse braucht man dann auch keinen 
platz im speicher zu belegen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>man merkt, daß du nie am PC in assembler programmiert hast.

Oder Z80. Da fühlt man sich, zumindest was die Register angeht, wie im 
Schlaraffenland.

MfG Spess

Autor: bitte löschen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim X86 konnte man direkt mit dem Speicher rechnen, z.B.
 add ax,word ptr es:[bx+6]
(Addiert zum AX-Register den Inhalt der Speicherstelle im Extra-Segment, 
mit dem Offset, der sich aus dem Inhalt des BX-Registers plus der 
Konstanten 6 ergibt.)
Solche Möglichkeiten gab (gibt) es viele, aber alle waren nur mit 
bestimmten Registern möglich. So hat jedes Register einen Namen, der 
seine Aufgabe bezeichnet, z.B. AX für Akkumulator, BX für 
Basis-Register, CX für Counter-Register, SI für Source-Index, DI für 
Destination Index, BP für Base-Pointer, SP für Stack-Pointer, usw.. Die 
Segmentregister haben auch alle eigene Aufgaben, wie Code-Segment, 
Datensegent, Stack-Segment, Extra-Segent.
Da ist der AVR viel unkomplizierter. Natürlich versucht man auch (oder 
gerade) beim AVR, möglichst viel mit Registern zu machen und 
überflüssige Speicherzugriffe zu vermeiden.

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.