Cześć, lata temu pisałem sporo w Assemblerze (6502,80286+), przez następne lata(nie pytajcie ile) ..prawie zapomniałem jak to było.
Dziś dłubię sobie trochę takich użytecznych w domu projekcików (i chyba nakupię attiny13a i attiny24 bo tanie są <2,5zł a ja mam 1000 pomysłów - tylko żona wściekła chodzi.
Mam takie pytanko:
Jak wymusić na C określony sposób przekazywania parametrów do asm, kiedyś trochę hakowałem małe programy w C na intelu to raczej zawsze szło przez stos z C (C raczej znałem tylko po łebkach wtedy).
Tutaj widzę (zaglądałem do .dump w asm) że wszystko jest pchane przez rejestry, głównie r24 i r25, a ja bym chciał tak prościutko wołać w C np. RS232_wyslij(12); zamiast ładować r24 i wołać - tak, oczywiście, to w asm czytam r24, ale czy zawsze to będzie r24? - o to chodzi, można chyba przekazać adres zmiennej z C do ASM, no ale - ale co z tym stosem? - to mnie ciekawi.
Ogólnie ten r24 mi nie przeszkadza, ale chciałbym by to (kompilacja) działało na więcej niż jednym kompie (i kompilatorze).
Ale może od początku (tak sobie to kompiluję (linux, avrdude,avr-gcc,avr-libc)
UWAGA! - wersje "mocno robocze", takie "tysiąc razy" poprawiane/testowane :
język bash
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
no i mam sobie w asm takie wysyłanie przez RS232 (sciągniete z noty ATMELA i prrzerobione na AVR-GCC) "ladowarka-ctc2.S" (duże ".S" !):
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Przepraszam - wersja robocza ze śmieciami, działa na Attiny13A (przynajmnie jeszcze niedawno hehe) - transmisja 9600n bodów, 8N1.
Tutaj mam kawałek funkcji w C:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No a teraz dump (asm):\
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
(EDIT 18.02.2016) Taka jeszcze uwaga do powyższego (akurat nie złapałem zapisu ze zmiennych 16 bit, te widoczne są uint8_t).
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Daje to mniejszy kod wynikowy w ASM względem RS_putchar( zmienna16t ) - to ładuje r24 i r25; RS_putchar( zmienna16t>>8 ) - to ładuje r24 i r25 + przepisuje r25 do r24; RS_putchar( lo8(zmienna16t) ) daje tylko ładowanie r24 (lds r24, 0xadres-zmienna16t-pierwszy-bajt).
Choc nie wiem czy dałoby się to zapisać ładniej (w C programuję mało i okazjonalnie = słabo pamiętam).
(END)
Mam jeszcze w C takie coś:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jeżeli "zarejestrowałem" w C rejest r24 to podczas kompilacji dostaję ostrzeżenia o wykorzystywaniu R24 przez C - całkiem nieźle - ale dla wiedzącego o co kaman.
A jak wymusić przekazanie przez stos?
.. przez zdefiniowanie czegoś w C inline asm? (przyznam nawet nie próbowałem tego tykać).
Czy może jest inny sposób? - zasada np. taka, zrzuca mi na stos, ja zrzucam na stos jeszcze robocze, przestawiam wskaźnik SP -(+) X bajtów parametrów, odczytuje do roboczych parametry ze stosu, robię, pobieram ze stosu wart. roboczych i wracam z procedury.
Tylko stos trochę mały
64 RAM uff.
Przepraszam za chaotyczność wypowiedzi. Ciut późno skończyłem.