Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > asm вставка в указатель... |
Автор: Sardar 20.11.2005, 01:55 | ||
Что точно означает такая конструкция:
sp - регистр с адресом на стек. Процессор ARM7. Код взят из newlib 1.13 (C либа для embedded окружения), файл syscalls.c Предположение: указатель получает содержимое на стек, т.е. получает значение sp. Но это же не переносимо между процами, указатель на стек может и не существовать вовсе, а стек скрыт (PIC'овские микроконтроллеры). Ещё вопрос: а что конкретно (по инструкциям) делает asm()? В функции понятно, просто компилит асм и вставляет на место инструкции, но по коду выше выясняеться что не только в теле функции встречаться может. Тогда где ещё и что конкретно происходит? Какие линкеры какие соглашения имеют? т.к. код выше похоже с особым мудрёным линкером работать должен, а сия софтина не указана... |
Автор: cardinal 20.11.2005, 03:13 | ||||||||||||||
Эксперимент в виде следующего (VC++)
позволяет предположить, что такая конструкция как у тебя дает тебе возможность работать с регистром с адресом на стек при помощи спец. указателя stack_ptr. Таким образом ты не должен каждый раз вытягивать адрес при помощи asm блоков, а просто используешь stack_ptr.
Тут компилятор искать нужно, а линкер уж при нем само собой будет ИМХО правильный...
Ну допустим следующее и делает:
только плюс к этому еще stack_ptr автоматом должен инкрементироваться, когда будет инкрементироваться esp (в твоем случае sp). То есть я бы (только для того чтобы объяснить что происходит!) написал мудреную строку так:
stack_ptr теперь типа тоже самое, что и sp и обращаться ты к этому регистру можешь напрямую.
Да и компилятор нестандартный видать - под определенный вид процессоров может. ![]() Вот такое вот предположение. По идее все логично... ![]() |
Автор: Sardar 20.11.2005, 03:46 | ||||||
Коммент
смутил, вот и подумал что компилер конструкцию каким то особым образом сохраняет, оставляя работу линкеру. Прикинул под какие компилеры обычно OpenSource либы работают - GCC. Глянул в мануал, нашёл кучу расширений к асму. Например прямая связь аргументов опкода и переменной из контекста C, при этом компилер сгенерит дополнительные инструкции по преобразованию к нужному типу, если надо разобьёт "асмовую инструкцию" на несколько легальных, да к тому же оптимизатор асмовый код понимает! ![]() По теме, это действительно связь имени из контекста C с контекстом в асме, вместо стандартного _имя. Например:
Интересно если задать параметры, то как они будут отданы в асмовую процедуру? Ведь используються для этого разные техники, от простого "положить на стек", до регистров и постоянных мест в памяти... Или это всё же простая земена имени, стандартное на заданное? Чую придёться мне пару дней потратить на тесты GCC, не стандарные возможности и как он генерит код... ![]() |