|
|
  |
Присвоить переменной значение из регистра РОН, AT91SAM7S64, IAR, C++ |
|
|
|
Aug 8 2010, 11:13
|
Группа: Участник
Сообщений: 10
Регистрация: 5-08-10
Пользователь №: 58 773

|
Как начинающий заткнулся казалось бы на простой вещи. Код static inline unsigned hw_get_cpsr(void) { unsigned long retval; asm ("mrs r0, cpsr"); return retval; } Надо присвоить переменной retval значение из регистра общего назначения r0, который фигурирует в ассемблерной вставке. Т.е. retval = ?????????????
|
|
|
|
|
Aug 8 2010, 11:41
|
Группа: Участник
Сообщений: 10
Регистрация: 5-08-10
Пользователь №: 58 773

|
IAR для ARM. В заголовке указан.
|
|
|
|
|
Aug 8 2010, 12:11
|
Группа: Участник
Сообщений: 10
Регистрация: 5-08-10
Пользователь №: 58 773

|
Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал. Вероятно регистр r0 именуется на С++ как-то по другому, я не знаю. Вариант retval = r0 не проходит, знаний не хватает.
Сообщение отредактировал RA3PKJ - Aug 8 2010, 12:26
|
|
|
|
|
Aug 8 2010, 12:33
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(RA3PKJ @ Aug 8 2010, 16:11)  Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал. Вероятно регистр r0 именуется на С++ как-то по другому, я не знаю. Вариант retval = r0 не проходит, знаний не хватает. На этот вопрос ответ - никак. Цитата из IAR C/C++ Development Guide: Цитата Auto variables cannot be accessed Так что остается только передавать значения через память. Но лучше использовать intrinsic или честный asm-модуль, если нужно.
|
|
|
|
|
Aug 8 2010, 12:34
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(RA3PKJ @ Aug 8 2010, 16:11)  Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал. Вообще то Ваша функция называется get_cpsr, и возвращает значение регистра CPSR, а не R0. Вот это чем не устраивает? Код unsigned long cpsr = __get_CPSR();
|
|
|
|
|
Aug 8 2010, 12:51
|
Группа: Участник
Сообщений: 10
Регистрация: 5-08-10
Пользователь №: 58 773

|
Буду переваривать.Спасибо.
|
|
|
|
|
Aug 8 2010, 13:12
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE (RA3PKJ @ Aug 8 2010, 14:41)  IAR для ARM. В заголовке указан. Пардон. Не заметил. QUOTE (sonycman @ Aug 8 2010, 15:34)  Вообще то Ваша функция называется get_cpsr, и возвращает значение регистра CPSR, а не R0. Вот это чем не устраивает? CODE unsigned long cpsr = __get_CPSR(); Это - правильный вариант для IAR'а. Даже более верный, нежели отдельный модуль на асме. Решение типа asm("чего-то") неверно в принципе.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Aug 8 2010, 13:54
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (RA3PKJ @ Aug 8 2010, 14:13)  Надо присвоить переменной retval значение из регистра общего назначения r0, который фигурирует в ассемблерной вставке. Т.е. retval = ????????????? Вам уже выше все объяснили, как ДЕЙСТВИТЕЛЬНО правильно. Ну а для общего развития, существуют соглашения о передаваемых и возвращаемых параметрах (читаем документацию) , и о чудо  r0 это и есть Ваш "retval" - ничего присваивать не надо. Только Warning подавить на то, что функция значения не возврвщает. CODE .....
__asm ( "mrs r0, cpsr" );
#pragma diag_suppress = Pe940 } #pragma diag_default = Pe940
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|