2013-07-11 3 views
0

Я пытаюсь установить load и store данные из двух разных регистров arm.ARM - Инструкции по сборке и хранению

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

В моей первой попытке я пытался сохранить некоторые данные, на который указывает регистр r0 зарегистрировать 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.

Я принял помощь this руководства в то время как я строил мой пример

Любая идея, где я неправильно

+0

Я рекомендую использовать один встроенный сборочный блок и информировать компилятор всех зарегистрированных вами регистров (скребковые регистры). – ugoren

+0

Я просто пытался это сделать. Без изменений. Я до сих пор не могу получить доступ к регистрам. – pistal

ответ

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 - но это не указывает на какой-либо.

+0

Но я использую синтаксис 'AT & T', то есть CMD DEST, SRC – pistal

+2

Для инструкции STR синтаксис STR SRC, [DEST], как объяснено в руководстве, на которое вы ссылаетесь в своем вопросе. Сожалею. –

+2

at & t имеет отношение только к x86, совершенно не относящемуся к руке. –

Смежные вопросы