Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизBASM и длина кода процедуры. Найти похожие ветки
← →
Владислав (2003-10-30 12:43) [0]Приветствую, Вас, мастера.
Вопрос, собственно, такой.
Дана некая процедура (функция):
function BasmFunction(AParam: ParamType): ResultType;
asm
...
end;
Существует ли способ определить длину кода тела процедуры?
Или иными словами говоря, нужно определить адрес первой инструции процедуры и адрес следующей инструкции, уже не относящейся к этой процедуре. А уж разницу я сам посчитаю :)
← →
Игорь Шевченко (2003-10-30 13:05) [1]По MAP-файлу или по отладочной информации
← →
Владислав (2003-10-30 13:09) [2]> Игорь Шевченко © (30.10.03 13:05) [1]
Спасибо.
Иного способа нет? Компилятор может рассчитать длину и сохранить ее в константе? Либо можно но ли получить это значение во время выполнения программы?
← →
Игорь Шевченко (2003-10-30 13:12) [3]Владислав © (30.10.03 13:09)
Глупый вопрос: зачем ?
← →
Владислав (2003-10-30 13:15) [4]> Игорь Шевченко © (30.10.03 13:12) [3]
Перенести процедуру в другое место в памяти.
← →
ZeroDivide (2003-10-30 13:16) [5]asm :)
Ну раз asm, то ты и сам можешь ее расчитать, что может быть проще:
call delta
delta:
pop ebp; //в ebp - адрес начала процедуры
В конце процедуры делаешь тоже самое, получаешь разницу и...опа ля - получаешь то что тебе надо.
← →
Игорь Шевченко (2003-10-30 13:34) [6]Владислав © (30.10.03 13:15)
Второй глупый вопрос: зачем ?
← →
Digitman (2003-10-30 13:42) [7]
> Владислав
> Перенести процедуру в другое место в памяти
рискуешь поиметь проблемы, если код перенесенной и вызванной затем процедуры позиционно-зависимый
> Компилятор может рассчитать длину и сохранить ее в константе?
>
может.
procedure A;
begin
..
end;
// B должна следовать по тексту непосредственно за A
procedure B;
begin
..
end;
...
размер := Integer(@B) - Integer(@A); // вычисляется в compile-time
← →
Владислав (2003-10-30 14:12) [8]> ZeroDivide © (30.10.03 13:16) [5]
Мысль понятна, но это не совсем то. Окончание процедуры я точно не определю таким способом.
> Игорь Шевченко © (30.10.03 13:34) [6]
Необходимо из процедуры вызывать метод объекта. Подобных объектов может быть много. В метод необходимо передать Self. Для того, чтобы это сделать, я должен знать этот Self. Сама процедура о нем понятия не имеет. Поэтому я создаю копию процедуры. Меняю в копии Self. Указатель на копию процедуры отдаю в то место, из которого она будет вызываться.
> Digitman © (30.10.03 13:42) [7]
"рискуешь поиметь проблемы, если код перенесенной и вызванной затем процедуры позиционно-зависимый"
Я знаю. Бдю за этим :)
Спасибо за советы.
← →
Radionov Alexey (2003-10-30 14:24) [9]>Владислав © (30.10.03 14:12) [8]
Почему-бы просто не описать как procedure of object? Тогда этот self не будет неизвестным.
← →
Владислав (2003-10-30 15:54) [10]> Radionov Alexey © (30.10.03 14:24) [9]
Откуда же он будет известен, если вызывающая процедура тоже не имеет понятия о каком то объекте? Self же не из воздуха берется.
← →
Игорь Шевченко (2003-10-30 16:28) [11]Владислав © (30.10.03 14:12)
Странный велосипед какой-то...Примером можешь объяснить ?
← →
Digitman (2003-10-30 16:59) [12]
> Владислав
действительно, велосипед более чем странный)
> В метод необходимо передать Self
ты никак о Sender"е ведешь речь ?
код, вызывающий некий метод некоего объекта, волен передавать в факт.параметре Sender все что угодно
если же таки речь идет о TMethod, то в Method.Data перед вызовом тоже можно положить все что угодно... но при этом в теле вызванного метода с обращением к Self придется быть весьма осторожным, ибо если в Data лежало черт те что и с боку бантик, то Self и получит этот "бантик"
← →
Владислав (2003-10-30 17:02) [13]> Игорь Шевченко © (30.10.03 16:28) [11]
Закончу, сброшу.
Еще подскажите пожалуйста, как вычислить смещение метки относительно начала процедуры, если это вообще возможно. Пример:
label
MyLabel;
procedure MyProcedure;
asm
...
MyLabel: // Нужно узнать адрес операции, следующей за этой меткой
...
end;
Либо такой пример:
procedure MyProcedure;
asm
...
@@MyLabel: // Нужно узнать адрес операции, следующей за этой меткой
...
end;
Смысл, найти адрес (или смещение от начала процедуры) метки MyLabel.
← →
Игорь Шевченко (2003-10-30 17:41) [14]Владислав, сдается мне, что дело ты затеял, мягко говоря, сомнительное и чреватое ба-альшим геморроем. Может, исходя из условий задачи можно более простое решение найти ?
Как вычислить адрес метки я не соображу.
← →
Владислав (2003-10-30 17:44) [15]> Игорь Шевченко © (30.10.03 17:41) [14]
Ладно. Закончу, посмотришь и поругаешь :)
← →
Игорь Шевченко (2003-10-30 17:45) [16]Владислав © (30.10.03 17:44)
> посмотришь и поругаешь
Это не заржавеет :)
← →
Digitman (2003-10-30 17:54) [17]
> Владислав
у нас кейворд "offset" уже отменили, кажется, в asm-блоке ?
← →
Владислав (2003-10-30 19:06) [18]> Digitman © (30.10.03 17:54) [17]
Не понял вопроса.
← →
NightAngel (2003-10-30 21:27) [19]> Не понял вопроса.
Метка, это только для Вашего удобства, для процессора - это адрес.
Пример:
asm
mov eax, offset @Label //в eax - адрес инструкции inc ecx
@Label:
inc ecx
end;
И ещё, "адрес метки" и её смещение от начала процедуры - это разные вещи. В остальном согласен с Digitman © (30.10.03 16:59) [12].
← →
Владислав (2003-10-31 10:32) [20]Большое спасибо всем за ответы. Разобрался. Подглядел, как это делает MakeObjectInstance.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c