Jestem studentem, świeżym w programowaniu i uwielbiającym go, od Javy do C ++ i do C. Przesunąłem się wstecz na gołe kości i pomyślałem, że pójdę dalej do Zgromadzenia.
Ku mojemu zdziwieniu wiele osób twierdziło, że nie jest tak szybki jak C i nie ma sensu. Zasugerowali nauczenie się programowania jądra lub pisania kompilatora C. Moim marzeniem jest nauczyć się programować w formacie binarnym (kod maszynowy), a może programować goły metal (programować mikrokontroler fizycznie) lub pisać bios, programy ładujące rozruch lub coś podobnego.
Jedyną możliwą rzeczą, jaką usłyszałem po tylu badaniach, jest to, że edytor szesnastkowy jest najbardziej zbliżony do języka maszynowego, jaki mogłem znaleźć w obecnej epoce. Czy są jeszcze inne rzeczy, o których nie wiem? Czy są jakieś zasoby do nauki programowania w kodzie maszynowym? Najlepiej na 8-bitowym mikrokontrolerze / mikroprocesorze.
To pytanie jest podobne do mojego, ale interesuje mnie najpierw praktyczne uczenie się, a następnie zrozumienie teorii.
źródło
program bare metal
każdym razem, gdy wykopuję skrzynkę serwera. Działa cuda!Odpowiedzi:
Ludzie nie programują w kodzie maszynowym (chyba że są masochistyczni). Używają (lub rozwijają) narzędzi do generowania kodu maszynowego (kompilatora lub asemblera, w tym narzędzi do programowania wieloprogramowego), a może bibliotek generujących kod maszynowy (LLVM, libjit, GNU lightning, ...). Dlatego istotne są również zasoby dotyczące generowania kodu maszynowego, kompilacji, optymalizatorów i mikroarchitektur.
I bardzo często dobry kompilator optymalizujący generuje lepszy kod maszynowy niż jest to możliwe. Prawdopodobnie nie będziesz w stanie napisać 200-liniowego kodu asemblera lepiej niż dobry optymalizator.
Jeśli chcesz zrozumieć kod maszynowy, najpierw naucz się montażu. Jest bardzo zbliżony do kodu maszynowego. Używaj go mądrze, tylko do rzeczy, których nie możesz kodować w C (lub w języku wyższego poziomu, takim jak Ocaml, Haskell, Common Lisp, Scala). Dobrym sposobem jest często stosowanie
asm
instrukcji (zwłaszcza funkcji rozszerzonego zestawu GCC ) wewnątrz funkcji C.gcc -S -O2 -fverbose-asm
Pomocny może być również odczyt kodu asemblera (wygenerowanego przez ).Linux Assembly HowTo jest dobrą rzeczą, aby czytać.
Architektura zestawu instrukcji bieżącego procesora (tj. Zestawu instrukcji rozumianych przez układ) jest dość złożona. Najczęstsze z nich to x86 (typowy komputer w trybie 32-bitowym), X86-64 (komputer stacjonarny w trybie 64-bitowym), ARM (smartfony, ...), PowerPC itp. Wszystkie są dość złożone (ze względu na historyczny i ekonomiczny powody). Być może nauczenie się najpierw zestawu instrukcji hipotetycznych, takich jak np . MMIX Knutha, jest prostsze.
źródło
Jak już wspomniano wcześniej Learn Assembly .
Więc Zgromadzenie jest
symbolic representation of machine code
.Być może teraz pytasz: „Ok, więc jak się tego wszystkiego nauczyć?” Tak się cieszę, że zapytałeś:
źródło
Zdecydowanie sugeruję ponowne przemyślenie celu i oto dlaczego:
Najpierw nauczyłem się 6502 asemblera na mikrokomputerze BBC (model B, 32K). Miał niesamowitą implementację BASIC, która zawierała asembler makr. Mieliśmy je w szkole, więc napisałem wszelkiego rodzaju złośliwe programy, które robią takie rzeczy, jak bezpośrednia manipulacja buforem ekranu, aby Lemming przechodził przez każdy ekran, dookoła pokoju (były połączone w sieć), jeśli maszyny nie były używane przez 10 minut . Spowodowało to napady chichotów wśród moich przyjaciół z Roku 7.
Kiedy dostałem Commodore 64 w domu, dowiedziałem się, że ma procesor 6510, który również obsługuje język asemblera 6502, ale z kilkoma interesującymi dodatkami. Musiałem kupić asembler (przyszedł na kartridż ) i wywoływać programy przez BASIC. Mając wielkie wizje pisania najlepiej sprzedającej się gry, w końcu udało mi się stworzyć kilka wersji demonstracyjnych, w których rejestracja bitów sprzętu wideo rejestruje się w przerwach, aby uzyskać ciekawe efekty w paskach kolorów, które animowały funkową muzykę chipową. Imponujące, ale niezbyt przydatne.
Następnie dostałem Acorn Archimedes A310, który miał procesor ARM2, więc użyłem tej samej niesamowitej implementacji BASIC z wbudowanym asemblerem makr jak BBC Micro (to samo dziedzictwo). Udało mi się zebrać kilka gier, do których znajomy artysta dostarczył grafikę, a także kilka trippy demo opartych na sinusoidach. Oba te programy były ciężkie do zaprogramowania, a zły kod mógł zepsuć maszynę (przypadkowo wyzerować rejestr resetowania sprzętu itp.), Tracąc wszystko, gdybym nie zapisał (do dyskietki!).
Na uniwersytecie zapoznałem się z C ++, a tym samym C. Mogłem używać go do programowania Sun / Solaris i innych dużych komputerów mainframe. Nie mam pojęcia, na jakich architekturach procesorów działały te maszyny - nigdy nie potrzebowałem używać asemblera ani czytać kodu maszynowego, ponieważ narzędzia C ++ dały mi moc potrzebną do tworzenia profesjonalnych aplikacji.
Po Uni pracowałem na Windowsie i kilku wersjach Uniksa. C i C ++ działały na wszystkich tych maszynach i ostatecznie Java też.
Następnie pracowałem w systemie Windows i Dreamcast przy użyciu C ++ z DirectX z kompleksowym łańcuchem narzędzi do debugowania.
Następnie podjąłem pracę z chipsetami opartymi na ARM dla telewizorów Smart TV (w 2000 r.). Chociaż moje doświadczenie z ARM2 mogło być tutaj istotne, praca była oparta na C. Przekonałem się, że całe szarpanie się sprzętem, który zrobiłem na Archimedesie, można również wykonać w C przy użyciu prostych operacji kruszenia bitów. Częścią mojej roli była migracja bazy kodu do Windows, Playstation 2, Linux, innych telewizorów i mikroukładów mobilnych. Wszystkie te platformy były dostępne zarówno z kompilatorem C (często GCC), jak i pewnym poziomem API do zapisu na maszynie bazowej - osadzony świat rzadko jest O / S jądra. Nigdy nie potrzebowałem znać pełnego kodu maszynowego dla żadnej konkretnej platformy poza napisaniem programu ładującego i mini-BIOS, które to przyskoczyły do kodu C przy pierwszej dostępnej okazji (po skonfigurowaniu wektorów pułapek,
Kolejnym zadaniem była praca z C ++, C # i JavaScript w systemie Windows. Brak kodu maszynowego.
Obecne zadanie polega na pracy z C ++, JavaScript, Python, LUA, HTML i innymi językami na różnych platformach. Nie mam pojęcia, jaki kod maszynowy obsługują te platformy, ani nie muszę wiedzieć - kompilator tłumaczy nasz kod na wszystko, co musi być. Jeśli ulega awarii, wychwytuję błąd w debuggerze lub poprzez diagnostykę środowiska wykonawczego (wyjątki, sygnały itp.).
Dla zabawy tworzę aplikacje na iOS w wolnym czasie, który mam w domu. Wykorzystuje Objective-C i API, które działa na wielu chipsetach. Najwyraźniej są oparte na ARM, ale nigdy nie widziałem żadnego kodu maszynowego w moim rozwoju.
Chociaż jest to „fascynujące ćwiczenie do nauki języka asemblera”, obecnie dostępne są narzędzia i języki wyższego poziomu, które pozwalają zwiększyć produktywność o rząd wielkości (lub dwa).
Liczba ofert pracy dostępnych dla niesamowitego programisty języka asemblera / kodu maszynowego jest znikoma w porównaniu do czegoś takiego jak JavaScript, Java, C #, C ++ lub ObjC.
Radziłbym, aby uczynić to hobby, a nie głównym celem.
źródło
Moja sugestia? Naucz się MIPS i dowiedz się, jak zbudować (prosty) procesor MIPS. To jest rzeczywiście łatwiejsze niż się wydaje.
Przewagą MIPS nad innymi architekturami jest prostota. Nie wpadniesz w tonę drobnych szczegółów, ale nadal poznasz wszystkie wielkie pomysły potrzebne do pisania kodu w innych architekturach.
Nawiasem mówiąc, był to ostatni projekt mojej (trzeciej) intro klasy CS. Jeśli chcesz, możesz przeczytać zadanie i przeglądać wykłady jako filmy lub slajdy .
Między innymi, my zrobiliśmy pokrywę jak kod MIPS zostaje przekształcony binarny; musieliśmy nawet zdekodować niektóre (bardzo proste) kody maszynowe na egzaminach.
Nawet jeśli nie chcesz omawiać wszystkiego, większość wykładów wygłosił jeden z ulubionych wykładowców studentów i oglądanie ich z przyjemnością.
źródło
Doskonała ścieżka do podjęcia. Mój skok (upadek?) Z C na Zgromadzenie i niższy to kurs uniwersytecki Organizacja i projektowanie komputerowe , oparty na książce o tej samej nazwie.
Gorąco polecam tę książkę w pierwszych rozdziałach na temat podstawowego zestawu MIPS, aż do tworzenia potoków i architektury pamięci. Jeszcze lepiej byłoby zorganizować kurs na ten sam temat lub znaleźć wykłady online.
Zobacz także MARS MIPS Simulator, aby zabrudzić ręce podczas pisania.
źródło
Jeśli chcesz zrozumieć, w jaki sposób maszyna działa całkowicie, dlaczego nie pójdziesz na najniższy możliwy poziom i nie zbudujesz swojej drogi do miejsca, w którym się znajdujesz (np. C, C ++)?
Rozumiem przez to: dlaczego nie zbudujesz własnego 4-bitowego sumatora z tranzystorami w obwodzie (po prostu Google, jeśli szukasz instrukcji / samouczka)?
Następnie zbuduj mały komputer z pamięcią RAM, a następnie rozpocznij naukę asemblera i napisz z nim program lub dwa.
źródło
Mam zestaw instrukcji, który został do tego stworzony, symulator i kilka samouczków na temat podstaw, jedna instrukcja lub koncepcja na lekcję. Wystarczy wpisać program, uruchomić go, a następnie dowiedzieć się, co robi, i przejść do następnej lekcji.
http://www.github.com/dwelch67/lsasim
Mam również symulatory dla kilku zestawów instrukcji głównego nurtu. Dowolne lub wszystkie z nich nadają się do użycia do nauki asm (jeśli naprawdę czujesz, że musisz nauczyć się x86, naucz się tego na końcu i użyj symulatora takiego jak ten, który rozwidliłem, najpierw 8088/86, a następnie przejdź do przodu). Uczenie się na symulatorze ma wady i zalety, jednym z głównych profesjonalistów, szczególnie na początku, jest to, że niczego nie rozbiłeś i masz doskonałą widoczność. Wskakując najpierw na wbudowaną platformę, mikrokontroler itp., Aby nauczyć się nowego zestawu instrukcji, musisz pokonać przeszkody związane z niemożnością zobaczenia, co się dzieje, co prowadzi do długiej listy sposobów na porażkę ...
źródło
Kod Charlesa Petzolda jest bardzo dobrym wprowadzeniem do tematu i opisuje proces budowy komputera, w tym sposób konstruowania dodatków, liczników i macierzy RAM oraz wprowadza kod maszynowy i język asemblera oraz ich związek z językami wyższego poziomu. To także świetna lektura na temat historii komputerów.
Właśnie przeczytałem to pytanie na temat electronic.stackexchange, które również mogą się przydać
źródło
Do nauki języka programowania i programowania
można użyć oprogramowania MASM.
W przypadku MASM można użyć następującego łącza.
http://en.wikipedia.org/wiki/Microsoft_Macro_Assembler
http://www.microsoft.com/en-us/download/details.aspx?id=12654
źródło