Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];

Вниз

Адрес метки   Найти похожие ветки 

 
Сергей М. ©   (2006-05-18 14:09) [0]

Существуют ли в Делфи недок.лазейки для получения абс.адреса метки ?

Иллюстрирация к вопросу:

label SomeLabel;
..

SomePointer := @SomeLabel; // нельзя, но порой так хочется !
SomeLabel: SomeStatement;


 
Gero ©   (2006-05-18 14:11) [1]

Извращение-то какое.


 
wicked ©   (2006-05-18 14:11) [2]

asm
 mov eax, dword ptr SomeLabel
 mov [SomePointer], eax
end;

может и ошибаюсь с синтаксисом, но общая идея должна быть ясна....


 
Сергей М. ©   (2006-05-18 14:56) [3]


> Gero ©   (18.05.06 14:11) [1]


Чтой-то вдруг сразу "извращение" ?


> wicked ©   (18.05.06 14:11) [2]


тогда уж

procedure TTestForm.Button3Click(Sender: TObject);
label SomeLabel;
var SomePointer: Pointer;
begin
asm
lea eax, SomeLabel //или mov eax, offset SomeLabel
mov [SomePointer], eax
jmp [SomePointer]
end;
SomeLabel:
end;

>All

Я извиняюсь, что не упомянул свою незаинтересованность в asm-решении - с ним -токак раз все ясно ... Интересуют лазейки в OP ..


 
Сергей М. ©   (2006-05-18 17:07) [4]

Мастера, ау !

Игорь !
Борис !
Анатолий !

p.s.
Извините меня за тех кого не упомянул по давно известному имени..


 
Игорь Шевченко ©   (2006-05-18 17:21) [5]

Похоже, что нет. Минимальной единицей для взятия адреса кода является процедура, согласно help. А как извратиться - не нашел.


 
MBo ©   (2006-05-18 17:24) [6]

>Сергей М. ©   (18.05.06 17:07) [4]
Не знаю.
В борландовских конфах нашел единственную ветку по этой теме - ответ - "только asm" (у того автора метка находилась  после процедуры, в которой и нужно было зачем-то получить адрес метки, так что в его случае - адрес возврата)


 
Сергей М. ©   (2006-05-18 17:31) [7]

Игорь, Борис !

Спасибо.


 
Rouse_ ©   (2006-05-18 17:57) [8]

мне кажется врятли, т.к. в данном случае меткой выступает адрес - константа перехода. Т.е. в машинном коде этот адрес не берется откуда-то а подставляется константой.

В качестве альтернативы:

procedure GetLabelAddr(_Addr: Pointer);
var
 I, Offset: Integer;
 Opcode: Byte;
 S: String;
begin
 S := "";
 repeat
   Opcode := Byte(_Addr^);
   S := S + IntToHex(Opcode, 2) + " ";
   _Addr := Pointer(Integer(_Addr) + 1);
   if Opcode in [$E9..$EB] then // JMP
   begin
     case Opcode of
       $E9:
       begin
         Offset := Integer(_Addr^);
         _Addr := Pointer(Integer(_Addr) + 4);
       end;
       $EA:
       begin
         Offset := Word(_Addr^);
         _Addr := Pointer(Integer(_Addr) + 2);
       end;
       $EB:
       begin
         Offset := Byte(_Addr^);
         _Addr := Pointer(Integer(_Addr) + 1);
       end;
     end;
     ShowMessage("Label found at addr: $" + IntToHex(Integer(_Addr) + Offset, 8));
   end;
 until Opcode = $C3; // RET
 ShowMessage(S);
end;

procedure TdlgPOP3Main.Button2Click(Sender: TObject);
label A, B, C;
begin
 GetLabelAddr(@TdlgPOP3Main.Button2Click);
 ShowMessage("Start");
 goto A;
 B:
   ShowMessage("Label B");
   goto C;
 A:
   ShowMessage("Label A");
   goto B;
 C:
   ShowMessage("Label C");
end;


 
Сергей М. ©   (2006-05-19 08:29) [9]

Собственно конечный интерес представляет возможность передачи адреса метки параметром вызова ф-ции/процедуры, что-то вроде следующего:

procedure SomeProc(const LabelAddress: Pointer);
begin
...
end;
...
label SomeLabel;
...
SomeLabel: SomeStatement;
...
SomeProc(@SomeLabel);


Конструкция @SomeLabel, естественно, не допустима.

asm, конечно, решает задачу:

lea eax, SomeLabel
call SomeProc


но это, как понимаете, во многих ситуациях не удобно и не желательно - солянка сборная из asm-блоков и OP-выражений в пределах одной и той же п/программы ни к чему хорошему не приводит


 
Alkid ©   (2006-05-19 10:10) [10]


> но это, как понимаете, во многих ситуациях не удобно и не
> желательно - солянка сборная из asm-блоков и OP-выражений
> в пределах одной и той же п/программы ни к чему хорошему
> не приводит

  Кстати, а каков сакраментальный смысл взятия адреса метки и, тем паче,
передача её в процедуру? Есть у меня сильно подозрение, что имеет место попытка харекским способом реализовать то, что можно реализовать полагаясь на сам язык Object Pascal без хакерства.


 
Сергей М. ©   (2006-05-19 10:50) [11]


> Alkid ©   (19.05.06 10:10) [10]


Все просто - есть необходимость реализовать упрощенную логику обработки исключений в удаленном кодовом потоке, где исполняется внедренный в чужое АП позиционно-независимый Делфи-код, не использующий RTL.

Еще проще говоря, необходимо организовать некий "эквивалент" дельфийских блочных конструкций try..finally/except, который не зависит от кода модуля System в составе RTL. "Эквивалент" должен быть максимально приближен к "оригиналу" по написанию и использованию в исх.тексте.

Иллюстрация в псевдокоде :

1. "Оригинал"

try
..
except
..
end;

2. "Эквивалент"

label BeginExceptHandler, EndExceptHandler;
..

_try(@ExceptHandler)
..
BeginExceptHandler: _except(@EndExceptHandler);
..
EndExceptHandler: _end_except;


 
Alkid ©   (2006-05-19 11:05) [12]


> Все просто - есть необходимость реализовать упрощенную логику
> обработки исключений в удаленном кодовом потоке, где исполняется
> внедренный в чужое АП позиционно-независимый Делфи-код,
> не использующий RTL.

Эксплойты на Дельфи ваяем? :)


 
Сергей М. ©   (2006-05-19 11:22) [13]


> Alkid ©   (19.05.06 11:05) [12]


> Эксплойты на Дельфи ваяем?


Ошибаешься...
Мало ли по каким причинам может потребоваться удаленный поток с позиционно-независимым кодом !
А то что для некоторых задач нельзя тащить свою RTL в чужое АП , это еще ни о чем не говорит.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
2-1148801707
Вася
2006-05-28 11:35
2006.06.11
день недели


15-1147939540
kozhanov
2006-05-18 12:05
2006.06.11
Проверка орфографии


15-1147779662
dewas23
2006-05-16 15:41
2006.06.11
Какой прогой просмотреть путь пакета?


1-1144210785
Glex
2006-04-05 08:19
2006.06.11
Как правильно реализовывывать наследников? property OnSM: TNotify


15-1147882047
Копир
2006-05-17 20:07
2006.06.11
А не выпить ли нам грузинского вина?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский