Skocz do zawartości
Maciek_

Wywoływanie procedury

Polecane posty

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ć?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
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;

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
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

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

type
 TProc = procedure;

procedure procka;
begin
 ShowMesYJ   NNĘN[YHLK]XĘ[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.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Po kiego używać tu wstawki asm jak wystarczy napisać samo 'p' dla wywołania procedury ?

 

Autor tak chciał więc tak napisałem ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
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.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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:

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!

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

zwykłą procedurka


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.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
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.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

×