Czy warto uczyć się języka asemblera? [Zamknięte]

97

Czy nadal warto uczyć się ASM ?

Wiem trochę o tym, ale tak naprawdę nie używałem go ani nie nauczyłem się go poprawnie, ponieważ wszystko, czego nauczyłem się w asemblerze, mogę zrobić w 1/10 raz w jakimś języku, takim jak C lub C ++. Czy więc naprawdę powinienem się uczyć i używać ASM? Czy to mi się przyda zawodowo? Czy zwiększy to moją zaradność? Krótko mówiąc, czy uczyniłoby mnie to lepszym programistą?

Uwaga: mówię o montażu niskopoziomowym, takim jak FASM lub NASM, a nie o czymś takim jak HLA (High-Level Assembler).

ApprenticeHacker
źródło
2
Zauważ, że język asemblera jest powiązany z procesorem / kontrolerem.
rmflow,
7
Masz na myśli to, że to nie jest wieloplatformowe? !!
ApprenticeHacker,
Nie. Na przykład: worldofspectrum.org/Z80instructions.html
rmflow
2
Ok, więc dla każdego procesora jest inny język asemblera ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker
4
Inny język asemblera dla każdej rodziny procesorów. Kod 386 działa na każdym późniejszym procesorze x86, w tym na ofertach Intela i AMD - ale niektóre zestawy funkcji są rozszerzeniami zastrzeżonymi. Język jest taki sam dla tych dodatkowych instrukcji ale wynikające binarny nie będzie przenośny.
spraff

Odpowiedzi:

109

Nauczyłem się z książki Kipa Irvine'a . Jeśli zignorujesz (uczciwą) krytykę jego (nieistotnych) bibliotek, mogę polecić go jako dobre wprowadzenie do samego języka - chociaż dla naprawdę interesujących rzeczy musisz polować na obsesje w sieci.

Myślę, że warto zrozumieć, co dzieje się na niższych poziomach. Podczas badania asemblera dowiesz się o tworzeniu potoków procesora, przewidywaniu gałęzi, wyrównaniu pamięci podręcznej, SIMD, zmianie kolejności instrukcji i tak dalej. Znajomość tych elementów pomoże Ci napisać lepszy kod wysokiego poziomu.

Ponadto, konwencjonalna opinia jest taka, aby przez większość czasu nie próbować ręcznie optymalizować asemblacji, ale pozwolić kompilatorowi się tym martwić. Kiedy zobaczysz przykłady pokręconych rzeczy, które generują kompilatory, lepiej zrozumiesz, dlaczego konwencjonalna mądrość się utrzymuje.

Przykład: LFSR działa szybko z instrukcją rotate-with-carry, w szczególnych przypadkach, takich jak ten, tak łatwo jest napisać wersję asemblera, jak odkryć, czy kompilator jest wystarczająco inteligentny, aby to rozgryźć. Czasami po prostu wiesz coś , czego nie ma kompilator.

Zwiększa również zrozumienie kwestii bezpieczeństwa - zapisu lub wykonania, przepełnienia stosu itp.

Niektóre problemy ze współbieżnością stają się widoczne tylko wtedy, gdy wiesz, co dzieje się na poziomie instrukcji.

Może to być przydatne czasami podczas debugowania, jeśli nie masz pełnego kodu źródłowego.

Jest wartość ciekawości. W jaki sposób realizowane są funkcje wirtualne? Czy kiedykolwiek próbowałeś pisać programy DirectX lub COM w asemblerze? W jaki sposób zwracane są duże struktury, czy funkcja wywołująca oferuje dla nich miejsce lub odwrotnie?

Są też specjalne języki asemblera dla sprzętu graficznego, chociaż języki shaderów osiągnęły wysoki poziom kilka lat temu, wszystko, co pozwala myśleć o problemie w inny sposób, jest dobre.

spraff
źródło
7
Dobrze napisana odpowiedź +1. Uczenie się i używanie to dwie różne rzeczy, uczenie się tego jest dobrym pomysłem, kiedy / czy jej użycie wiąże się z doświadczeniem.
old_timer
Aby dać przykład, Linus Torvalds używa dezasemblera do debugowania swojego kodu, więc myślę, że ma dobrą znajomość asemblera x86.
Ivanzinho
55

Uważam za interesujące, że tak wielu ludzi podskakuje, by powiedzieć, że tak, potrzebujesz / powinieneś nauczyć się montażu. Dla mnie pytanie, ile montażu potrzebujesz wiedzieć? Myślę, że nie musisz znać asemblera jak języka programowania, to znaczy nie uważam, że każdy powinien umieć napisać program w asemblerze, ale z drugiej strony, będąc w stanie go przeczytać i zrozumieć, co to właściwie jest środki (które mogą wymagać większej wiedzy o architekturze niż asembler) są wystarczające.

Na pewno nie potrafię napisać asemblera (czyli napisać dowolny nietrywialny fragment kodu w asemblerze), ale potrafię go przeczytać i że wraz ze znajomością rzeczywistej architektury sprzętu i stosowanych konwencji wywoływania wystarczy do analizy wydajności, i zidentyfikować, który fragment kodu C ++ był źródłem tego zestawu.

David Rodríguez - dribeas
źródło
4
Masz na myśli, że powinienem po prostu nauczyć się podstawowych poleceń push, pop, mov i invoke ?
ApprenticeHacker
10
Zgadzam się, potrzeba znajomości asemblera zależy w dużej mierze od tego, z jaką gałęzią programistyczną się pracuje. Sieć / komputer / baza danych? Zapomnij o assemblerze. Gry komputerowe i grafika? Może się przydać. Rozwój systemu operacyjnego czy systemy wbudowane w czasie rzeczywistym? To konieczność. I tak dalej.
Lundin,
1
Przekręcasz inne odpowiedzi - nikt nie mówi, że potrzebujesz / powinieneś uczyć się montażu; tylko, że jest to przydatne lub warte zachodu, zgodnie z pytaniem. Twoja odpowiedź jest jednak nadal aktualna.
Luc Danton
1
@burningprodigy: Uważam, że powinieneś mieć podstawową wiedzę o tym, jak instrukcje są w asemblerze, którego używasz (tj. jaka jest kolejność argumentów i tym podobne), i bardzo podstawowe zrozumienie kilku poleceń, co za obciążenie lub sklep. Następnie, jeśli chcesz przyjrzeć się jakimś elementom zespołu, możesz użyć odniesienia, aby zrozumieć każdą z instrukcji, a robiąc to, zaczniesz uczyć się podstaw, których potrzebujesz.
David Rodríguez - dribeas
1
Zgadzam się. Zwłaszcza znajomość montażu niewiele da Ci w najlepszym przypadku oceny wydajności nowoczesnych procesorów. Jeśli taki jest cel, odrobina podstawowej wiedzy na temat asemblera ze sporym udziałem podstaw architektur komputerów jest o wiele bardziej przydatna. Najczęściej potrzebuję asemblera, to przeglądanie zrzutów zoptymalizowanych programów lub dla zabawy (np. Bezpieczeństwo, pisanie mini jądra, ...). Ale nie pamiętam, kiedy ostatnio zmieniłem jakąś decyzję projektową ze względu na wiedzę montażową.
Voo
28

Tak - głównym powodem uczenia się asemblera dla programistów C i C ++ jest to, że pomaga zrozumieć, co się dzieje pod maską kodu C i C ++. Nie chodzi o to, że faktycznie będziesz pisać kod w asemblerze, ale będziesz mógł przyjrzeć się dezasemblacji kodu, aby ocenić jego wydajność i zrozumiesz, jak różne funkcje C i C ++ działają znacznie lepiej.

ostry
źródło
24

Warto nauczyć się wielu różnych języków, z wielu różnych paradygmatów. Nauka języków Java, C ++, C # i Python się nie liczy, ponieważ wszystkie są instancjami tego samego paradygmatu.

Ponieważ asembler jest u podstaw (no cóż, blisko korzenia) wszystkich języków, z jednej strony twierdzę, że warto się nauczyć asemblera.

Z drugiej strony warto nauczyć się funkcjonalnego języka programowania, programowania logicznego, języków skryptowych, języków opartych na matematyce. Masz tylko tyle czasu, że musisz wybierać.

David Hammen
źródło
A potem, kiedy w końcu nauczyli je wszystkie i że masz wgląd w to, co się dzieje, można odkryć J .
Micha Wiedenmann
4

Znajomość ASM jest również przydatna podczas debugowania, ponieważ czasami wszystko, co masz, to „zrzut ASM błędu”.

ain
źródło
2

Czy masz z tego jakiś pożytek w tym, co planujesz zrobić? czy pomoże ci to w jakikolwiek sposób w tym, co obecnie robisz lub planujesz zrobić? to są dwa pytania, które powinieneś sobie zadać, odpowiedź na nie jest odpowiedzią na twoje pytanie.

W bardziej ogólnym sensie, tak, powiedziałbym, że moim zdaniem warto się uczyć asm (coś takiego jak x86 lub arm), jak dobrze ci to służy, zależy od tego, co programujesz i jak go debugujesz.

Necrolis
źródło
2

W zależności od poziomu programowania, który chcesz osiągnąć. Jeśli potrzebujesz pracować z debuggerami, to TAK. Jeśli chcesz wiedzieć, jak działają kompilatory, to TAK. Każdy asembler / debugger jest zależny od procesora, więc jest dużo pracy, po prostu sprawdź rodzinę x86, jak duża i stara jest.

GJ.
źródło
Może masz na myśli zależność od rodziny procesorów?
Romeno