Forum: Mikrocontroller und Digitale Elektronik ARM Assembler - str/ldr


von Peter W. (ja_wasser)


Lesenswert?

Hallo,
weiß jemand was dieser Befehl

mov r0, #0
str r1, [r0], #4

macht? Nach meinem verständnis schreibe ich den wert von r1 (register1) 
dahin, wo r0 gerade hinzeigt. r0 zeigt aber doch nirgendwo hin, d.h. es 
ist kein pointer. Stattdessen steht in r0 einfach nur der Wert 0. Und 
danach wird r0 halt um 4 inkrementiert. Wenn ich das aber im assembler 
mal laufen lasse, dann steht dort das r0 den Wert 0x4 bekommt. Aber ich 
versteh nicht wieso? In r1 steht eine riesige zahl, weil r1 nicht 
initialisiert ist. Wieso steht dann nicht in r0 diese riesige Zahl um 4 
inkrementiert? Mit str sage ich doch:
Nehme den ersten operand und stecke ihn in den zweiten operand? Also 
stecke r1 in [r0]? Bzw: [r0] = r1
Für mich macht das alles keinen sinn, weil ich nicht weiß wieso r0 ein 
Zeiger auf eine adresse sein soll und was mit dieser riesigen zahl in r1 
passiert.

Weiß da jemand weiter?

: Verschoben durch User
von Jim M. (turboj)


Lesenswert?

Peter W. schrieb:
> Nehme den ersten operand und stecke ihn in den zweiten operand?

STR greift aber schreibend aufs Memory zu, und liesst nur den Wert von 
R1.

Auf gängigen MCUs würde ich da einen Fault erwarten, denn Page 0 ist 
eher selten wirklich schreibbar. Falls es schreibbar ist, würde 
hinterher an der Speicherstelle 4 der Wert von R1 stehen.

von (prx) A. K. (prx)


Lesenswert?

Jim M. schrieb:
> Falls es schreibbar ist, würde
> hinterher an der Speicherstelle 4 der Wert von R1 stehen.

Obiger Code schreibt an die Adresse 0 und addiert anschliessend 4 auf 
R0.

Peter W. schrieb:
> Nehme den ersten operand und stecke ihn in den zweiten operand?

Besser: Nehme den ersten Operand und stecke ihn an jene Adresse, die der 
zweite Operand beschreibt.

: Bearbeitet durch User
von Peter W. (ja_wasser)


Lesenswert?

Jim M. schrieb:
> Peter W. schrieb:
>> Nehme den ersten operand und stecke ihn in den zweiten operand?
>
> STR greift aber schreibend aufs Memory zu, und liesst nur den Wert von
> R1.
>
> Auf gängigen MCUs würde ich da einen Fault erwarten, denn Page 0 ist
> eher selten wirklich schreibbar. Falls es schreibbar ist, würde
> hinterher an der Speicherstelle 4 der Wert von R1 stehen.

Aso ja. STR liest den wert von r1 und schreibt ihn in die 
speicherstelle, auf die r0 gerade zeigt und danach wird der Zeiger r0 um 
4 inkrementiert, sodass er bei 16bit auf den nächsten speicherbereich 
zeigt, also auf Speicherstelle 4.

Stimmt jetzt macht es sinn. Deswegen steht in r0 dann auch 0x4.

danke an beide!

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Peter W. schrieb:
> und danach wird der Zeiger r0 um
> 4 inkrementiert, sodass er bei 16bit auf den nächsten speicherbereich
> zeigt, also auf Speicherstelle 4.

4 mal 8 ist nicht 16, sondern 32.

von Peter W. (ja_wasser)


Lesenswert?

Hmm ok, jetzt bin ich nochmal kurz verwirrt.

0x0 zeigt auf speicherstelle 0. Auf welche speicherstelle zeigt dann 
0x4? wieso auf 4*8 = 32? Ich hatte eben nen kurzen denkfehler, aber wenn 
ich eine 16bit architektur habe, dann habe ich doch pro speicherbereich 
16bit, also 16 zellen die 0 oder 1 sein können (2^16). Das heißt würde 
dann nicht 0x4 auf die speicherstelle 4*16 = 64 zeigen? Jetzt bin ich 
irgendwie völlig verwirrt. Wenn ich mir so ein speicherbereich so 
vorstelle:
0111 0101 0000 1100 (willkürlicher beispielwert)
Also so ein block aus 16bits. 0x0 zeigt wohl nun ganz links auf die 0. 
0x4 müsste doch nun auf das erste zeichen vier Speicherbereiche weiter 
zeigen, oder nicht? Also dann auf die speicherstelle 64?

von (prx) A. K. (prx)


Lesenswert?

Peter W. schrieb:
> aber wenn ich eine 16bit architektur habe,

Hast du bei ARM aber nicht. STR speichert bei ARM ein Maschinenwort, und 
das hat 32 Bits. Da der Speicher aber nicht Worte adressiert, sondern 
Bytes aus 8 Bits, folgt auf das Speicherwort mit der Adresse 0x0 das 
Wort mit der Adresse 0x4.

: Bearbeitet durch User
von Heinz V. (heinz_v)


Lesenswert?

Genau wie STOSD in der x86 Architektur...

von (prx) A. K. (prx)


Lesenswert?

Heinz V. schrieb:
> Genau wie STOSD in der x86 Architektur...

Wobei eine mögliche Quelle seiner Verwirrung darin besteht, dass ein 
"Wort" bei x86 aus historischen Gründen 16 Bits hat und sich bei der 
64-Bit x86 Architektur ein einzelnes Maschinenwort aus 2 Doppelworten 
zusammen setzt. ;-)

: Bearbeitet durch User
von Heinz V. (heinz_v)


Lesenswert?

A. K. schrieb:
> Wobei eine mögliche Quelle seiner Verwirrung darin besteht, dass ein
> "Wort" bei x86 aus historischen Gründen 16 Bits hat.

Deswegen ja die drei verschiedenen Mnemoics:
STOSB Store String Byte inkrementiert den Destination Index um 1
STOSW Store String Word um 2 und
STOSD Store String Doubleword um 4

aber OK, ist eben eine andere Architektur...

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.