Asembler wśród programistów nie budzi zbyt wielkiej sympatii. Pewnie znasz kilka stereotypowych opinii:

  • Że jest trudny do nauki.
  • Że powstały kod jest zupełnie nieczytelny, szczególnie kiedy wracamy po pół roku.
  • Że jest przestarzały i w dzisiejszych czasach możemy się obejść bez niego.
  • Że ma inną składnię na każdą rodzinę procesorów.
  • Że poza językiem musimy mieć dużą wiedzę o architekturze danego procesora.
  • Że nie ma sensu w nim pisać całego projektu.

Co więcej – większość z tych zdań jest prawdziwa!

Ale i tak postaram się przekonać Cię, że warto nauczyć się asemblera. Oczywiście jeśli spełnimy pewne założenia. Moim zdaniem asembler nie nadaje się jako pierwszy język do nauki, ani główny język w projektach. Ale jest idealny jako uzupełnienie i tak powinieneś go traktować.

Jeżeli wolisz wersję wideo – zapraszam do oglądania:

Pozwala zrozumieć, co się dzieje pod maską

Asembler działa najbliżej sprzętu jak tylko się da. Pozwala zrobić rzeczy, których inne języki nie przewidziały. I pozwala doskonale zrozumieć, co się dzieje wewnątrz naszego procesora. To chyba największa korzyść z nauki asemblera.

W dzisiejszych czasach mówi się, że programowanie embedded to programowanie niskopoziomowe. Sam często tak mówię. I faktycznie w C czy C++ wchodzimy w interakcje ze sprzętem i piszemy bezpośrednio po pamięci. Ale w asemblerze to zupełnie inny… no właśnie – poziom.

Moim zdaniem każdy szanujący się programista (nie tylko embedded) powinien napisać coś w asemblerze. Tylko wtedy poczuje co robi kompilator, co się dzieje w rejestrach CPU, jak dane są odczytywane i zapisywane do RAMu. Dlaczego niektóre operacje są bardziej kosztowne, a inne mniej. W jaki sposób działają różne bajery takie jak cache’ówanie czy pipeline’ing.

Jeżeli nigdy nie pisaliśmy w asemblerze – po prostu tego nie czujemy. Nie wyobrażam sobie, żebym miał zrozumieć architekturę procesora i znaczenie poszczególnych elementów tak na sucho z PDFa.

Z tego założenia najwyraźniej wyszli również twórcy programów studiów na całym świecie. Dlatego w programie mamy zarówno asemblera jak i architekturę systemów komputerowych.

Czytanie kodu w asemblerze

Nawet jeśli w naszym projekcie nie piszemy nic w asemblerze – jego znajomość może się nam przydać. Dzięki niemu zobaczymy jaki kod wygenerował kompilator, jaki jest efekt działania optymalizacji, czy mamy jakieś undefined behavior.

Jeżeli śledzisz moje materiały od dawna na pewno wiesz o czym mówię. Tymi tematami zajmowaliśmy się nie raz. Zainteresowanych odsyłam do kursu C dla Zaawansowanych albo tutaj:

Ale praktycznie w każdym projekcie embedded jest chociaż jeden plik napisany w asemblerze. Czasem jest dobrze ukryty. Ale w końcu musimy jakoś wykonać te instrukcje przed wejściem do maina. Na przykład w STM32 Cube w nowoutworzonym projekcie znajdziemy wygenerowany plik startupowy w asemblerze.

To nie koniec zastosowań asemblera!

Musimy napisać coś, czego C nie potrafi

W większych komercyjnych projektach zdarzają się takie sytuacje. Na przykład kiedy chcemy napisać jakieś self-checki przed mainem. To również omawiałem kiedyś na live – zainteresowanych odsyłam tutaj:

Czasem mamy do napisania funkcje wykorzystujące specjalne instrukcje dostępne na nasz procesor, ale nie wykorzystywane domyślnie przez kompilator C. Dobrym przykładem są tu operacje bitowe.

Jeżeli znamy asemblera i mamy jedną z opisanych wyżej sytuacji w naszym projekcie  – to dla nas świetna okazja, żeby się wyróżnić. W końcu asembler jest jest trudny, nieczytelny i tak dalej. Nikt nie chce się tego tykać. A tak naprawdę kiedy złapiemy odrobinę praktyki i odczarujemy asemblera – pisze się w nim całkiem przyjemnie.

Podsumowanie

Czy opłaca się uczyć asemblera na samym początku naszej przygody z embedded? NIE! Zacznij od “wielkiej piątki”, czyli:

W ten sposób opanujesz podstawy i łatwiej Ci będzie znaleźć pierwszą pracę w embedded.

Za to jeśli myślisz o dalszym rozwoju – na przykład przeskoku na mida, czy na seniora. To już zupełnie inna rozmowa. Asembler na pewno nie zaszkodzi. Będzie jedną z całego wachlarzu umiejętności, które doświadczony programista embedded powinien opanować.

Mam wrażenie, że programiści naturalnie czują kiedy dochodzą do momentu, gdzie warto poświęcić więcej czasu na naukę asemblera. Najczęściej w pracy raz na kiedyś pojawia się temat asemblera i od niego uciekamy, staramy się oddać komuś innemu i tak dalej.

Właśnie wtedy przychodzi pora po prostu nauczyć się asemblera!

W najbliższym czasie będzie pojawiać się na moich kanałach więcej treści dotyczących asemblera. A docelowo powstanie kurs z praktycznymi przykładami na STM32.