Call z inline assembly do metody obiektu klasy

0

Witam

Chce wywołać z __asm metodę z:

 
class Test
{
public:
    void napisz(void)
};

Utworzyłem sobie globalny obiekt klasy z ta metodą. Jak to zrobić w assemblerze? Jaki jest adres metody względem adresu obiektu? W obiektach klasy jest tylko adres do metody, a metoda pobiera adres obiektu żeby mogła używać atrybutów czy jak to jest zrobione od strony assemblera?

1
  1. Wcale nie chcesz. A jeśli już to zrób w tym C++ wskaźnik do tej metody i potem z asma go tylko wywołaj. Oszczędź sobie bólu :P
  2. gcc -S twoim przyjacielem ;)
1

i nawet call do &obiekt + &Test::napisz crashuje;

Metody niestatyczne pobierają niejawny pierwszy parametr this. Przekazałeś go?

tak to wygląda w kodzie:

void Test::napisz(void);

a tak jest naprawdę:

void Test::napisz(Test* this);

jeszcze do tego dochodzi „manglowanie” nazw metod.

Spróbuj najpierw z metodą statyczną, w takich nie ma this.

0

Teraz już wszystko działa i z metodami statycznymi i z obiektem klasy jak podałem parametr this.

Dla innych potrzebujących napiszę:

  • wywołanie statycznej metody:
 
_asm{
mov eax, offset NazwaKlasy::NazwaStatycznejMetody

/* Tutaj odkladamy na stos parametry metody w kolejności od końca */

call eax

/* Tutaj trzeba jeszcze posprzątać stos po parametrach chyba, że metoda będzie wywoływana konwencją __stdcall */
pop ebx
}
  • do wywolania metody obiektu:
 
__asm{
mov eax, offset NazwaKlasy::NazwaMetody

/* Tutaj odkladamy na stos parametry metody w kolejności od końca */

push offset ObiektKlasy
call eax

/* Tutaj trzeba jeszcze posprzątać stos po parametrach chyba, że metoda będzie wywoływana konwencją __stdcall */
pop ebx
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1