Patrzyłem na Project Euler Problem 48 :
Seria, 1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317.
Znajdź ostatnie dziesięć cyfr serii, 1 1 + 2 2 + 3 3 + ... + 1000 1000 .
W Pythonie mogę to zrobić za pomocą jednej linii:
sum((x**x for x in xrange(1,1001))
Ale odpowiednikiem tego montażu byłoby 100 linii i prawdziwe wyzwanie.
Czy powinienem robić niektóre z tych łamigłówek w asemblerze, aby uzyskać wgląd w programowanie na niskim poziomie i zrozumieć, jak naprawdę działa komputer?
self-improvement
assembly
Nishant
źródło
źródło
*
w Pythonie?Odpowiedzi:
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
... staje się (co najmniej interesujące):
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ą.
źródło
Prawdopodobnie nie jest to konieczne, aby móc napisać asembler (z których większość zawiera szczegóły dotyczące inicjalizacji i konwencji wywoływania dla twojego systemu).
Warto to zrozumieć, na wypadek, gdybyś próbował debugować coś bez źródła.
ALE zdecydowanie warto zrozumieć maszynę przynajmniej na poziomie „C” i wskaźników (zasadniczo asemblera wysokiego poziomu), abyś wiedział, dlaczego sumowanie miliona razy w pętli jest złe.
źródło
for i in range(1000000): s = s + '.'
nie będzie (t dużo) gorsze niż „zoptymalizowane” wersje, których ponownie użyjęs
. Podobnie, kilka innych zmian unieważnia to, co jest rozsądnym założeniem ze znajomością języka C i założeniem naiwnej implementacji. Ale ogólnie jest to bardziej przydatne niż szkodliwe. Pamiętaj tylko, że implementacje językowe są czasem mądrzejsze od ciebie;)Dobre pytanie. Nauka montażu jest zdecydowanie dobra i warta wysiłku.
źródło
Tak i nie.
To prawda, że pozwoli ci lepiej zrozumieć, co robi Twój kod i dlaczego niektóre rzeczy są po prostu złym pomysłem, musisz pomyśleć o tym wysiłku.
Nauka asemblera nie jest weekendowym projektem, zajmie ci dużo czasu i musisz pomyśleć, czy ten czas można lepiej spędzić.
Jeśli nie jesteś w zoptymalizowanym kodzie, prawdopodobnie nigdy nie zobaczysz korzyści równych włożonemu wysiłkowi.
źródło
Zrobiłem dużo asemblera, kiedy byłem młodszy i nie sądzę, żeby pomogło to zrozumieć cokolwiek poza asemblerem. Jeśli spojrzysz na nowoczesny asembler, to i tak wszystko jest w języku makro. Zwykle nie znoszę analogii, ale i tak tu jest: czy wiedza o tym, jak działa silnik samochodu, czyni cię lepszym kierowcą?
źródło
Sposób, w jaki pracowałem nad zrozumieniem asemblera, polega na pisaniu programów w językach wyższego poziomu, a następnie zastępowaniu części (przynajmniej mam nadzieję) funkcjonalnie równoważnymi fragmentami złożonego kodu. Oznacza to, że mogę używać HLL do tego, co są dobre do organizowania i rozwiązywania problemów na wysokim poziomie - i używam asm do walenia metalu.
(Kiedy mówię o tym, że program hosta jest napisany w HLL, mam na myśli C lub ObjC, gdy próbuję nauczyć się asm x86_64, i BASIC, gdy pracuję na asm Z80, 6502 i 6809).
źródło