Widocznosc nazw zmiennych w metodach klasy(asm)

0

Witam

Moj problem wyglada nastepujaco: stworzylem metode okreslonej klasy, w ktorej posilkuje sie asemblerem. - Okazuje sie ze we wnetrzu wstawki asemblerowej zmienne klasy przestaja byc widoczne.

Np.:

class JakasKlasa
{
private:
void JakasMetoda();
int liczba;
};

void JakasKlasa::JakasMetoda()
{
asm
{
mov eax, liczba //w tej lini jest blad Expression Syntax
}
}

Drobna zmiana pozwala wyeliminowac ten problem

void JakasKlasa::JakasMetoda()
{
int tmpLiczba=liczba;
asm
{
mov eax, tmpLiczba //teraz jest wszystko dobrze
}
}

Jednak z pewnych wzgledow wole pierwsze rozwiazanie - pytanie jak to naprawic.
(nie wiem moze jakis kwalifikator zakresu z nazwa macierzystej klasy, albo cos podobnego)

0

nie przestaja byc widoczne. tylko trzeba troche pomyslec. uzyc this czy inaczej rozebrac samodzielnie klase na kawalki, albo zdac sie na optymalizacje jakie proponuje sam kompilator i pisac wszystko w c. poza tym, jesli nie chcesz rozbierac klasy na kawalki, to zakombinuj np. ze wskaznikami :

{
  void* p=&zmienna;
  mov ebx,[p]
  mov eax,dword ptr [ebx]
  ; ...
}

problem jest tego rodzaju, ze domyslnie rozwijane sa do this->zmienna a uzywajac asemblera musisz zrobic to sam, poniewaz kompilator nie pilnuje tego czy i jak uzywasz rejestrow, na ktorych on ma wykonac operacje obliczenia adresu. ten kawalek kodu musisz napisac sam. albo jak wyzej zdajesz sie na kompilator (warto, bo kod sie robi duzo bardziej przenosny, przy prawie badz zadnej stracie na szybkosci), albo obchodzisz problem poprzez uzycie zmiennej lokalnej.

0

W borlandzie (i chyba w VC) to przechodzi:

void JakasKlasa::JakasMetoda()
{
  asm
  {
    mov ebx,this 
    mov eax, [ebx].(JakasKlasa)liczba
  }
}
0

o tak wlasnie tego bylo mi potrzeba

  mov eax, this.liczba

dziala idealnie

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