Pozycja parametrów funkcji na stosie.

0

Potrzebuję napisać program w C++ w którym używam funkcji napisanej w Assemblerze.
Zaraz po wejściu do funkcji już w assemblerze wykonuje:

push ebp
mov ebp, esp

Gdy oba parametry są typu int to znajdują się w tym momencie na pozycjach [ebp+8] pierwszy parametr, [ebp+12] drugi parametr.

extern "C" double funkcja (int, int);

Gdy oba parametry są typu double to znajdują się chyba na [ebp+8] pierwszy, [ebp+16] drugi? Tak wpisałem i program działa niby dobrze.

extern "C" double funkcja (double, double);

Problem jest taki że chciałbym aby moja funkcja przyjmowała jako pierwszy parametr typ double a drugi int i teraz nie wiem jak będzie wyglądał stos.

extern "C" double funkcja (double, int);

Wpisywałem różne wartości dla tego drugiego parametru i nigdy nie mogłem dostać poprawnego wyniku.
Pierwszy nadal jest na [ebp+8] ale gdzie jest drugi?

1

U mnie to wyglada, ze jest na +8, +16, ale jako, ze to assembler to polecam napisac jakas funkcyjke nawet nic nie robiaca w cpp i za pomoca kompilatora wygenerowac kod w assmie, wtedy bedziesz mial jako taka pewnosc.

0

Gdzie są parametry to teoretycznie można wyliczyć, ale jak już potrzebuję to szukam na chybił-trafił w [ebp±ileś] i zawsze gdzieś się znajdzie :-)
(a czasem są w rejestrach…)

0

można też adresować zmiennej wg ESP dzięki temu zaoszczędzimy rejestr EBP co się przyda w lepszej optymalizacji programu

0

Tylko że esp może się zmieniać, więc jest trudniej ręcznie nad tym zapanować. Ale już kompilator może automatycznie śledzić co się dzieje ze stosem, i odwoływać się do parametrów i zmiennych lokalnych za pomocą esp.

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