2016-11-13 9 views
2

ARM7アセンブリを使用して簡単なプログラムを作成しようとしていますが、単純なデータでメモリ領域を初期化できません。 はここに例ARM7アセンブリメモリ領域が初期化されていません

AREA RESET, CODE, READWRITE 
    ENTRY 
    LDR r0, =SortArray ;load start address 
    LDR r1, =SortArrayEnd ; load end address 
    STR r15, [r0] 
    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 

あるこのないロード0x40000000r0レジスタポイントでのデバッグモードSortArrayでメモリ内のデータ、および0x40000034SortArrayEndポイントが、そこにあるデータなし

Memory map for data in separate area

しかし、あなたは気づいたかもしれませんが、メモリにデータを格納する命令があります。 STR r15, [r0]これは完全に動作するデータが格納されています。

次の例は動作しますが、わかりましたが、私はコード領域内にデータを置き、READWRITEとしましたが、これはおそらく悪い考えです。しかしこの場合、私は自分のデータをメモリに見ることができます。ここで

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

    END 

は、問題を見つけるために助けてください、それは0x00000000

Memory Map WIth Data placed in code Area

から始まり、私のメモリマップである、私が間違っているかを把握しようとして数日を過ごしてきました。

私はuVision 4を使用しています。デバイスはLCP2148です。

+0

はどのようにしてターゲットにこのコードを取得している - あなたは、生のバイナリを構築し、それを点滅、またはちょうどデバッガを介してメモリに直接オブジェクト・ファイルをロードしていますか?前者の場合、必要なセクション再配置を実行するための適切なスタートアップコードとリンクしていますか? – Notlikethat

+0

私はデバッガでこれを実行しようとしていますが、今はこのコードをデバイスにアップロードする必要はありません。今はデバッガだけで動作する必要があります。 – gzbuaapzroyn

答えて

0

残念ながら、あなたの質問は複数の質問をしているように見えます。 "...メモリ領域は初期化されていません"、 "... SortArrayEndは0x40000034を指しますが、データはありません"。

SortArrayEndには何も格納されていないので、データは含まれていてはなりません。したがって、r15の値をSortArrayEndに格納しようとすると、SortArrayEndのメモリアドレスを指すレジスタをポイントする必要があります。お役に立てれば。私はGNUを使用しています。

.data 
     SortArray:  .word 1,5,20,32,13,66,3,5,23,64,112,66,22 
     SortArrayEnd: .word 0 

.text 
     .global main 
main: 
     nop 
     ldr r0,=SortArray 
     ldr r1,=SortArrayEnd 
     str r15, [r1] // some random value 

GDBとイラスト:

(gdb) x/16d $r0 
0x11036:  1  5  20  32 
0x11046:  13  66  3  5 
0x11056:  23  64  112  66 
0x11066:  22  33800 0  0 
(gdb) x/16d $r1 
0x1106a:  33800 0  0  0 
0x1107a:  0  0  0  0 
0x1108a:  0  0  0  0 
0x1109a:  0  0  0  0 
関連する問題