реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Непонятки с ASM в Кейле
GetSmart
сообщение Nov 16 2015, 22:58
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Прошу помощи. Взглянул в хэлп на асм. И в примеры асм-вставок из core_cmXX.c. Хочу чтобы функция возвращала значение стека (регистра SP), но не знаю как. Для универсальности решения платформа пусть будет ARM7. Регистр PSP/MSP не предлагать.

Код
static __inline unsigned long __get_CPSR(void)
{
    register unsigned long ret;

    __asm
    {
        MRS ret, CPSR;
    }
    return ret;
}

Так работает. Для любого Кортекса тоже, если заменить CPSR на другой регистр специального назначения. Но, если заменить этот регистр на SP или R13 с инструкцией MOV, то уже не работает. Функция компилится без ошибок, но значения не возвращает, т.к. кода функции (инструкций процессора) нет вообще. А в R0 (где результат функции) какое-то старое содержимое.

Код
static __inline unsigned long __get_SP(void)
{
    register volatile unsigned long stck __asm("sp");
    return stck;
}

Этот вариант аналогично не ругается и код функции отсутствует.

Сообщение отредактировал GetSmart - Nov 16 2015, 23:39


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 16 2015, 23:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А почему бы не использовать встроенную __current_sp()?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 16 2015, 23:41
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Посмотрю. Но всё-равно хотелось бы понять правила Кейла. Вариант не заругаться и ничего не скомпилить - как минимум настораживает.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
x893
сообщение Nov 17 2015, 12:06
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



А разве не правильнее спросить у ARM ?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 9 2016, 22:29
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(x893 @ Nov 17 2015, 16:06) *
А разве не правильнее спросить у ARM ?

Правильнее читать хэлп из комплекта компилятора. Оказывается там написано, что доступа к регистрам процессора R0-R15 из инлайнового асма нет. Был когда-то, потом заблокировали. Сходные с названиями регистров имена считаются именами временных переменных. Поэтому компилятор не ругается. Чтение R13/R14/R15 можно делать через __current_sp() и аналогичные.

Сообщение отредактировал GetSmart - Feb 10 2016, 14:17


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 15 2016, 23:19
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ещё одно препятствие возникло. Хочу вставить в инлайновый асм бинарные данные. Например незнакомую компилятору инструкцию процессора. Но компилятор на asm("DCW xxx") ругается. И на DCD и прочие. Товарищи, подскажите куда копать?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 21 2018, 17:33
Сообщение #7


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Оказывается в 4-ом кейле с асмом всё ещё хуже чем я думал. Видел си-код, в котором после __asm volatile (...) стояло чтение-модификация-запись волатильной переменной. И кейл сделал так, что чтение произошло ещё перед ассемблерной инструкцией.

А в похожем коде:
Код
unsigned char volatile flag;
...
if (flag != 0) {
    __asm volatile("cpsid i");
    if (flag != 0) {
        ...code with flag variable ...
        __asm volatile("cpsie i");
        ...code...
    }
    __asm volatile("cpsie i");
}

последней асм-инструкции не оказалось.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th August 2025 - 09:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016