Форум: "Начинающим";
Текущий архив: 2012.04.15;
Скачать: [xml.tar.bz2];
ВнизПроблема с asm кодом Найти похожие ветки
← →
TComponent (2011-12-20 19:49) [0]Есть процедура
procedure TForm1.Button2Click(Sender: TObject);
begin
asm
//здесь команды асма
end;
end;
При компиляции проверка останавливается на строке
jnz 0045B0A0
Ошибка "Error in numeric constant"
Пробовал вначале числа поставить "$", но после этого на этой же строке появилась ошибка "Invalid combination of opcode and operands"
Пробовал умножать на 16 (как в справке написано), но - то же самое.
Что неправильно?
← →
Rouse_ © (2011-12-20 19:56) [1]
> jnz 0045B0A0
Шикарный вид :)
А ты адрес перехода на лету что-ли рассчитываешь? :)
asm
...
jnz @my_label
...
@my_label:
...
end;
← →
TComponent (2011-12-20 20:43) [2]
> Rouse_ © (20.12.11 19:56) [1]
Просто возникла необходимость восстановить исходный код одной программы...
В "asm end;" вставил то, что для соотв-щей процедуры показала программа DeDe.
А как определить место, куда вставить@my_label:
?
Второй раз0045B0A0
в процедуре procedure TForm1.Button2Click(Sender: TObject); не нашлось.
← →
Rouse_ © (2011-12-20 20:59) [3]Не помню на вскидку как распарсивает код DeDe, указывает ли он адреса строк.
Если указывает, то по адресу нужно вставить метку и сделать джамп на нее.
А вообще есть более удобный инструмент: http://exelab.ru/f/index.php?action=vthread&forum=3&topic=15434
← →
Rouse_ © (2011-12-20 21:03) [4]Покажи, кстати, что за код вообще пытаешся вставить. А то мошт он без допиливания (что скорее всего) вообще не "вставлябельный" у тебя :)
← →
TComponent (2011-12-20 21:17) [5]
> Rouse_ © (20.12.11 21:03) [4]
0045B098 55 push ebp
0045B099 8BEC mov ebp, esp
0045B09B B936000000 mov ecx, $00000036
0045B0A0 6A00 push $00
0045B0A2 6A00 push $00
0045B0A4 49 dec ecx
0045B0A5 75F9 jnz 0045B0A0
0045B0A7 51 push ecx
0045B0A8 53 push ebx
0045B0A9 56 push esi
0045B0AA 57 push edi
0045B0AB BB1CEC4500 mov ebx, $0045EC1C
0045B0B0 8D7DFC lea edi, [ebp-$04]
0045B0B3 33C0 xor eax, eax
0045B0B5 55 push ebp
Кусочек с начала.
← →
TComponent (2011-12-20 21:21) [6]
> TComponent (20.12.11 21:17) [5]
но я то, что до самих команд, удалил блочным выделением, т.к. проверка при компиляции "ругалась" на это... Может не надо было, а что-то другое сделать?
← →
Rouse_ © (2011-12-20 21:24) [7]это не заработает.
тут у тебя привязка к внешнему адресу ну и не понятно что дальше с этой выгрузкой добра на стэк делать.
Но вообще:push ebp
mov ebp, esp
mov ecx, $00000036
@qwe:
push $00
push $00
dec ecx
jnz @qwe
push ecx
push ebx
push esi
push edi
mov ebx, $0045EC1C
lea edi, [ebp-$04]
xor eax, eax
push ebp
← →
Rouse_ © (2011-12-20 21:27) [8]зы до кучи, т.к. naked в дельфи не возможен, то стандартный эпилог в виде:
push ebp
mov ebp, esp
нужно убрать, иначе уплывет оть тут:lea edi, [ebp-$04]
← →
han_malign (2011-12-21 08:29) [9]
> ну и не понятно что дальше с этой выгрузкой добра на стэк делать.
- дык - это классический пролог с выделением памяти над стеке под локальные переменные большого объема(пинанием guard-страниц, 436(если учитывать push ecx) байт)...
← →
Rouse_ © (2011-12-21 10:38) [10]
> дык - это классический пролог с выделением памяти над стеке
> под локальные переменные большого объема
эмм, вообщето стандартно это делается черезadd esp, много памяти
а не через это извращение :)
← →
han_malign (2011-12-21 12:22) [11]
> вообщето стандартно это делается через
- заведи пару-тройку ShortString в локальных переменных и посмотри(D7)...
Ради интереса можно еще C++ _alloca(_chkstk/_resetstkoflw) посмотреть...
← →
han_malign (2011-12-21 13:02) [12]Не спорю, что в D(7) весьма наивная реализация, т.к. пинать стек надо с шагом в размер страницы(минимум 4KiB) - но уж какая есть...
Если размер выделяемых на стеке данных больше размера страницы, то есть шанс, при обращении за guard-страницу(sub esp, 4100; push EBX) - в лучшем случае словить AV, в худшем - запороть стек другого потока, или на страницу данных залезть - до EXCEPTION_STACK_OVERFLOW... При некоторой "удаче" - кривой рекурсией можно всю кучу запороть пока на защищенную страницу попадешь - и никакая Эврика не поможет...
← →
Rouse_ © (2011-12-21 13:39) [13]
> заведи пару-тройку ShortString в локальных переменных и
> посмотри(D7)...
Хм, есть такое дело :)
Щас поэксперементировал, добился трех вариантов эпилога:
1. add esp, xxx
2.
xor ecx,ecx
push ecx
... push ecx повторяется сколько нужно
push ebx
3.
mov ecx, сколько надо
push $00
push $00
dec ecx
jnz
логика выбора того или иного эпилога, даже с учетом [12] не ясна :)
← →
Rouse_ © (2011-12-21 13:40) [14]тьху, ну т.е. пролога :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.04.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c