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.
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
>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
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
>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.
Vielen Dank für die hinreichten Infos zu diesen Registern, auch Spess vielen Dank für die Erläuterung des Grundes! ;)
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.