0

2 つの異なるレジスタからデータを取得しようとしloadています。storearm

int testing[64*1024]  __attribute__ ((aligned (8192)));
__asm__("MOV r0, %0" :: "r" (testing) : "r0");
__asm__("STR R5,[R0];");

私の最初の試みでは、 register が指すデータr0を registerに保存しようとしましたr5。コンパイルの問題はまったくありませんが、レジスタ内のデータはcannot be accessed.

についてLoadも同様です。

LDR R1,[R0]



(gdb) info registers
r0             0xb6000  745472
r1             0x1      1
r2             0x0      0
r3             0xb6000  745472
r4             0x8961   35169
r5             0x0      0
r6             0x0      0
r7             0xbeba9664       3199899236
r8             0x0      0
r9             0xefb9   61369
r10            0xf02d   61485
r11            0x0      0
r12            0x0      0
sp             0xbeba9664       0xbeba9664
lr             0x89cb   35275
pc             0xeace   0xeace <test48+14>
cpsr           0x60000030       1610612784
(gdb) bt
#0  0x0000eace in test48 ()
#1  0x000089ca in main ()
(gdb) x/x $r5
0x0:    Cannot access memory at address 0x0
(gdb) x/x $r0
0xb6000 <testing>: 0x00000000

基本的に、ldr と str を使用してメモリのインライン アドレッシングを実現しようとしています。

サンプルを作成している間、このガイドの助けを借りました

私が間違っている場所

4

1 に答える 1

3

コメントとコードが一致しません:

私の最初の試みでは、レジスタr0が指すデータをレジスタr5に保存しようとしました[...] __asm__("STR R5,[R0];");

あなたが書いた命令は、 の値を、指すR5メモリ位置に格納します。R0レジスタR5はメモリの場所を指していません-その値は0x00あなたの例にあります。

ステートメントは、使用されるレジスター__asm__を宣言していないR5ため、コンパイラーは自由に一時的な値または変数をレジスターに入れることができます。これはまた説明します:

(gdb) x/x $r5
0x0:    Cannot access memory at address 0x0

あなたの gdb コマンドは、R5- を指しているメモリの場所にアクセスしようとしますが、何も指していません。

于 2013-07-11T15:26:17.803 に答える