Zasoby na temat nauki programowania w kodzie maszynowym? [Zamknięte]

24

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.

AceofSpades
źródło
2
Na czym dokładnie polega problem? Jeśli pytasz, czy można kodować w kodzie maszynowym, odpowiedź brzmi prawdopodobnie „tak”. Jeśli pytasz o samouczki, a) wyjaśnij, że to jest twoje pytanie, ale b) nie jest to pytanie konstruktywne.
ChrisF
6
Czy C nie jest wystarczająco metalowy?
Tom Squires,
6
Za program bare metalkażdym razem, gdy wykopuję skrzynkę serwera. Działa cuda!
yannis,
7
Czy kiedykolwiek myślałeś o pójściu jeszcze dalej? Włam swój procesor: opencores.org
SK-logic
3
@ SK-logic, tak, programowanie kodu maszynowego stałoby się niemożliwe po około 1 godzinie. Masz rację, lepszym i bardziej produktywnym pomysłem jest przejście do implementacji procesora. Istnieją również wirtualne wersje 6502 ( visual6502.org ), a także ludzie, którzy mają lub chcą zbudować procesory przy użyciu nowoczesnej dyskretnej logiki ( bradrodriguez.com/papers/piscedpis2.htm )
Angelo,

Odpowiedzi:

27

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 asminstrukcji (zwłaszcza funkcji rozszerzonego zestawu GCC ) wewnątrz funkcji C. gcc -S -O2 -fverbose-asmPomocny 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.

Basile Starynkevitch
źródło
8
„Ludzie nie programują w C (...). Używają współczesnych języków, być może z zapleczem C”
Abyx,
Zdecydowanie się zgadzam. A mój obecny projekt roboczy (MELT, patrz gcc-melt.org ) to DSL przetłumaczony na C.
Basile Starynkevitch,
Dodałem pewne odniesienia do ISA
Basile Starynkevitch
6
Co z tymi, którzy chcą tworzyć i asembler? Istnieją powody, aby nauczyć się kodu maszynowego, choć nie są one tak powszechne.
Jetti,
Powiedziałbym, że uczy się architektury zestawu instrukcji (używając mnemoniki asemblera). Rzadko uczysz się dokładnie kodowania instrukcji (np. Że NOP to 0x90). Wiele osób musi to wiedzieć, pisząc asembler lub generator kodu maszynowego. (Podobnie, rzadko trzeba nauczyć się na pamięć kodowania UTF8 w Unicode).
Basile Starynkevitch,
13

Jak już wspomniano wcześniej Learn Assembly .

Język asemblera jest językiem programowania niskiego poziomu dla komputerów, mikroprocesorów, mikrokontrolerów i innych programowalnych urządzeń. Implementuje symboliczną reprezentację kodów maszyn i innych stałych potrzebnych do zaprogramowania danej architektury CPU.

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ś:

  1. Zrozum, co to jest. Jest bardzo niskiego poziomu i daje bardzo dogłębne zrozumienie komputera. Możesz zacząć od Wikipedii, a następnie przeczytać ten krótki fragment .
  2. Naucz się tego! Najlepsze lektury to prawdopodobnie Sztuka asemblera i asembler krok po kroku: Programowanie w systemie Linux
  3. Uzyskaj kodowanie!
Dynamiczny
źródło
Czytałem ten drugi wątek i chyba natknąłem się na to: programmers.stackexchange.com/a/82573/43388 coś takiego, na czym mógłbym znaleźć tutorial? Ale najpierw muszę nauczyć się montażu, aby ułatwić przejście.
AceofSpades,
1
Dzięki, chyba potrzebuję nauczyć się montażu na popularne żądanie. +1
AceofSpades,
8

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.

JBRWilkinson
źródło
6
To hobby. Interesuje mnie, jak działają rzeczy, i uczę się nimi manipulować na bardzo podstawowym poziomie, jeśli to możliwe. +1
AceofSpades
6

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ą.

Tikhon Jelvis
źródło
Dziękuję bardzo za linki i wyjaśniające, od czego zacząć. +1
AceofSpades
6

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.

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.

Matt Stephenson
źródło
4

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.

Daniel Scocco
źródło
Jeśli oryginalny plakat zbuduje komputer od zera, będzie musiał zdefiniować (a nie tylko nauczyć się) swój własny zespół.
Basile Starynkevitch,
@ Daniels Rozumiem rozumowanie, ucząc się dodawania z bitów, co jest naprawdę niskim poziomem. +1
AceofSpades
Alternatywą do budowania komputera od podstaw może być nauka starego procesora (i jego języka asemblera), takiego jak Z80 lub 6502, który jest wciąż wystarczająco prosty, aby go zrozumieć. Sądzę, że są nawet emulatory, z którymi można grać.
Giorgio
@AceofSpades Świetny sposób na łatwą budowę procesorów i komponentów procesora (np. Sumatora) jest z Redstone w Minecraft, polecam to. Zacząłem pracować nad kilkoma prostymi maszynami w Minecraft, co znacznie poprawiło moje zrozumienie teorii i logiki stojących za komputerami.
Aaron
1

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ę ...

old_timer
źródło
1

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ć

br3w5
źródło