Po kolei, z czego ma wynikać alokacja programu
czy przypadkiem nie z budowy zestawu i wykorzystania niższej pamięci programu dla procedur systemowych:)
Do alokacji kodu programu na sztywno służy opcja linkera
--code-loc <Value>
Domyślnie Wartość = 0.
Uwaga kiedy ta opcja jest użyta Tablica Vectorów podąża za wskazanym adresem
Przykładowo: --code-loc 0x8000 lub --code-loc 32768
Podobnie jest z Ramem -
Domyślnie linker 8051 umieszcza stack za ostatnią zmienną .
Opcja --stack-loc pozwala na sztywno określić początek stosu
To samo dotyczy pamięci zewnętrznej opcja --xdata-loc
ustawia początek pamięci xdataxdata oraz --xram-size określa wielkość tej pamięci.
i jeszcze
Opcja linkera --code-size określa wielkość pamięci kodu
Aby skorzystać z istniejących procedur będziesz musiał stosować wstawki asemblerowe z adresowaniem niejawnym - wyliczonym {skok ljmp, ajmp } , ponieważ podciągnięcie zapisanych na sztywno w ROMie bibliotek będzie w SDCC raczej niemożliwe
Proponowałbym dać sobie z nimi spokój i zbudować odpowiedniki w C.
Problem z sztywną alokacją w C jest dość krytyczny, bo zarówno tworzone przez ciebie jak i przez kompilator zmienne i tablice są alokowane w miarę powstawania programu i mogą ci się pokryć z zadeklarownym na sztywno początkiem stosu
Dodano po 13 [minuty]: Zazwyczaj programując w C starasz się nie bazować na asemblerze w celu uniwersalności tworzonego kodu i przenośności [mam na pyśli szkielet programu sprzętowo niezależny], ale jeśli mimo wszystko chcesz używać wstawek, nie znając budowy wewnętrzenej procedury C będziesz musiał zrzucać stan rejestrów na stos oraz przełączać banki rejestrów, a to przygniecie strukturę programu i przyspieszenie jakie ci dawał ASM
Pytanie jest prostej natury kiedy użyć a=dana; , a kiedy mov a,dana
Oczywiście trywializuję i rozumiem, że masz kupę sprawdzonych procedur w asm:).
Sdcc pozwala na odczyt listingu kompilatu w asmie

więc tam możesz podejrzeć co poszcególne optymalizacje wnoszą do kodu