Форум: "Прочее";
Текущий архив: 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