Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > asm вставка в указатель...


Автор: Sardar 20.11.2005, 01:55
Что точно означает такая конструкция:
Код
/* 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()? В функции понятно, просто компилит асм и вставляет на место инструкции, но по коду выше выясняеться что не только в теле функции встречаться может. Тогда где ещё и что конкретно происходит?

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

Автор: cardinal 20.11.2005, 03:13
Цитата(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

Автор: Sardar 20.11.2005, 03:46
Цитата(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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)