RA3PKJ 0 8 августа, 2010 Опубликовано 8 августа, 2010 · Жалоба Как начинающий заткнулся казалось бы на простой вещи. static inline unsigned hw_get_cpsr(void) { unsigned long retval; asm ("mrs r0, cpsr"); return retval; } Надо присвоить переменной retval значение из регистра общего назначения r0, который фигурирует в ассемблерной вставке. Т.е. retval = ????????????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 8 августа, 2010 Опубликовано 8 августа, 2010 · Жалоба Что за компилятор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RA3PKJ 0 8 августа, 2010 Опубликовано 8 августа, 2010 · Жалоба IAR для ARM. В заголовке указан. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 8 августа, 2010 Опубликовано 8 августа, 2010 · Жалоба Можно использовать соответствующую intrinsic-функцию. Для IAR: #include <intrinsic.h> ... unsigned long cpsr = __get_CPSR(); P.S. CPSR никак не относится к РОН. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RA3PKJ 0 8 августа, 2010 Опубликовано 8 августа, 2010 (изменено) · Жалоба Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал. Вероятно регистр r0 именуется на С++ как-то по другому, я не знаю. Вариант retval = r0 не проходит, знаний не хватает. Изменено 8 августа, 2010 пользователем RA3PKJ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 8 августа, 2010 Опубликовано 8 августа, 2010 · Жалоба Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал. Вероятно регистр r0 именуется на С++ как-то по другому, я не знаю. Вариант retval = r0 не проходит, знаний не хватает. На этот вопрос ответ - никак. Цитата из IAR C/C++ Development Guide: Auto variables cannot be accessed Так что остается только передавать значения через память. Но лучше использовать intrinsic или честный asm-модуль, если нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 8 августа, 2010 Опубликовано 8 августа, 2010 · Жалоба Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал. Вообще то Ваша функция называется get_cpsr, и возвращает значение регистра CPSR, а не R0. Вот это чем не устраивает? unsigned long cpsr = __get_CPSR(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RA3PKJ 0 8 августа, 2010 Опубликовано 8 августа, 2010 · Жалоба Буду переваривать.Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 8 августа, 2010 Опубликовано 8 августа, 2010 · Жалоба IAR для ARM. В заголовке указан. Пардон. Не заметил. Вообще то Ваша функция называется get_cpsr, и возвращает значение регистра CPSR, а не R0. Вот это чем не устраивает? unsigned long cpsr = __get_CPSR(); Это - правильный вариант для IAR'а. Даже более верный, нежели отдельный модуль на асме. Решение типа asm("чего-то") неверно в принципе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 8 августа, 2010 Опубликовано 8 августа, 2010 · Жалоба Надо присвоить переменной retval значение из регистра общего назначения r0, который фигурирует в ассемблерной вставке. Т.е. retval = ????????????? Вам уже выше все объяснили, как ДЕЙСТВИТЕЛЬНО правильно. Ну а для общего развития, существуют соглашения о передаваемых и возвращаемых параметрах (читаем документацию) , и о чудо :) r0 это и есть Ваш "retval" - ничего присваивать не надо. Только Warning подавить на то, что функция значения не возврвщает. ..... __asm ( "mrs r0, cpsr" ); #pragma diag_suppress = Pe940 } #pragma diag_default = Pe940 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться