Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.033 c
7-42175
Anonimus
2003-08-29 18:45
2003.11.13
помогите разобраться с сом-портом


1-41280
Cranium
2003-10-31 14:19
2003.11.13
Перечисляемый тип в качестве свойства класса.


7-42157
som
2003-09-02 14:00
2003.11.13
какой Windows ?


1-41561
INTAARI
2003-10-27 12:39
2003.11.13
Выявление утечки памяти


1-41541
Blunder
2003-10-28 08:09
2003.11.13
О строках





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский