2016-11-02 4 views
0

Ich habe mehr als Tag versucht zu verstehen, was vor sich geht. Ich kann nicht einmal Testprojektdaten aus dem Speicher lesen.ARM7 Assembly keine Daten im Speicher

In diesem Fall brauche ich nur einige Daten im Speicher zu speichern, lesen Sie es Prozess dann und speichern sie in den Speicher zurück.

Hier ist mein Code

AREA RESET, CODE, READONLY 
    ENTRY 
    LDR r0, =SortArray ;load start address 
    LDR r1, =SortArrayEnd ; load end address 
    LDR r4, [r0] 
    SUB r2, r2, #1 ; r2 contains (LENGTH-1) 
    MOV r6, #0 ; r6 sum set to 0 
STOP B STOP 
    LTORG 
    AREA my_data, DATA, READWRITE 
    ALIGN 
SortArray 
    DCD 1,5,20,32,13,66,3,5,23,64,112,66,22 
SortArrayEnd 

    END 

Hier ist, was ich bekomme, wenn Projekt Debuggen

enter image description here enter image description here

Warum gibt es keine Daten im Speicher gespeichert ?? Natürlich, wenn ich Speicher von dieser Adresse lesen, wird nichts in Register gesetzt.

Ich habe versucht, es ohne Erfolg zu lösen.

Hier einige weitere relevante Fragen.

  1. Warum Datenadresse 0x40000000 ist. Dies liegt an der internen Speicherabbildung meines MC (LPC2148)? Ausgehend von dieser Adresse befindet sich SRAM Speicher. Habe ich recht ?
  2. Warum in verschiedenen AREA gespeicherten Daten können nicht direkt ohne = Zeichen LDR Befehl von Hardware- und Software-Perspektive beread?
  3. Die gesamte Kommunikation wird über Speicheradressen durchgeführt, so dass einige andere Peripheriegeräte nur auf die spezifische Adresse zugeordnet werden kann und mit dem Speicher-Bus? Wie wird es auf Hardware-Ebene gemacht? Wie gebe ich spezifisches Gerät/Bus rand der Adresse?

Ich wäre dankbar für jede Hilfe oder Beratung.

+2

Es gibt keinen einzigen STR (Speicher) -Befehl. Warum erwartest du, dass die Erinnerung anders wird? LDR lädt ein Register und verknüpft es nicht für immer mit einer Speicheradresse. –

+0

Oh, auch die Zeile 'SUB r2, r2, # 1' ist falsch. R2 ist nicht initialisiert, Sie haben am Ende r2 mit Müll minus 1. –

+0

Der Speicher ist leer, in diesem Fall muss ich nicht Daten in den Speicher speichern, ich muss nur in Register zu lesen, aber wie Sie sehen können Speicher ist leer. Bitte helfen Sie das zu lösen. – fyfdzbgz

Antwort

0

Dies ist keine direkte Antwort; nur ein Beispiel mit GNU-Tools. Auch wenn Sie verschiedene Werkzeuge verwenden, kann dies einigen helfen.

.bss 
     SortArrayEnd: .word 0 
.data 
     fmt:   .string "%d %d %d\n" 
     SortArray:  .word 1,5,20,32,13,66,3,5,23,64,112,66,22 
     .equ   len.SortArray,.- SortArray 
.text 
     .global main 

main: 
     nop 
     ldr r9,=SortArray    // point to array 
     ldr r10,=SortArrayEnd   // point to array 

     ldr r1, [r9]     // load array value @ element 0 
     mov r2, #len.SortArray 
     sub r2, r2, #4 

     str r1, [r10]     // store value into diff array element 0 
     ldr r3, [r10]     // load element 0 from diff array into GPR for printing 

     bl write 

exit: 
     mov r7, #1 
     svc 0 

write: 
     push {r1-r4,lr} 
     ldr r0,=fmt 
     bl printf 
     pop {r1-r4,pc} 

Stepping in den Code mit GDB wird man sehen, dass die Array-Elemente vorhanden sind, auf dem Arrayzeiger

(gdb) x/16 $r9 
0x20612:  1  5  20  32  13  66  3  5 
0x2061a:  23  64  112  66  22  0  0  0 

Stepping weiteren wird den neuen geladenen Wert in die anderen Arrayzeiger

siehe
(gdb) x/4 $r10 
0x20643:  1  0  0  0 
Verwandte Themen