GetSmart 0 16 ноября, 2015 Опубликовано 16 ноября, 2015 (изменено) · Жалоба Прошу помощи. Взглянул в хэлп на асм. И в примеры асм-вставок из 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; } Этот вариант аналогично не ругается и код функции отсутствует. Изменено 16 ноября, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 16 ноября, 2015 Опубликовано 16 ноября, 2015 · Жалоба А почему бы не использовать встроенную __current_sp()? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 16 ноября, 2015 Опубликовано 16 ноября, 2015 · Жалоба Посмотрю. Но всё-равно хотелось бы понять правила Кейла. Вариант не заругаться и ничего не скомпилить - как минимум настораживает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 55 17 ноября, 2015 Опубликовано 17 ноября, 2015 · Жалоба А разве не правильнее спросить у ARM ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 9 февраля, 2016 Опубликовано 9 февраля, 2016 (изменено) · Жалоба А разве не правильнее спросить у ARM ? Правильнее читать хэлп из комплекта компилятора. Оказывается там написано, что доступа к регистрам процессора R0-R15 из инлайнового асма нет. Был когда-то, потом заблокировали. Сходные с названиями регистров имена считаются именами временных переменных. Поэтому компилятор не ругается. Чтение R13/R14/R15 можно делать через __current_sp() и аналогичные. Изменено 10 февраля, 2016 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 15 ноября, 2016 Опубликовано 15 ноября, 2016 · Жалоба Ещё одно препятствие возникло. Хочу вставить в инлайновый асм бинарные данные. Например незнакомую компилятору инструкцию процессора. Но компилятор на asm("DCW xxx") ругается. И на DCD и прочие. Товарищи, подскажите куда копать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 21 мая, 2018 Опубликовано 21 мая, 2018 · Жалоба Оказывается в 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"); } последней асм-инструкции не оказалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться