Перейти к содержанию
    

Присвоить переменной значение из регистра РОН

Как начинающий заткнулся казалось бы на простой вещи.

static inline unsigned hw_get_cpsr(void)
{
    unsigned long retval;
    asm ("mrs  r0, cpsr");
    return retval;
}

Надо присвоить переменной retval значение из регистра общего назначения r0, который фигурирует в ассемблерной вставке.

Т.е. retval = ?????????????

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно использовать соответствующую intrinsic-функцию. Для IAR:

#include <intrinsic.h>
...
unsigned long cpsr = __get_CPSR();

 

P.S. CPSR никак не относится к РОН.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал.

Вероятно регистр r0 именуется на С++ как-то по другому, я не знаю.

Вариант retval = r0 не проходит, знаний не хватает.

Изменено пользователем RA3PKJ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал.

Вероятно регистр r0 именуется на С++ как-то по другому, я не знаю.

Вариант retval = r0 не проходит, знаний не хватает.

На этот вопрос ответ - никак. Цитата из IAR C/C++ Development Guide:

Auto variables cannot be accessed

Так что остается только передавать значения через память. Но лучше использовать intrinsic или честный asm-модуль, если нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то речь шла о регистре r0 в ассемблерной вставке, о чём я и писал.

Вообще то Ваша функция называется get_cpsr, и возвращает значение регистра CPSR, а не R0.

Вот это чем не устраивает?

unsigned long cpsr = __get_CPSR();

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IAR для ARM. В заголовке указан.

 

Пардон. Не заметил.

 

Вообще то Ваша функция называется get_cpsr, и возвращает значение регистра CPSR, а не R0.

Вот это чем не устраивает?

unsigned long cpsr = __get_CPSR();

 

Это - правильный вариант для IAR'а. Даже более верный, нежели отдельный модуль на асме. Решение типа asm("чего-то") неверно в принципе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо присвоить переменной retval значение из регистра общего назначения r0, который фигурирует в ассемблерной вставке.

Т.е. retval = ?????????????

Вам уже выше все объяснили, как ДЕЙСТВИТЕЛЬНО правильно.

Ну а для общего развития, существуют соглашения о передаваемых и возвращаемых параметрах (читаем документацию) , и о чудо :) r0 это и есть Ваш "retval" - ничего присваивать не надо. Только Warning подавить на то, что функция значения не возврвщает.

.....

    __asm ( "mrs  r0, cpsr" );

#pragma diag_suppress = Pe940
}
#pragma diag_default = Pe940

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...