Главная страница
    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.014 c
3-1145429137
RomanH
2006-04-19 10:45
2006.06.11
Помогите с запросом


3-1144947505
parovoZZ
2006-04-13 20:58
2006.06.11
Вытащить номер ошибки из ADOQuery


2-1148619374
shmel
2006-05-26 08:56
2006.06.11
Связь с приложением


15-1147259190
Mike Kouzmine
2006-05-10 15:06
2006.06.11
Слушали послание Путина?


2-1148497893
S@shka
2006-05-24 23:11
2006.06.11
Ошика программы при старте под XP





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