[#1] jak zrobić wstawkę asm w c ?
Witam,

Pytanie jak w temacie, interesuje mnie głównie kompilator gcc z amidevcpp, ale nie pogardzę jak to jest w innych ( sas, vbcc i inne ) Każda "szalona" propozycja mile widziana.

Pozdrawiam

[#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
[#3] Re: jak zrobić wstawkę asm w c ?

@Minniat, post #2

Minniat napisał(a):

> Wiem jak to dobrze zrobić w Dice C.

Przyklad ktory podales to nie jest wstawka asm w C, tylko linkowanie kodu w C z kodem napisanym w ASM... :)

[#4] Re: jak zrobić wstawkę asm w c ?

@asman, post #1

Witam,

@Minniat, szuler
Dzięki bardzo za odpowiedzi.


W gcc z tego co się zorientowałem można zrobić wstawkę za pomocą
asm ( trywialny przykład asm( "nop" ). Tylko denerwuje mnie ramka stosu która jest dokładana. Przykładzik.

void foo( void );

int main( void )
{
    foo();

    return 0;
}

void foo( void )
{
    asm( "nop" );
}


generuje taki kod:

#NO_APP
	.text
	.even
	.globl	_main
_main:
	link a5,#0
	jbsr ___main
	jbsr _foo
	moveq #0,d0
	unlk a5
	rts
	.even
	.globl	_foo
_foo:
	link a5,#0
#APP
	nop
#NO_APP
	unlk a5
	rts


Czy ktoś wie jak ją wywalić w gcc ( czyli wywalić link a5,#0 i unlk a5 ) ? Na ten przykład w Code Warrior jest opcja nofralloc, która to czyni ( może dlatego Code Warrior jest taki dobry ;) ).

[#5] Re: jak zrobić wstawkę asm w c ?

@asman, post #4

na przyklad -fomit-frame-pointer ?

[#6] Re: jak zrobić wstawkę asm w c ?

@szuler, post #5

pokłony

z opcją -fomit-frame-pointer nie ma ramki stosu. Dzięki

#NO_APP
	.text
	.even
	.globl	_main
_main:
	jbsr ___main
	jbsr _foo
	moveq #0,d0
	rts
	.even
	.globl	_foo
_foo:
#APP
	nop
#NO_APP
	rts


Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem