![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
Что точно означает такая конструкция:
sp - регистр с адресом на стек. Процессор ARM7. Код взят из newlib 1.13 (C либа для embedded окружения), файл syscalls.c Предположение: указатель получает содержимое на стек, т.е. получает значение sp. Но это же не переносимо между процами, указатель на стек может и не существовать вовсе, а стек скрыт (PIC'овские микроконтроллеры). Ещё вопрос: а что конкретно (по инструкциям) делает asm()? В функции понятно, просто компилит асм и вставляет на место инструкции, но по коду выше выясняеться что не только в теле функции встречаться может. Тогда где ещё и что конкретно происходит? Какие линкеры какие соглашения имеют? т.к. код выше похоже с особым мудрёным линкером работать должен, а сия софтина не указана... -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
cardinal |
|
||||||||||||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Эксперимент в виде следующего (VC++)
позволяет предположить, что такая конструкция как у тебя дает тебе возможность работать с регистром с адресом на стек при помощи спец. указателя stack_ptr. Таким образом ты не должен каждый раз вытягивать адрес при помощи asm блоков, а просто используешь stack_ptr.
Тут компилятор искать нужно, а линкер уж при нем само собой будет ИМХО правильный...
Ну допустим следующее и делает:
только плюс к этому еще stack_ptr автоматом должен инкрементироваться, когда будет инкрементироваться esp (в твоем случае sp). То есть я бы (только для того чтобы объяснить что происходит!) написал мудреную строку так:
stack_ptr теперь типа тоже самое, что и sp и обращаться ты к этому регистру можешь напрямую.
Да и компилятор нестандартный видать - под определенный вид процессоров может. ![]() Вот такое вот предположение. По идее все логично... ![]() -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||||||||||||
|
|||||||||||||||
Sardar |
|
||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
Коммент
смутил, вот и подумал что компилер конструкцию каким то особым образом сохраняет, оставляя работу линкеру. Прикинул под какие компилеры обычно OpenSource либы работают - GCC. Глянул в мануал, нашёл кучу расширений к асму. Например прямая связь аргументов опкода и переменной из контекста C, при этом компилер сгенерит дополнительные инструкции по преобразованию к нужному типу, если надо разобьёт "асмовую инструкцию" на несколько легальных, да к тому же оптимизатор асмовый код понимает! ![]() По теме, это действительно связь имени из контекста C с контекстом в асме, вместо стандартного _имя. Например:
Интересно если задать параметры, то как они будут отданы в асмовую процедуру? Ведь используються для этого разные техники, от простого "положить на стек", до регистров и постоянных мест в памяти... Или это всё же простая земена имени, стандартное на заданное? Чую придёться мне пару дней потратить на тесты GCC, не стандарные возможности и как он генерит код... ![]() -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |