Сейчас на форуме: tyns777 (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› Подскажите что не так делаю Delphi +asm |
Посл.ответ | Сообщение |
|
Создано: 11 октября 2009 20:27 · Поправил: 3uM6a6Ba · Личное сообщение · #1 |
|
Создано: 12 октября 2009 06:41 · Личное сообщение · #2 |
|
Создано: 12 октября 2009 10:23 · Личное сообщение · #3 |
|
Создано: 12 октября 2009 10:56 · Личное сообщение · #4 |
|
Создано: 12 октября 2009 11:00 · Поправил: Coderess · Личное сообщение · #5 dll'ки в архиве не хватает Code:
P.S. Вобще в книгах пишут, что лучше экспортировать по имени, а не индексу. ----- Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes ![]() |
|
Создано: 12 октября 2009 19:45 · Личное сообщение · #6 |
|
Создано: 12 октября 2009 19:52 · Личное сообщение · #7 tundra37 Для этого я положил второй файл на сях, который компилиться и норм работает!!! а в дельфях болт(это во первых), во вторых почему Вы так уверены ,что при begin он туда ничего не положет ??? , а как же переменные которые передаются в процедуру ??? В общем меня наводит на мысль, что в процедуру параметры как-то не так передаются crypt1, потому как смотрю в дебаг на сях после захода в проседуру три пуша и потом уже асм попит..., а в дельфях два и какой-то мусор непоняный мне ![]() |
|
Создано: 12 октября 2009 19:54 · Личное сообщение · #8 |
|
Создано: 12 октября 2009 20:07 · Личное сообщение · #9 |
|
Создано: 12 октября 2009 20:09 · Личное сообщение · #10 |
|
Создано: 12 октября 2009 20:13 · Личное сообщение · #11 вот что в дебаге Это голова функции crypt1 на делфи Code:
А вот на Сях Code:
объясните почему в сях есть вход, есть 3 пуша, а в дельфи мммм ![]() ![]() |
|
Создано: 12 октября 2009 20:21 · Личное сообщение · #12 |
|
Создано: 12 октября 2009 21:53 · Личное сообщение · #13 3uM6a6Ba пишет: в архиве 2 исходника где архив?? то что приведено в первом посте для кода функции crypt1 procedure Tmain.crypt1(mass: array of char; const const1, const2: integer); begin asm pop edi pop esi pop ebx pop ebp mov eax,dword [esp+C] sub esp,8 push esi xor esi,esi test eax,eax jbe @loop11 врядли может быть скомпилировано делфи в код приведенный в посте 11 004ADD58 55 push ebp 004ADD59 8BEC mov ebp,esp 004ADD5B 8B450C mov eax,[ebp+$0c] 004ADD5E 8B5510 mov edx,[ebp+$10] 004ADD61 85D2 test edx,edx 004ADD63 780A js $004add6f в коде топикстартера сначала из стека извлекаются все параметры велючая адрес возврата, а потом доступ esp+C в неизвестно куда ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 12 октября 2009 22:37 · Поправил: daFix · Личное сообщение · #14 Может кто нибудь перевести эти функции на язык высокого уровня? Чтобы не играться со стёком? У меня с этим проблемы. Даже если мы выровним тут стёк, тогда всёравно валимся, ибо дельфя в любом случае зачем-то пихает 5! аргументов с CALL! OKOB пишет: врядли может быть скомпилировано делфи в код приведенный в посте 11 Невероятно, но факт! Сам не могу понять зачем он так стёк опускает ----- Research For Food ![]() |
|
Создано: 13 октября 2009 00:49 · Поправил: _ruzmaz_ · Личное сообщение · #15 Попробуй вот что: - объявляй Tmain.crypt1 как cdecl (исправлено) => в результате этого параметры будут передаваться так, как скорее всего =) и предполагалось; - делай эту процедуру ассемблерной, а не обычной процедурой с ассемблерной вставкой (просто удали begin и один end) => перед первой инструкцией в исходнике будут идти только push ebp и mov ebp, esp; - попы) в начале меняй на mov esp, ebp pop ebp => выполнение этих инструкций вернет стек и регистры в состояние как в самом начале функи (для чего до этого и были попы)). ![]() |
|
Создано: 13 октября 2009 01:46 · Поправил: 3uM6a6Ba · Личное сообщение · #16 Вот что сделал все-равно болт! Code:
Вот код на сях Code:
![]() |
|
Создано: 13 октября 2009 09:38 · Личное сообщение · #17 |
|
Создано: 13 октября 2009 12:20 · Личное сообщение · #18 3uM6a6Ba пишет: все-равно болт! в Сях передача параметров через стек осуществляется при их помещении по списку справа на лево, а в Дельфях (аля Паскаль) наоборот слева на право. А вы используете одни и теже с Си смещения относительно ESP для доступа к ним. В Си удалением параметров из стека занимается вызывающий код, а в Паскале сама функа должна почистить стек (ret $C). В Си чтобы не изощряться с попами впереди функи нужно в обявление добавить __declspec(naked) - голый писаный код. ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 13 октября 2009 18:45 · Личное сообщение · #19 OKOB пишет: в Сях передача параметров через стек осуществляется при их помещении по списку справа на лево, а в Дельфях (аля Паскаль) наоборот слева на право. Да и к тому же в делфях по умолчанию первые параметры передаются через регистры (fastcall). 3uM6a6Ba пишет: Вот что сделал все-равно болт! Сорри, писал что надо объявлять как stdcall, но раз на сях работает и стоит просто ret, то нужно cdecl. Т.е. после procedure Tmain.crypt(.....); пиши cdecl; И еще - в сях при передаче mass передается просто указатель, в дельфях (в том модуле, что ты запостил) передается указатель на первый элемент массива и длина массива за вычетом единицы (т.е. в стек кладется не 0x0C, а 0x10). Поэтому передавай mass не как array of char, а как указатель, например PAnsiChar. ![]() |
|
Создано: 13 октября 2009 22:43 · Личное сообщение · #20 |
|
Создано: 14 октября 2009 07:34 · Личное сообщение · #21 В дополнение добавлю: надо учитывать еще и особенности ООП - т.е. если метод crypt1 является методом класса, то указатель на сам объект (Self) передается в метод через какой-либо регистр. Поэтому перед выполнением асмового кода надо обязательно сохранять в стеке все остальные регистры (и в конце восстанавливать их из стека), которые портит код. ![]() |
![]() |
eXeL@B —› Программирование —› Подскажите что не так делаю Delphi +asm |