Prawidłowo – chodzi o rozkazy arytmetyczno‑logiczne. To właśnie ta grupa instrukcji procesora faktycznie „przetwarza informację” i zamienia dane wejściowe na konkretny wynik. W architekturze procesora takie rozkazy określa się jako ALU‑operations (od Arithmetic Logic Unit), bo są wykonywane przez jednostkę arytmetyczno‑logiczną. Do tej grupy należą m.in. dodawanie, odejmowanie, mnożenie, dzielenie, operacje na bitach (AND, OR, XOR, NOT), przesunięcia bitowe, porównania. To one zmieniają zawartość rejestrów na podstawie dostarczonych operandów. W praktyce programistycznej, nawet jeśli piszemy w językach wysokiego poziomu, każdy algorytm na końcu i tak rozkłada się na takie właśnie podstawowe instrukcje ALU. Gdy kompilator generuje kod maszynowy, intensywne obliczenia numeryczne, kryptografia, kompresja danych czy operacje na grafice opierają się głównie na rozkazach arytmetyczno‑logicznych. Z mojego doświadczenia warto pamiętać, że te instrukcje nie tylko liczą, ale też ustawiają tzw. flagi procesora (zero, przeniesienie, znak itp.), które potem są wykorzystywane przez rozkazy skoków warunkowych. Czyli najpierw ALU coś policzy, ustawi odpowiednie bity w rejestrze flag, a dopiero później sterowanie programu może się zmienić w zależności od wyniku. W standardowych podziałach ISA (Instruction Set Architecture) producenci procesorów zawsze wydzielają osobno instrukcje arytmetyczno‑logiczne, właśnie jako tę grupę, która realnie przetwarza dane, a nie tylko je przesuwa albo steruje przepływem programu.
W tym pytaniu kluczowe jest rozróżnienie, które instrukcje procesora rzeczywiście przetwarzają dane, a które tylko sterują ich przepływem albo przebiegiem programu. Bardzo łatwo się tu pomylić, bo wszystkie te rozkazy wyglądają na „ważne” i wszystkie są potrzebne do działania programu. Jednak z punktu widzenia architektury procesora to inne kategorie. Rozkazy przesłań służą przede wszystkim do przenoszenia danych między rejestrami, pamięcią operacyjną i czasem urządzeniami wejścia/wyjścia. Typowe instrukcje MOV, LOAD, STORE kopiują bajty z jednego miejsca w inne, ale same w sobie nie zmieniają znaczenia tych danych. One nie liczą, nie porównują, nie wykonują operacji logicznych. To jest tylko logistyka danych, nie ich przetwarzanie. Kolejna grupa to rozkazy sterujące. Różnego rodzaju skoki, wywołania procedur, powroty z funkcji, instrukcje zmiany segmentu czy przerwania – one modyfikują przepływ sterowania, czyli decydują, która instrukcja będzie wykonana jako następna. Z praktyki programistycznej wiemy, że bez nich nie da się zbudować instrukcji warunkowych, pętli czy wywołań funkcji, ale one wciąż nie „zamieniają informacji na wynik”, tylko mówią procesorowi: idź w inne miejsce w kodzie. Podobnie określenie „bezwarunkowe i warunkowe” dotyczy właśnie skoków i rozkazów sterujących, gdzie warunek jest oparty na flagach procesora, ustawionych wcześniej przez inne instrukcje. To jest opis sposobu sterowania, a nie typu przetwarzania danych. Typowy błąd myślowy polega na utożsamieniu „warunkowości” z „przetwarzaniem informacji”, bo skoro coś zależy od wyniku, to wydaje się, że to tam odbywa się najważniejsze działanie. W rzeczywistości surowe przetwarzanie, czyli matematyka i logika na bitach, jest realizowane w jednostce arytmetyczno‑logicznej przez rozkazy arytmetyczno‑logiczne. Wszystkie pozostałe grupy są bardziej pomocnicze: jedne przenoszą dane, inne sterują tym, co będzie wykonane dalej, ale nie wykonują faktycznych obliczeń. Dlatego poprawna kategoria to rozkazy arytmetyczno‑logiczne.