Сейчас на форуме: Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Пролог\Эпилог ф-ций на дельфи
Посл.ответ Сообщение

Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 19 июня 2008 18:15
· Личное сообщение · #1

Пишу ф-цию cdecl соглашения, мне желательно сделать так, чтобы Delphi не вставляла свои пролог\эпилог к ф-ции? Помнится в с есть ключевое слово naked и программист сам потом может делать че хочет.

мне подобное надо на Delphi, может кто знает как это сделать?

-----
My love is very cool girl.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 19 июня 2008 18:44
· Личное сообщение · #2

Вместо begin вконопатить asm и не юзать параметры и переменный канает, вроде



Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 19 июня 2008 19:09
· Личное сообщение · #3

А почему бы не объявить эту ф-ю как cdecl?



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 19 июня 2008 19:16
· Личное сообщение · #4

egorovshura Объявил, но что-то со стеком кашмар

-----
My love is very cool girl.




Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 19 июня 2008 19:36
· Личное сообщение · #5

theCollision пишет:
Объявил, но что-то со стеком кашмар


А какой код-то дельфи сгенерировал для этой ф-ии (CPU window)? И что за параметры передаешь? Может что-нить с динамическими массивами или поинтерами, там обычно легко ошибиться.



Ранг: 63.8 (постоянный), 2thx
Активность: 0.030
Статус: Участник

Создано: 19 июня 2008 21:06 · Поправил: drin
· Личное сообщение · #6

procedure myproc; assembler;
asm
...
end;


Отсебятины от делфи внутри этого не будет



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 19 июня 2008 22:47
· Личное сообщение · #7

drin гы ))) а ты щас это напиши и погляди )

-----
My love is very cool girl.




Ранг: 73.7 (постоянный), 22thx
Активность: 0.040
Статус: Участник

Создано: 20 июня 2008 02:19 · Поправил: XQuader
· Личное сообщение · #8

Function myproc:integer;
asm
mov eax,0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
myproc;
end;
Написал и поглядел => в коде функции был ток mov eax,0 ;)

0044E1CC /$ B8 00000000 MOV EAX,0 ;myproc
0044E1D1 \. C3 RETN
0044E1D2 8BC0 MOV EAX,EAX
0044E1D4 . E8 F3FFFFFF CALL Project1.0044E1CC ; Button1Click
0044E1D9 . C3 RETN





Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 20 июня 2008 06:16
· Личное сообщение · #9

XQuader а пролог то какой? (не могу сам посмотреть) почему-то мну кажецо, что пролог все же буит тот же..

-----
invoke OpenFire




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 20 июня 2008 08:42
· Личное сообщение · #10

XQuader попробуй объявить ф-цию по cdecl ?

-----
My love is very cool girl.




Ранг: 73.7 (постоянный), 22thx
Активность: 0.040
Статус: Участник

Создано: 20 июня 2008 12:00
· Личное сообщение · #11

Ice-T
Нету ни пролога ни эпилога(это видно по коду,который я показал)
theCollision
Что с cdecl,что без него - код не изменился.
Если добавить какую-нить переменную,или усложнить код (Там IntToStr вызвать,то соответственно появляется пролог)




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 20 июня 2008 12:03
· Личное сообщение · #12

XQuader пишет:
Нету ни пролога ни эпилога(это видно по коду,который я показал)

ну ты верхних пару строчек не показал, вдруг там пролог =)

-----
invoke OpenFire




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 20 июня 2008 12:06
· Личное сообщение · #13

XQuader Гы, а я делал так:
function UnpackRoutine(aSource, aDestionation : Pointer) : Cardinal; cdecl;

-----
My love is very cool girl.





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 20 июня 2008 12:08
· Личное сообщение · #14

Ice-T
он же показал
0044E1D2 8BC0 MOV EAX,EAX
0044E1D4 . E8 F3FFFFFF CALL Project1.0044E1CC ; Button1Click
0044E1D9 . C3 RETN

А над ней показал его myfunc

Никакого пролога. Если ты имеешь ввиду пролог у myfunc, то это пох, так как пример приводится не с ней, а с ее вызовом.

-----
Yann Tiersen best and do not fuck





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 20 июня 2008 12:10
· Личное сообщение · #15

theCollision если не хочешь секса с делфи, то начни свою функцию с pop ebp
Тогда после генерации получится

push ebp
mov ebp, esp
pop ebp
Твой код

-----
Yann Tiersen best and do not fuck




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 20 июня 2008 12:21 · Поправил: theCollision
· Личное сообщение · #16

PE_Kill с лишней командой :
u_FormMain.pas.53: POP EBP
0045FA64 5D pop ebp
u_FormMain.pas.54: PUSH EBP
0045FA65 55 push ebp
u_FormMain.pas.55: MOV EBP,ESP
0045FA66 89E5 mov ebp,esp


Спасибо, все решено это я с глупил! ;)

Надо было без begin в начале )

-----
My love is very cool girl.





Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 20 июня 2008 12:26
· Личное сообщение · #17

с вызовом понятно, просто интересно есть он там или нет впринципе.. и если поменять asm на begin появится ли он или мб изменится просто адрес ф-ии на меньший..малоли чего в дельфи может быть

-----
invoke OpenFire




Ранг: 73.7 (постоянный), 22thx
Активность: 0.040
Статус: Участник

Создано: 20 июня 2008 12:26
· Личное сообщение · #18

Ice-T пишет:
ну ты верхних пару строчек не показал, вдруг там пролог =)

Собсно я показал саму myproc (то,что вызывается по кнопке) и там всего 2 команды,mov eax,0;retn; =)
(по аддресу 0044E1D4 начинается код Button1Click =>0044E1D4 . E8 F3FFFFFF CALL Project1.0044E1CC (а это адрес Myproc) =>
0044E1CC /$ B8 00000000 MOV EAX,0 ;myproc
0044E1D1 \. C3 RETN



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 20 июня 2008 12:37
· Личное сообщение · #19

мона сделать при вызове:
type a = function(param :dword):bool;
...
func = a(dword(@function)+3);
a(xxx);

-----
Shalom ebanats!




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 20 июня 2008 12:40
· Личное сообщение · #20

PE_Kill вопрос, где и в каком месте справки написано про "POP EBP" ? ;)

-----
My love is very cool girl.




Ранг: 16.9 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 июня 2008 14:18
· Личное сообщение · #21

Пример объявления функции на Дельфи без пролога\эпилога

Function RTDCS:Int64; register;
begin
asm
rtdcs
end;
end;



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 20 июня 2008 15:00
· Личное сообщение · #22

rdtsc

-----
Shalom ebanats!





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 20 июня 2008 17:51
· Личное сообщение · #23

theCollision пишет:
где и в каком месте справки написано про "POP EBP" ?

Нигде, просто личный опыт, делфя не предназначалась для рипа.

-----
Yann Tiersen best and do not fuck




Ранг: 16.9 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 июня 2008 09:31
· Личное сообщение · #24

2 SLV
Постоянно буковки в этой команде путаю.


 eXeL@B —› Программирование —› Пролог\Эпилог ф-ций на дельфи
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати