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

Вниз

Проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
15-1323919290
Я
2011-12-15 07:21
2012.04.15
на чем делать гуи


15-1323592147
alexdn
2011-12-11 12:29
2012.04.15
Ява скрипт


2-1324723705
igorium
2011-12-24 14:48
2012.04.15
StringList - есть ли ограничения на размер массива?


2-1324407105
Gu
2011-12-20 22:51
2012.04.15
юникод


6-1254838607
fantasy
2009-10-06 18:16
2012.04.15
сети