• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak dostać się do zmiennej w funkcji z poziomu assembly?

Cloud VPS
0 głosów
395 wizyt
pytanie zadane 11 listopada 2015 w C i C++ przez jegor377 Stary wyjadacz (13,230 p.)
Siema,

Jestem dosyć mocno początkujący jeśli chodzi o asm i tak mnie ostatnio nurtuje: Jak uzyskać dostęp do zmiennych we wstawkach asm w C++ z poziomu tych wstawek? Oczywiście wiem jak uzyskać dostęp do parametrów funkcji, ale to zmiennych funkcji już nie. Może to jest w jakiś ramkach stosu czy coś? Ciekaw jestem co o tym myślicie. :D

1 odpowiedź

+1 głos
odpowiedź 12 listopada 2015 przez hit02 Nałogowiec (33,970 p.)
wybrane 12 listopada 2015 przez jegor377
 
Najlepsza

Wiele kompilatorów podchodzi inaczej do wstawek asemblera, stąd ciężko tutaj o jednoznaczną odpowiedź. Porównaj np. kompilator g++ i MSVC++.

Zazwyczaj zmienne lokalne powinny leżeć na adresach niższych niż wartość w rejestrze EBP, natomiast kompilatory potrafią optymalizować kod np. używając do adresowania rejestru ESP. Ogólnie ciężko powiedzieć, jak to będzie tak w ogólnym przypadku. (Może to mi jest poprostu ciężko, bo nie lubię wstawek bezpośrednio w kodzie C/C++.)

Moim zdaniem najprostrzym sposobem tworzenia wstawek jest oddzielna kompilacja kodu C/C++ oraz kodu asm do plików obiektowych, a następnie zlinkowanie ich razem.

Jeżeli samemu piszesz całą funkcję, to zazwyczaj zmienne lokalne będziesz trzymać w ramce stosu właśnie na adresach niższych, niż wartość w rejestrze EBP. Przykładowe odwołanie do zmiennej lokalnej powinno wyglądać np. tak:

mov eax, [ebp - 8]
komentarz 12 listopada 2015 przez jegor377 Stary wyjadacz (13,230 p.)
a ok, to dzięki :D Myślę, że jak użyję volatile dla całej funkcji to wszystko będzie tak jak trzeba. :D
komentarz 12 listopada 2015 przez hit02 Nałogowiec (33,970 p.)

O ile kompilator wykorzysta rejestr EBP (g++ chyba domyślnie go wykorzystuje) i nie poprzestawia kolejności zmiennych, to powinno być OK. laugh

komentarz 13 listopada 2015 przez jegor377 Stary wyjadacz (13,230 p.)
no, no :D :D :D :D
komentarz 13 listopada 2015 przez jegor377 Stary wyjadacz (13,230 p.)
w sumie to i tak kożystam tylko z g++ i gcc na przemian (no i czasem może borlandowe, ale tam chyba tylko różni się przekazywaniem parametrów, bo tam jest bodajże __fast_call), a MSVC++ nie dotykam, bo po prostu nie umiem zbytnio kożystać z tego tworu i nie chce mi się nawet uczyć, bo mam gcc. Myślę więc, że nie będzie z tym problemu. :D

Podobne pytania

0 głosów
1 odpowiedź 523 wizyt
0 głosów
1 odpowiedź 267 wizyt
0 głosów
1 odpowiedź 281 wizyt
pytanie zadane 17 lutego 2016 w C i C++ przez niezalogowany

93,482 zapytań

142,415 odpowiedzi

322,761 komentarzy

62,895 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...