avr-gcc, wstawki asemblerowe

Jun 14, 2005 4 Replies

Mam tablice: unsigned char *P; i chcialbym przebiec po niej wskaznikiem Z, ale nie potrafie podstawic wskaznika tablicy pod rejestr. Probuje to zrobic tak: asm (" ldi r30, P "); No ale zostaje jeszcze starszy byte adresu tablicy P, ktory trzeba podstawic pod r31.Czy ktos wie jak to zrobic ? Probowalem rowniez tak: asm (" ldi r30, low(P) "); asm (" ldi r30, high(P) "); ...ale kompilator nie wie co to low i high.



pozdrawiam gr



Strzelam: a mo¿e by tak? asm (" ldi r30,#low(P) "); asm (" ldi r30,#high(P) ");

dziadek Ben

dziadek Ben snipped-for-privacy@op.pl napisał(a):

..

Ja też ;) asm("ldi r30,lo8(P)"); asm("ldi r30,hi8(P)");

Piotrek

dziadek Ben snipped-for-privacy@op.pl napisał(a):

..

Ja też ;) asm("ldi r30,lo8(P)"); asm("ldi r31,hi8(P)");

Piotrek

Lepiej będzie jak napiszesz całą funkcję w asemblerze i przekażesz do niej wskaźnik jako parametr. Przy takim kodzie jak podałeś, to nawet nie ma pewności, czy wskaźnik będzie fizycznie istniał w jakiejkolwiek komórce pamięci, rejestrze. Np. taki kod

P=(unsigned char *)128; *(++P)=8; *(++P)=9;

daje w wyniku (przy optymalizacji na rozmiar): .LM4: ldi r24,lo8(8) sts 129,r24 .LM5: ldi r24,lo8(9) sts 130,r24

czyli wskaźnik tak naprawdę nie istnieje :-), a na pewno nie jest przekazywany asemblerowi jako stała P, tylko jako liczba i nie bardzo można użyć wyrażenia lo8/hi8(P).

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required