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

Вниз

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

 
Сергей М. ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.076 c
1-1146564914
Still Swamp
2006-05-02 14:15
2006.06.11
Экспортируемая функция в EXE


15-1148126613
wirg
2006-05-20 16:03
2006.06.11
Нужна блок схема


15-1147256562
Megabyte
2006-05-10 14:22
2006.06.11
Ну кто так проектирует БД...


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


2-1148635212
Ega23
2006-05-26 13:20
2006.06.11
Разовый экспорт данных в Excel