Forum: Compiler & IDEs ARM Assembler Codes - Hilfe nötig


von Erol S. (supere)


Lesenswert?

Hallo,

könnte mir einer von euch "Assembler-Gurus" folgende Zeilen kurz 
übersetzen?
Ich benötige nur eine kurze Beschreibung, was genau wie passiert.

push {,lr}
add sp,-#0008
add r3,sp,#0004
lsl r3,r3,#18
ldr r1,[r3,#08]

Vielen Dank schon mal im voraus!

Erol

von Noname (Gast)


Lesenswert?

push {,lr}      Link Register auf den Stack legen
add sp,-#0008    sp = sp - 8
add r3,sp,#0004  r3 = sp + 4
lsl r3,r3,#18    r3 = r3 << 18
ldr r1,[r3,#08]  r1 = *(r3 + 8)

Was die Zeilen genau machen kann man natürlich so aus dem Zusammenhang 
herraus gerissen nicht sagen. Sieht für mich wie der Anfang einer 
Funktion aus (wegen dem push lr).

von Erol S. (supere)


Lesenswert?

Vielen Dank Noname,

eine Frage habe ich noch: lsl r3,r3,#18    r3 = r3 << 18
da gehts doch um einen links-shift. wie ist 18 gemeint (Bit, Byte)?

Wenn ich mir meine Register anschaue, dann wird mein Wert um genau
6 Stellen nach links verschoben. (1 Stelle = 4 Bit)

Danke noch einmal.

Erol

von Noname (Gast)


Lesenswert?

lsl = logical shift left

Die 18 gibt die Stellen an, um die geshiftet wird.

"Wenn ich mir meine Register anschaue, dann wird mein Wert um genau
6 Stellen nach links verschoben. (1 Stelle = 4 Bit)"


Sicher? kann eigentlich so nicht sein. Mit einer Stelle meinst du wohl 
eine Ziffer der hexadezimalen Darstellung. 18 Bit wären aber 4 1/2 
Stellen quasi.

Wenn in deinem 32 Bit Register ne 0x00000001 stand, steht halt nach dem 
lsl eine 0x00040000 drin. Das lsl kannst du dir auch vorstellen als 
Multiplikation mit 2^18.

von Erol S. (supere)


Angehängte Dateien:

Lesenswert?

> "Wenn ich mir meine Register anschaue, dann wird mein Wert um genau
> 6 Stellen nach links verschoben. (1 Stelle = 4 Bit)"
>
>
> Sicher? kann eigentlich so nicht sein. Mit einer Stelle meinst du wohl
> eine Ziffer der hexadezimalen Darstellung. 18 Bit wären aber 4 1/2
> Stellen quasi.
>
Sicher bin ich mir nicht, aber ich denke, dass das so ist.

> Wenn in deinem 32 Bit Register ne 0x00000001 stand, steht halt nach dem
> lsl eine 0x00040000 drin. Das lsl kannst du dir auch vorstellen als
> Multiplikation mit 2^18.

Ich habe dir zwei Bilder mitgeschickt. Da kannst du dann sehen, was ich 
meine. Ich hoffe, dass das dich weier bringt.

Erol

von Erol S. (supere)


Lesenswert?

Hi Noname,

ich habe die Lösung herausgefunden! Endlich.
Bei dem Wert 18 handelt es sich um einen Hex-Wert.
In Dezimal ausgedrückt dann: 24.

Daher die "weitere" Verschiebung.

Gruß

Erol

von Noname (Gast)


Lesenswert?

Ja klar... war wohl eben für mich auch noch zu früh am morgen... ;-)

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Noname wrote:
> push {,lr}      Link Register auf den Stack legen
> add sp,-#0008    sp = sp - 8
> add r3,sp,#0004  r3 = sp + 4
> lsl r3,r3,#18    r3 = r3 << 18
> ldr r1,[r3,#08]  r1 = *(r3 + 8)
>
> Was die Zeilen genau machen kann man natürlich so aus dem Zusammenhang
> herraus gerissen nicht sagen.

Ein bisschen mehr Kontext wäre schön. Das sieht ja sehr bizarr aus. In 
Worte gefasst:

1. Link Register auf den Stack legen
2. Zwei leere Plätze auf dem Stack belegen (allokieren ;)
3. r3 auf den ersten der beiden leeren Plätze zeigen lassen.
4. Das LSB von r3 verwenden, um eine 32MB page zu adressieren.
5. Das dritte Wort aus der gewählten page in r1 laden.

Gruß
Marcus
http://www.doulos.com/arm

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.