Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> asm вставка в указатель... что означает такая конструкция? 
:(
    Опции темы
Sardar
Дата 20.11.2005, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 1
Всего: 317



Что точно означает такая конструкция:
Код
/* Register name faking - works in collusion with the linker.  */
register char * stack_ptr asm ("sp");

sp - регистр с адресом на стек. Процессор ARM7. Код взят из newlib 1.13 (C либа для embedded окружения), файл syscalls.c

Предположение: указатель получает содержимое на стек, т.е. получает значение sp. Но это же не переносимо между процами, указатель на стек может и не существовать вовсе, а стек скрыт (PIC'овские микроконтроллеры).

Ещё вопрос: а что конкретно (по инструкциям) делает asm()? В функции понятно, просто компилит асм и вставляет на место инструкции, но по коду выше выясняеться что не только в теле функции встречаться может. Тогда где ещё и что конкретно происходит?

Какие линкеры какие соглашения имеют? т.к. код выше похоже с особым мудрёным линкером работать должен, а сия софтина не указана...


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
cardinal
Дата 20.11.2005, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата(Sardar @ 19.11.2005, 23:55)
Что точно означает такая конструкция

Эксперимент в виде следующего (VC++)
Код

    __asm mov eax, esp
    __asm mov stack_ptr, eax    // получили адрес
    __asm push 0x55    // пихнули еще чего-нибудь

    __asm mov eax, esp
    __asm mov stack_ptr, eax    // получили опять адрес и нашли по нему 0x55

позволяет предположить, что такая конструкция как у тебя дает тебе возможность работать с регистром с адресом на стек при помощи спец. указателя stack_ptr. Таким образом ты не должен каждый раз вытягивать адрес при помощи asm блоков, а просто используешь stack_ptr.
Цитата(Sardar @ 19.11.2005, 23:55)
Какие линкеры какие соглашения имеют? т.к. код выше похоже с особым мудрёным линкером работать должен, а сия софтина не указана...

Тут компилятор искать нужно, а линкер уж при нем само собой будет ИМХО правильный...
Цитата(Sardar @ 19.11.2005, 23:55)
Ещё вопрос: а что конкретно (по инструкциям) делает asm()?

Ну допустим следующее и делает:
Код

    __asm mov eax, esp
    __asm mov stack_ptr, eax    // получили адрес

только плюс к этому еще stack_ptr автоматом должен инкрементироваться, когда будет инкрементироваться esp (в твоем случае sp). То есть я бы (только для того чтобы объяснить что происходит!) написал мудреную строку так:
Код

#define stack_ptr, asm("sp")

stack_ptr теперь типа тоже самое, что и sp и обращаться ты к этому регистру можешь напрямую.
Цитата(Sardar @ 19.11.2005, 23:55)
Но это же не переносимо между процами

Да и компилятор нестандартный видать - под определенный вид процессоров может. smile

Вот такое вот предположение. По идее все логично... smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Sardar
Дата 20.11.2005, 03:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 1
Всего: 317



Цитата(cardinal @ 20.11.2005, 02:13)

Тут компилятор искать нужно, а линкер уж при нем само собой будет ИМХО правильный...

Коммент
Цитата
Register name faking - works in collusion with the linker.

смутил, вот и подумал что компилер конструкцию каким то особым образом сохраняет, оставляя работу линкеру.

Прикинул под какие компилеры обычно OpenSource либы работают - GCC. Глянул в мануал, нашёл кучу расширений к асму.

Например прямая связь аргументов опкода и переменной из контекста C, при этом компилер сгенерит дополнительные инструкции по преобразованию к нужному типу, если надо разобьёт "асмовую инструкцию" на несколько легальных, да к тому же оптимизатор асмовый код понимает! smile

По теме, это действительно связь имени из контекста C с контекстом в асме, вместо стандартного _имя. Например:
Код
extern int myvar asm("my_var_in_asm"); //свяжет myvar с асмовой меткой my_var_in_asm

extern int myfunc(void) asm("my_proc_in_asm"); //свяжет функцию с процедурой в асме!

Интересно если задать параметры, то как они будут отданы в асмовую процедуру? Ведь используються для этого разные техники, от простого "положить на стек", до регистров и постоянных мест в памяти... Или это всё же простая земена имени, стандартное на заданное?

Чую придёться мне пару дней потратить на тесты GCC, не стандарные возможности и как он генерит код... smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.