ASM verstehen lernen.

OP #2073954
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.
Gast #2073984
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
#2074134
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.
Gast #2074251
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren