kleine Frage zu Assembly-Befehl

smuji

Lieutenant
Registriert
Mai 2008
Beiträge
540
Hallo,

hätte nur mal eine kleine Frage was einen Assembly-Befehl angeht.

STR r1, [r2, #2]


was genau macht dieser befehl ? ich habe es versucht mit KEIL herauszufinden, komme aber auf keine Lösung.




laut einen blatt, das ich gefunden habe, Den Wert von r1 in die Adresse von r2 + 2 bytes schreiben...aber was meinen die mit +2 bytes ?

?

kann mir wer ein beispiel nennen ? würde mich freuen


gruß
 
Zuletzt bearbeitet:
smuji schrieb:
hätte nur mal eine kleine Frage was einen Assembly-Befehl angeht.
Um welches Assembler geht es hier? Assembler ist Maschinenabhängig.


smuji schrieb:
was genau macht dieser befehl ? ich habe es versucht mit KEIL herauszufinden
Mit WAS???

smuji schrieb:
Auf einer ARM-CPU würde das heißen, nimm das Word was in Register R1 steht und schreibe es in den RAM bei RAM-Adresse Inhalt wert von Register R2 +2

Wenn in R1 also 10 drin steht, R2 den Wert 5 hat dann wird also diese 2 in den RAM Adresse 7 geschrieben.
 
Hallo,

danke erstmal für die schnelle Antwort. Es geht um den Assembler eines Cortex M3 (ARM).

Ich versuche es mal mit Hilfe einer Aufgabe in Keil zu analysieren.

Die Befehle lauten:


mov r0, #2
mov r1, #24
str r1, [r0, #1]
mov r2, #2
mov r3, #5

lasse ich das jetzt in keil laufen, sieht es so aus....

beim ersten befehl wird die 2 ins register r0 geschoben mit der adresse: F04F0002

anschließend die 24 in r1

und dann r1 in r0 + 1 = adresse: F8C01001


wenn r1 in r0 + 2 , dann adresse: F8C01002

.....

wenn r1 in r0 + 5 , dann adresse: F8C01005


wo kommt aber nun das F8C0 her ?? und hinten wird scheinbar immer nur das letzt byte "hochgezählt" ?
Ergänzung ()

na, habe ich euch nun überfordert ? =)
 
Hallo,

ist es möglich dass du den erzugten programcode als addresse interpretierst?
mov r0, #2 ==> F04F 0002
mov r0, #4 ==> F04F 0004

lg
 
beim ersten befehl wird die 2 ins register r0 geschoben mit der adresse: F04F0002
Nee. Da wird einfach stumpf ne 2 ins Register r0 geschoben.

Abgesehen davon: Wo hast Du die Adressen her?

und hinten wird scheinbar immer nur das letzt byte "hochgezählt" ?
Ähm ... wie sollte es denn sonst sein.
Wenn Du zu 100 eine 5 dazu addierst -> 105
wird ja auch nur die letzte Stelle hochgezählt.
Die vordere 1 und die 0 bleibt.

na, habe ich euch nun überfordert ? =)
Möglicherweise haben die Leute ja auch noch andere Sachen zu tun als den ganzen Tag im Forum zu hängen.
 

Anhänge

  • CortexM3-ProgramCode..jpg
    CortexM3-ProgramCode..jpg
    70,9 KB · Aufrufe: 311
oh, sorry, dachte das wären die adressen :-/

habe ein screenshot von KEIL gemacht.

Unbenannt.png



wo erkenne ich nun die adresse ? wird die adresse dich diesen befehl, dezimal hochgezählt ?


die adresse besteht ja z.b. auch auch aus 8 byte.... jetzt steht in meinem r1 bsp. die adresse 0x20000000 und als store befehl, soll ich r2 in die adresse von r1 +19....das heißt dann ?

0x2000000D ???
 
Der Instruction-Pointer zeigt enthält immer die Adresse des nächsten auszuführenden Befehls.
Das ist ein Register. PC bzw. ist auch ein Teil des Registers R15.

die adresse besteht ja z.b. auch auch aus 8 byte
Nein. Ein Register ist bei ARMv7 genau 32-Bit breit oder eben 4 Byte (wegen 8 Bit pro Byte).
Zwei Stellen im Hexadezimalen sind immer 1 Byte. Denn FF = 255

Irgendwie scheint es da noch arg an Grundlagen zu fehlen. Ich würd' sagen, setz Dich erst mal mit den Basics auseinander bevor Du an die Maschine gehst. Insbesondere auch mit Zahlensysteme.
 
sorry, das mit den 16, da habe ich mich verzählt. natürlich sind es 32 ....

es geht nur darum, dass ich hier eine "aufgabe" habe, welche ich lösen möchte....allerdings verstehe ich sich nicht ganz

es geht hierum:
endlicj.png




es kommt mir nun ganz am anfang die frage auf, wenn r0 und r1 schon bekannt sind, bzw. schon einen inhalt haben, welche adresse besitzen sie dann ? 0x20000000 und 0x20000020 ????

weshalb zählen die adressen im "2. block" hoch und nicht im ersten ?

bsp. 0x20000000; 0x20000001; 0x20000002 ? anstatt 0x20000000; 0x20000010; 0x20000020 ?


wenn ich nun die obigen befehle durchgehe, dann wie folgt:

- r1 = r0
- r2 = r0
- r2 = r0<<1 = 0x08060402

welche adressen habe diese befehle bzw. register nun ?

als nächste kommt ja:

str r2, [r1, #4]

nun soll ich den wert von r2 in die adresse von r1 + 4 reinschreiben.... und genau jetzt hängts bei mir...

wo liegt denn r1 ?

und was genau bezwecken die speichernummern ?


gruß smuji
 
Zuletzt bearbeitet:
Hallo smuji,

die Register sind elementarer Bestand des Controller.
Du brauchst nur Kenntnis über deren Inhalt und nicht über deren Positionierung.
Bei 0x20000000 handelt es sich um die Basisaddresse des RAM.

probier mal folgendes untersuche was passiert.

Code:
    mov32 r0,#0x20000000
    mov32 r1,#0x12345678
    str   r1,[r0,#0]
    lsl   r1,r1,#1
    str   r1,[r0,#4]

Sieh dir den RAM-Speicher ab Adresse 0x20000000 an. (Findest du wahrscheinlich im Debug Menü von KEIL)
Ich hoffe das hilft dir beim experimentieren.

LG, Heli
 
hallo,

danke für die aufgabenstellung. leider finde ich in keil nicht die möglichkeit mir den speicher anzeigen zu lassen. auch wenn ich auf debug klicke =(
 
Hallo,

mit demMemory Window hab ich mich wohl getäuscht, hab kein uVision.

Hab folgendes mit Google auf der Keil Homepage gefunden:

The Memory window displays the memory area content. Several memory windows can be used at a time.

Open the windows from the toolbar or using the menu View - Memory Windows.

@andi_m4: Genau dort war ich auch :-)
 
Zuletzt bearbeitet:
hey danke, ich war auch im memory-window.... habe dort aber nach adresse 0x20000000 gesucht.

ich öffne das memory fenster und tippe ein 0x10000000 und dann durchlaufe ich die einzelnen schritte step by step..... und nichts verändert sich...auch kann ich nicht auf HALF-WORD einstellen

so sieht es bei mir aus

sdsdsdsdsdsd.png


und RTFM verstehe ich nicht..... LMAADBP.......danke für die hilfe


woher weiß ich denn, dass es bei 0x10000000 startet und nicht bei 0x20000000 ?
 
wie kommst du auf 0x10000000 ?
Kann 0x20000000 im Memory Window nicht angezeigt werden?
Abgesehen davon, deine Resister (r0,r1,.. welche du im STR Befehl verwendest) sind noch nicht so gesetzt,
dass diese in den RAM Speicher des Controller schreiben.
Die BasisAdresse des RAM kannst du aus dem Datasheet deines Controller entnehmen (Memory Mapping) und diese ist bei einem STM32F10x bei 0x20000000.
 
doch, ich kann auch 0x20000000 wählen, dort ist ebenfalls alles null.


wie in der aufgabenstellung oben, geht es auch viel mehr um die register und deren adressen, statt dem ram...


ich stelle erstmal verständnisfrage zur obigen aufgabe:

haben meine register r0 - r15 feste adressen zum startzeitpunkt ? eigentlich schon, oder ?

also,
r0 = 0x20000000
...
...
...
r15 = 0x2000000F

???

wenn ich nun die assemblybefehle vom arbeitsblatt durchgehe,

lautet der erste:

str r0, [r1]

nun hatte ja schon zuvor mein r0 einen vorgebenen wert. dieser müsste doch anfangsm, wenn meine obige überlegen stimmt, schon in 0x20000000 stehen und durch den befehl in 0x20000010 geschrieben werden ?!?!?



wenn nun etwas wie

str r0, [r1, #4] kommt, heißt das, dass mein r0 in 0x20000010 + 4 geschrieben wird, also = 0x20000050 ?
 
Register haben keine Adressen, da sie nicht Teil des RAMs sind sondern unabhängige Speicher. Sie haben nur einen Inhalt und dieser ist vor einem gezielten beschreiben des Registers als undefiniert zu betrachten (könnte ein zufälliger Wert sein, könnte aber auch mit 0 vorinitialisiert sein). Aber in der Aufgabe ist ja angegeben welche Werte die 2 Register zu Anfang haben.

Deine letzte Zeile ist von der Überlegung her richtig, ich frag mich nur weshalb bei dir ein 10+4=50 ergibt ;-)
 
danke für die antwort. dann frage ich mich aber, wenn die register keine adresse haben, wie kann ich bei obiger aufgabe, dann den wert von r0 ind die adresse von r1 schreiben ? wenn es doch keine adresse hat ?

oder du meinst viel mehr....den registern wird ne adresse vom ram zugewiesen ?

gut, dann wären wir wieder bei meiner frage oben:

wenn ich nun die assemblybefehle vom arbeitsblatt durchgehe,

lautet der erste:

str r0, [r1]

wo liegt r0 ? bekommt r0 vom RAM die adresse 0x2000000?

r0 und r1 haben zu beginnen schon einen wert, also müssen sie ja auch eine adresse "zugewiesen" bekommen haben, odeR ? ohne adresse, kein wert ?!?
 
Zuletzt bearbeitet:
Zurück
Oben