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
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.
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
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
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.
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?
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.