Poza nauką asemblerową uważam, że nauka o kompilacji języka niskiego poziomu, takiego jak C, jest bardzo cenna. Więc moja odpowiedź brzmi tak, ale z drugiej strony jestem prawdopodobnie stronniczy, ponieważ lubię programować na niskim poziomie.
Na przykład po prostu zrozumienie, jak kompilowane są proste instrukcje. Następująca funkcja
int func(int val)
{
int num = val * 5;
return num;
}
... staje się (co najmniej interesujące):
movl %edi, -20(%rbp)
movl -20(%rbp), %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
Ten kod pobiera argument ze stosu (val, parametr do func), przesuwa go w lewo o 2 miejsca (pomnóż przez 2 ^ 2 lub 4), a następnie dodaje oryginalną wartość do wyniku. Końcowym wynikiem jest pomnożenie przez 5. Przykład taki ilustruje wiele rzeczy, o których należy pamiętać, takich jak optymalizacje kompilatora. Zamiast wywoływać instrukcję do bezpośredniego pomnożenia przez 5, przesuwa dwa miejsca do pomnożenia przez 4, a następnie dodaje oryginalną wartość. Znalazłem takie przykłady, aby znacznie poprawić moje rozumienie rzeczy na niższym poziomie.
Wygeneruj wyjście asemblera z gcc z -S
opcją. Należy jednak pamiętać, że wyniki będą się różnić w zależności od kompilatora i poziomu optymalizacji.
W każdym razie nie sądzę , że bycie programistą w asemblerze jest tym samym, co rozumienie asemblera . Ponownie czuję, że programowanie w języku takim jak C i wiedza o tym, jak można go wprowadzić do kodu maszynowego, jest cenną praktyką.