[#2]
Re: jak zrobić wstawkę asm w c ?
@asman,
post #1
Wiem jak to dobrze zrobić w Dice C.
Więc w Dice C: powiedzmy, że chcesz stworzyć funkcję w asemblerze MyFunction(), która pobiera dwie liczby całkowite i zwraca wartość całkowitą:
Jeśli argumenty mają być na stosie wpisujesz prototyp:
int MyFunction(int x, int y);
Jeśli argumenty mają być w rejestrach powiedzmy D0 i D1 wpisujesz:
__regargs __saveds int MyFuntion(register __d0 int x, register __d1 int y);
Teraz jak to wygląda w asemblerze:
Tworzysz identyfikator _MyFunction poprzez ( oznacza tabulację)
XDEF _MyFunction
zaś ciało procedury jeśli argumenty są na stosie wygląda w ten sposób:
_MyFunction:
; Tutaj odkładasz według konwencji zmienne na stos inne niż D0, D1, A0, A1, np. gdy używasz tylko np. D2 to wpisz:
MOVE.L D2,-(A7)
; Tutaj pobierasz argumenty ze stosu. Zauważ, że do wskaźnika stosu trzeba dodać 4 (jest tam przechowywany adres zwrotny funkcji) oraz przestrzeń jaką użyłeś by odłożyć rejestry w poprzedniej komendzie, w tym wypadku 4 (odłożyliśmy tylko rejestr D2).
MOVE.L 8(A7),D0
MOVE.L 12(A7),D1
Teraz w D0 i D1 mamy argumenty funkcji. W Dice C mają one zawsze rozmiar długiego słowa niezależnie od wielkości zmiennej. Na końcu funkcji musisz też oczywiście przywrócić starą wartość zmiennej D2 poprzez:
MOVE.L (A7)+,D2
RTS
Jeśli argumenty są w rejestrach to sprawa jest znacznie prostsza.
W pierwszym wypadku można też użyć ramki stosu poprzez polecenie LINK.W Ax,# i dostać się do argumentów i zmiennych lokalnych poprzez indeksowanie rejestru Ax.
Mam nadzieję, że pomogłem :) Pisz śmiało jeśli coś niejasne.
Ostatnia modyfikacja: 01.12.2009 17:54:04