Skocz do zawartości


Wywoływanie procedury


18 odpowiedzi w tym temacie

#1 Maciek_

    Nowy na forum

  • Użytkownicy
  • 7 Postów:
  • Gadu-Gadu:4699314

Napisano sob, 01 wrz 2007 - 13:29

Witam wszystkich serdecznie.

Zgłaszam sie do wszystkich z następującym problemem. Potrzebuje zapisać adres procedury do wskaźnika i napisać wstawke assemblerową która będzie tą wstawke wywoływała. Pamiętem, że już kiedyś coś takiego napisałem, ale teraz nie pamiętam jak to się robiło a moje metody prób i błędów nie przyniosły skótków. O ile sie nie mylą adres procedury ładowałem za pomocą les a wywoływałem za pomocą call. Dobrze myślę? Ale jak dokładnie coś takiego napisać?

Załóżmy, że mamy znaną wszystkiem procedure:

procedure HelloWorld;
begin
Writeln('Hello World!');
end;

i wskaźnik p:pointer;

jak załadować adres tej procedury do wskaźnika i jak ją wywołać?

#2 Max1414

    Guru

  • Super użytkownicy
  • 574 Postów:

Napisano sob, 01 wrz 2007 - 13:41

delphi


type
   TEvent = procedure of Object;
var
  E: TEvent;

proYH[Y[][    N[ NŚVćCŚ&VvSŁVĆĆv&ĆCSwvĆćPŚVćByŚJ'hŚXi+h'&f:n-óćmreĄj+m^VŁ{hmmŁ3ĘdŁ~;(ui'
type
  TEvent = procedure of Object;
  TForm1 = class(TFormB]N]YHPX]J[V7B&6VGW&R'WGF6Ć66VćFW#D&ŚV7B&fFP!ąą]ą(AŃąŃ(ic
    { Public declarations }

  end;

var
  Form1: TForm1;
N][[[Y[][
_BYHÓVĆĆv&ĆCŚ&Vv&VWŚVćC&6VGW&RDf&Óf&7&VĄMQ=)(!ąą]ą)()Form1.Button1Click(Sender: TObject);
begin
  E;
end;
 

 


#3 Maciek_

    Nowy na forum

  • Użytkownicy
  • 7 Postów:
  • Gadu-Gadu:4699314

Napisano sob, 01 wrz 2007 - 13:49

ok, zapomniałem dodać. Interesuje mnie tylko i wyłącznie Borland Pascal. Delphi odpada sad.gif ale dzięki za pomoc i fatyge smile.gif

#4 Force

    Nowy na forum

  • Super użytkownicy
  • 1138 Postów:

Napisano sob, 01 wrz 2007 - 13:54

To nie może być:
delphi

TEvent = procedure;

 

a potem jak Max1414?

#5 Maciek_

    Nowy na forum

  • Użytkownicy
  • 7 Postów:
  • Gadu-Gadu:4699314

Napisano sob, 01 wrz 2007 - 14:01

tzn jak, bo szczerze mówiąc to mi to nie wiele mówi

#6 Max1414

    Guru

  • Super użytkownicy
  • 574 Postów:

Napisano sob, 01 wrz 2007 - 14:10

Cytat

tzn jak, bo szczerze mówiąc to mi to nie wiele mówi


zmień w pierwszym przykładzie co ci podałem TEvent na TEvent = procedure; i zobacz czy działa

#7 Maciek_

    Nowy na forum

  • Użytkownicy
  • 7 Postów:
  • Gadu-Gadu:4699314

Napisano sob, 01 wrz 2007 - 14:17

niestety pokazuje invalid procedure or function reference

#8 Iskar

    ahaha

  • Super użytkownicy
  • 679 Postów:
  • Gadu-Gadu:5199034

Napisano sob, 01 wrz 2007 - 14:38

delphi

type
  TProc = procedure;

procedure procka;
begin
  ShowMesYJ   NNĘN[YHLK][W#D&ŚV7Bf\"E&3Ś&VvŁ&6ś6ą()

 


Edit: jednak zrobiłem : p

Poza tym powinieneś przejrzeć helpa bo tam jest wszystko o wskaźnikach na funkcje/procki.

#9 Maciek_

    Nowy na forum

  • Użytkownicy
  • 7 Postów:
  • Gadu-Gadu:4699314

Napisano sob, 01 wrz 2007 - 14:46

Hihi udało sie;

nie wiedziałem że to takie proste;

dla zainteresowanych wklejam program testowy takiej operacji w Borland Turbo Pascalu:



Program test;

uses crt;

procedure Hello;
begin
writeln('Hello!');
readkey;
end;

var Hi : pointer;

Begin

Hi := @Hello;
asm
call Hi
end;
End.

#10 Brainer

    Pomocny lamer

  • Super użytkownicy
  • 568 Postów:
  • Gadu-Gadu:8325300

Napisano sob, 01 wrz 2007 - 23:40

Hehe, ten post nic nie wniesie, ale na przyszłość używaj tagów. Mianowicie "[pascal][/pascal]". smile.gif

#11 Blind

    Dzień dobry

  • Moderatorzy
  • 1057 Postów:

Napisano nie, 02 wrz 2007 - 01:09

A nie powinienes jeszcze polozyc na stos rejestrow?

#12 KKKas

    Guru

  • Super użytkownicy
  • 780 Postów:
  • Gadu-Gadu:2541640

Napisano nie, 02 wrz 2007 - 01:19

Po kiego używać tu wstawki asm jak wystarczy napisać samo 'p' dla wywołania procedury ?

Blind: A po co? Tu nie ma żadnych parametrów.

#13 Blind

    Dzień dobry

  • Moderatorzy
  • 1057 Postów:

Napisano nie, 02 wrz 2007 - 01:26

no ale jak by rejestry byly zmieniane wewnatrz procedury?

#14 Iskar

    ahaha

  • Super użytkownicy
  • 679 Postów:
  • Gadu-Gadu:5199034

Napisano nie, 02 wrz 2007 - 02:27

Cytat

Po kiego używać tu wstawki asm jak wystarczy napisać samo 'p' dla wywołania procedury ?


Autor tak chciał więc tak napisałem wink.gif

#15 KKKas

    Guru

  • Super użytkownicy
  • 780 Postów:
  • Gadu-Gadu:2541640

Napisano nie, 02 wrz 2007 - 09:42

Cytat

no ale jak by rejestry byly zmieniane wewnatrz procedury?

Nie chce mi się sprawdzać, ale na 90% jest to obsługiwane wewnątrz procedury. Tzn na jej początku odkładane są używane rejestry, a na końcu zdejmowane ze stosu.

#16 Maciek_

    Nowy na forum

  • Użytkownicy
  • 7 Postów:
  • Gadu-Gadu:4699314

Napisano nie, 02 wrz 2007 - 11:54

Witam.
borykam sie niestety jeszcze z tym problemem, bo nie do końca chodzi tak jak powinno. Wprawdzie ten Programik HELLO co napisałem pare postów temu działa bez zarzutu, ale niestety jak stosuje podobną sztuczke przy obiektach to mi sie probram wywala. tzn mam pewien obiekt, którego jednym z parametrów jest zmienna typu pointer, dajmy na to:
pascal


moj_obiekt = obiect
                     p:pointer;
       YH
[NVćCŚ&VBFW7BFW\")))OR3hhw+^2ł&ŚiqnŻ)-yćn'ĄŚz6zŹqP))ą)(


to mi wywala program.

za wszeklą pomoc dziękuję z góry

PS. Nie wystarczy napisać 'p' bo to jest TURBO PASCAL!

#17 Blind

    Dzień dobry

  • Moderatorzy
  • 1057 Postów:

Napisano nie, 02 wrz 2007 - 12:12

Jeszcze zalezy co wywolujesz, procedure czy metode, jak metode to pewnie musisz jeszcze wyslac jakies info o obiekcie do ktorego nalezy wywolywana metoda.

#18 Maciek_

    Nowy na forum

  • Użytkownicy
  • 7 Postów:
  • Gadu-Gadu:4699314

Napisano nie, 02 wrz 2007 - 13:05

zwykłą procedurka
pascal



procedure Hello;
Begin
writeln('Hello');
End;

typH[YZHYX[&6VGW&RFW7BFW\"Ń((     end;

moj_obiekt.test(pp:pointer);
begin
p:=pp;
end;

mYZY[B[[[QR&VC&Vv$TBFW7BVĆĆ$TB7F'CVćC



Uruchamiam coś w podobie i jeb.
sprawdzałem, czy to nie wina wyywoływanej procedury (bo to może w niej być jakiś błąd) ale nawet jak jest pusta to sie programik sypie.

#19 KKKas

    Guru

  • Super użytkownicy
  • 780 Postów:
  • Gadu-Gadu:2541640

Napisano nie, 02 wrz 2007 - 14:00

Cytat

PS. Nie wystarczy napisać 'p' bo to jest TURBO PASCAL!

A może:
to jest SPAAARTAAAAA!!!!!!!
? ;-)

Napisz dokładnie co chcesz uzyskać, pomyśli się. Używanie wstawek asm nie ma tutaj najmniejszego sensu. Powinieneś ogólnie użyć typów proceduralnych, a nie wskaźników do procedur.