Метки в GCC/GAS

Модератор: Модераторы разделов

Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Метки в GCC/GAS

Сообщение ety »

Здравствуйте, уважаемые!

есть подобный макрос, сохраняющий eip в target:

Код: Выделить всё

#define get_eip(target)                \
    asm                    \
    (    "jmp a;"            \
        "b: mov 4(%%ebp),%%eax;"    \
        "ret;"                \
        "a: call b;"            \
        : "=a" (target)         \
    );


но возникают проблемы:
1) метки не уникальны, посему нельзя использовать макрос больше одного раза.
2) если в файле есть символ с именем метки, то получаю туже ошибку.

вопрос к знатокам: как писать такие макро что-бы избежать подобных проблем?
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Sfunx
Сообщения: 47

Re: Метки в GCC/GAS

Сообщение Sfunx »

ety писал(а):
26.09.2006 04:44

Код: Выделить всё

#define get_eip(target)                \
    asm                    \
    (    "jmp a;"            \
        "b: mov 4(%%ebp),%%eax;"    \
        "ret;"                \
        "a: call b;"            \
        : "=a" (target)         \
    );



Попробуй так:

Код: Выделить всё

#define get_eip(target)                \
    asm                    \
    (    "jmp 1f;"            \
        "2: mov 4(%%ebp),%%eax;"    \
        "ret;"                \
        "1: call 2b;"            \
        : "=1b" (target)         \
    );
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Метки в GCC/GAS

Сообщение ety »

Sfunx, спасибо больше!

local symbol names просто life saving :D
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Sfunx
Сообщения: 47

Re: Метки в GCC/GAS

Сообщение Sfunx »

ety писал(а):
26.09.2006 15:33
Sfunx, спасибо больше!
local symbol names просто life saving :D


Не за что.
Кстати - я это в доке нигде не находил (да и не искал). Просто когда с исходниками загрузчика ядра разбирался (адаптировал под свою железку) - видел. Там это на кажном шагу.
Спасибо сказали: