Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.06 c
14-41996
undert
2003-10-14 19:40
2003.11.13
Зацените сайт #2


14-42075
alex134
2003-10-23 18:05
2003.11.13
спам


14-41955
1g0r
2003-10-20 12:06
2003.11.13
Просыпаемся....


1-41658
Mister
2003-10-25 15:52
2003.11.13
Помогите пожайлуста!


8-41740
marconi
2003-07-15 12:09
2003.11.13
Опять про цвета