ARM Assembly speichern von Register zu Speicher
Habe ich die folgende einfache Programm, das eine Aktion ausführt, die auf zwei Vektoren, A und B (die im Arbeitsspeicher gespeichert werden) und speichert das Ergebnis zurück in den Speicher verweist Vektor C:
AREA MyProgram, CODE, READONLY
ENTRY
Start ADR R0, VecA
ADR R1, VecB
ADR R2, VecC
; R6 is a counter
MOV R6, #1
Loop ; Get the value R0 is pointing to
LDR R3, [R0], #4
; Get the value R1 is pointing to
LDR R4, [R1], #4
; Add the values
ADD R5, R4, R3
; Divide the value by 2 (i.e. shift right by 1)
LSR R5, #1
; Store the resut to memory for C
STR R5, [R2]
; Increment R2 to point to the next memory location
ADD R2, R2, #4
; Increment the counter. If it's 9, we're done
; (since the vector has 8 elements)
ADD R6, R6, #1
CMP R6, #9
BNE Loop
B Done
Done b Done ; Loop forever
AREA MyProgram, DATA, READWRITE
VecA DCD 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9
VecB DCD 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9
VecC DCD 0x0
END
Eveything funktioniert gut, bis die STR R5, [R2]
Unterricht. Die Anleitung scheint nicht zu aktualisieren, den Speicher (der Adresse, die Spitzen, von R2
bleibt unverändert; das ist, es ist 0x00
). Ich habe versucht, dies herauszufinden, für ein paar Stunden jetzt und habe absolut noch keine Idee, was falsch läuft. Der data-Abschnitt explizit sagt READWRITE
, so verstehe ich nicht warum der Speicher nicht aktualisiert. Jede Hilfe wird sehr geschätzt.
- Ist dieser code läuft aus dem RAM oder FLASH? Eine einfache
STR
nicht ändern würde, FLASH. Ich bin mir nicht sicher, ob armasm freut sich, dass zwei Flächen mit demselben Namen und unterschiedlichen Parametern; und ich denke, Sie fehlen einige Elemente formVecC
; und könnten SieSTR R5, [R2], #4
- keine Ahnung, aber vielleicht sollten Sie definieren VecC so schön 0s anstatt nur einen einzigen?
- Versucht, das schon. Hat' arbeiten.
- Bei mir läuft es auf den KEIL, so dass es läuft aus dem RAM. Auch wenn ich den Abschnitt zwei Namen, die es nicht selbst kompilieren... Verschieben, um das nächste Wort nicht helfen, entweder.
- Sind Sie sicher, dass der simulator die Simulation von RAM, wo der code ist? Wenn Sie den Bereich ändern den Namen dann wirst du ändern müssen
ADR rN, VecX
zuLDR rN, =VecX
weil die Einpresstiefe nicht bekannt ist, bis zur link-Zeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich herausgefunden was das problem war. Ich bin mit Keil simulator und anscheinend musste ich manuell zuordnen-memory-Segmente, die ich hatte, schreiben. Ich Tat dies, indem Sie auf die
Debug -> Memory Map...
- Menü, während das Programm ausgeführt wurde, und dann erstellte ich mir ein segment reichen und gab esRead, Write, Execute
Privilegien.