mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Peter W. (ja_wasser)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Jim M. (turboj)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
1 lesenswert
nicht 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
Autor: Peter W. (ja_wasser)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter W. (ja_wasser)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
2 lesenswert
nicht 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
Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau wie STOSD in der x86 Architektur...

Autor: A. K. (prx)
Datum:

Bewertung
2 lesenswert
nicht 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
Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht 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...

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.