Здравствуйте, Нахлобуч, Вы писали:
Н>Здравствуйте, tacit_one, Вы писали:
_>>Есть ли какой-либо способ узнать смещение определенной _>>метки внутри функции извне функции?
Н>А на кой такой изврат? Может, чего-нибудь менее радикльное придумать можно будет.
другие варианты гораздо более извратные.
нет времени объяснять, но нужно решение этой задачи,
либо придётся в исходном файле плодить 2^10 naked функций.
_>Есть ли какой-либо способ узнать смещение определенной _>метки внутри функции извне функции?
_>Т.е. есть ли какой-либо способ реализовать такой код
_>func() _>{ _> ... _> _LABEL: _>}
_>main() _>{ _> UINT offset = _LABEL — func; _>}
_>Любые идеи welcome!
После применения оптимизируещего компилятора нельзя будет утверждать что туда куда надо попадешь
Здравствуйте, wwall, Вы писали:
W>ИМХО должно быть другое решение. Без подобных нестадартных подходов.
Это вполне стандартный подход:
заполнение таблицы переходов на этапе инициализации.
Данная задача легко реализуется на любом ассемблере, проблема
в том, что нужно интегрироваться с приложением на C.
Данный участок кода вызывается порядка 1 миллиона раз в секунду.
Любой лишний код здесь не приветствуется.
Здравствуйте, tacit_one, Вы писали:
_>Здравствуйте, Нахлобуч, Вы писали:
Н>>Здравствуйте, tacit_one, Вы писали:
_>>>Есть ли какой-либо способ узнать смещение определенной _>>>метки внутри функции извне функции?
Н>>А на кой такой изврат? Может, чего-нибудь менее радикльное придумать можно будет.
_>другие варианты гораздо более извратные. _>нет времени объяснять, но нужно решение этой задачи,
_>либо придётся в исходном файле плодить 2^10 naked функций.
не очень понял про
2^10 naked функций
Достаточно одной, причем если напрячься то можно свести затраты к минимуму push/pop IP, а это, ИМХО, уже как раз и есть нормально, я сам сталкивался с необходимостью балансирования на грани выделения отдельных подпрограмм ( функциями уже трудно назвать naked со своим эпилогом ), и затратами на вызов функции.
Самое главное не портить регистры в naked, тогда все будет
S>Достаточно одной, причем если напрячься то можно свести затраты к минимуму push/pop IP, а это, ИМХО, уже как раз и есть нормально, я сам сталкивался с необходимостью балансирования на грани выделения отдельных подпрограмм ( функциями уже трудно назвать naked со своим эпилогом ), и затратами на вызов функции.
S>Самое главное не портить регистры в naked, тогда все будет
а ещё представь, что функция func загружается не загрузчиком, а вручную,
и предсавь, во что превратится код, если в C файле будет 0xFF _naked функций...
tacit_one wrote:
> Н>А на кой такой изврат? Может, чего-нибудь менее радикльное придумать можно будет. > > другие варианты гораздо более извратные. > нет времени объяснять, но нужно решение этой задачи, > > либо придётся в исходном файле плодить 2^10 naked функций.
Определи структуру с членами, которые у тебя были бы локальными переменными в твоей ф-ции и массив указателей на ф-ции, которые у тебя были бы метками:
Для этого нужно точно знать структуру функции, и при её изменении придётся "подстраивать" структуру.
В принципе, это эквивалентно "зашиванию" смещений константами, но это не есть красивое решение...
Здравствуйте, tacit_one, Вы писали:
_>Здравствуйте, srggal, Вы писали:
S>>Достаточно одной, причем если напрячься то можно свести затраты к минимуму push/pop IP, а это, ИМХО, уже как раз и есть нормально, я сам сталкивался с необходимостью балансирования на грани выделения отдельных подпрограмм ( функциями уже трудно назвать naked со своим эпилогом ), и затратами на вызов функции.
S>>Самое главное не портить регистры в naked, тогда все будет
_>одну... ну, теперь представь вот такой код
_>
_>а ещё представь, что функция func загружается не загрузчиком, а вручную, _>и предсавь, во что превратится код, если в C файле будет 0xFF _naked функций...
Опять же, ИМХО, может вы замудрили и ВСЁ можно сделать проще ? Чессно гря, как-то надуманно
Здравствуйте, tacit_one, Вы писали:
_>Здравствуйте, srggal, Вы писали:
S>>Опять же, ИМХО, может вы замудрили и ВСЁ можно сделать проще ? Чессно гря, как-то надуманно
_>KIS — вещь правильная, но не всегда возможна
tacit_one wrote:
> Здравствуйте, MaximE, Вы писали: > > Для этого нужно точно знать структуру функции, и при её изменении придётся "подстраивать" структуру. > В принципе, это эквивалентно "зашиванию" смещений константами, но это не есть красивое решение...
А по-моемому — элегантное. Ты берешь стэковый фрейм и запихиваешь его в структуру. После этого ты можешь передавать этот фрейм в другие ф-ции. (Кстати, именно так работает лямбда в питоне — лямбда ф-ция держит ссылку на объект фрейма).
Здравствуйте, MaximE, Вы писали:
ME>А по-моемому — элегантное. Ты берешь стэковый фрейм и запихиваешь его в структуру. После этого ты можешь передавать этот фрейм в другие ф-ции. (Кстати, именно так работает лямбда в питоне — лямбда ф-ция держит ссылку на объект фрейма).
Согласен, элегантное, но не в этом случае. В этой функции стека вообще нет — сегментом SS пользоваться нельзя.
Я даже push eax не могу сделать...