Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1324525285
Богдан
2011-12-22 07:41
2012.04.15
2 задачки на написание программы


15-1323635402
Юрий
2011-12-12 00:30
2012.04.15
С днем рождения ! 12 декабря 2011 понедельник


2-1324424597
Gu
2011-12-21 03:43
2012.04.15
overload в dll


1-1291676222
Gu
2010-12-07 01:57
2012.04.15
Заглавное меню


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





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