Ресурси для навчання програмуванню в машинному коді? [зачинено]


24

Я студент, цікавий програмуванню і люблю це: від Java до C ++ і вниз до C. Я перейшов назад до баребонів і думав піти далі до Асамблеї.

Але, на моє здивування, багато людей сказали, що це не так швидко, як C, і користі немає. Вони запропонували навчитися або програмувати ядро, або писати компілятор C. Моя мрія - навчитися програмувати в двійковому (машинному коді), а може, програмувати голий метал (фізично програмувати мікроконтролер) або писати біоси або завантажувачі або щось подібне.

Єдине можливе, що я почув після стількох досліджень, це те, що шестигранний редактор - це найближча мова до машинної мови, яку я міг знайти в цей вік і епоху. Чи є інші речі, про які я не знаю? Чи є ресурси, щоб навчитися програмувати в машинному коді? Переважно на 8-бітовому мікроконтролері / мікропроцесорі.

Це питання схоже на моє, але мене цікавить спочатку практичне навчання, а потім розуміння теорії.


2
У чому саме тут проблема? Якщо ви запитуєте, чи можна ввести машинний код, то відповідь, ймовірно, "так". Якщо ви просите підручники, то а) дайте зрозуміти, що це ваше питання, але б) це не конструктивне питання.
ChrisF

6
Хіба С не вистачає металу?
Том Сквайрс

6
Я program bare metalщоразу підбиваю свій серверний ящик. Творить чудеса!
янніс

7
Коли-небудь думали піти ще далі? Зламіть власний процесор: opencores.org
SK-логіка

3
@ SK-логіка, так, програмування машинного коду стане нестерпним приблизно через 1 годину. Ви маєте рацію, краща та продуктивніша ідея - перейти до впровадження процесора. Існують також віртуальні версії 6502 ( visual6502.org ), а також люди, які мають або прагнуть побудувати процесор, використовуючи сучасну дискретну логіку ( bradrodriguez.com/papers/piscedu2.htm )
Angelo

Відповіді:


27

Люди не програмують машинний код (якщо вони не мазохістські). Вони використовують (або розробляють) інструменти для генерації машинного коду (компілятор або асемблер, включаючи інструменти перехресної розробки), або, можливо, бібліотеки, що генерують машинний код (LLVM, libjit, GNU блискавка, ....). Тому ресурси щодо створення машинного коду, компіляції, оптимізаторів та мікроархітектури також є актуальними.

І дуже часто хороший оптимізуючий компілятор генерує кращий машинний код, ніж ви могли б зробити. Напевно ви не зможете написати код асемблера на рядку 200 краще, ніж хороший оптимізатор.

Якщо ви хочете зрозуміти машинний код, спочатку вивчіть складання. Це дуже близько до машинного коду. Використовуйте його з розумом, лише для речей, які ви не можете кодувати на C (або якоюсь мовою вищого рівня, наприклад Ocaml, Haskell, Common Lisp, Scala). Хороший спосіб - це використання asmінструкцій (особливо функція розширеної збірки GCC ) всередині функції C. Читання коду складання (генерованого gcc -S -O2 -fverbose-asm) також може бути корисним.

Linux Асамблея HowTo це хороша річ , щоб читати.

Поточна архітектура наборів інструкцій процесора (тобто набір інструкцій, зрозумілих чіпом) досить складна. Поширеними є x86 (типовий ПК у 32- бітовому режимі), X86-64 (настільний ПК у режимі 64 біт), ARM (смартфони, ...), PowerPC тощо. Всі вони досить складні (через історичну та економічну) причини). Можливо, спочатку вивчити гіпотетичний набір інструкцій, наприклад , MMIX Knuth є простішим.


8
"Люди не програмують на C (...). Вони користуються сучасними мовами, можливо, із
заднім числом

Я однозначно згоден. А мій поточний робочий проект ( MELT , див. Gcc-melt.org ) - це DSL, перекладений на C.
Basile Starynkevitch

Я додав кілька посилань на МСА
Базиле Старинкевич

6
Що з тими, хто хоче створити та скласти? Є причини вивчити машинний код, хоча вони не такі поширені.
Jetti

Я б сказав, що це вивчення архітектури наборів інструкцій (з використанням мнемоніки збірки). Ви рідко чітко дізнаєтесь точне кодування інструкцій (наприклад, що NOP - 0x90). Вам багато хто повинен це знати при написанні асемблера або генератора машинного коду. (Так само рідко потрібно вивчити напам’ять кодування UTF8 Unicode).
Василь Старинкевич

13

Як було зазначено раніше Learn Assembly .

Мова складання - мова програмування низького рівня для комп'ютерів, мікропроцесорів, мікроконтролерів та інших програмованих пристроїв. Він реалізує символічне зображення машинних кодів та інших констант, необхідних для програмування заданої архітектури процесора.

Отже Асамблея - це symbolic representation of machine code.

Ви, можливо, зараз запитуєте "Добре, то як я все це дізнаюся?" Я так радий, що ти запитав:

  1. Зрозумійте, що це таке. Це дуже низький рівень і дасть вам дуже глибоке розуміння комп'ютера. Ви можете почати з Вікіпедії, а потім прочитати цей короткий уривок .
  2. Дізнайся! Найкращі читання - це, мабуть, "Мистецтво мови збирання" та мова складання "Крок за кроком": програмування з Linux
  3. Отримайте кодування!

Я читав цю іншу тему, і, мабуть, натрапляю на це: programmers.stackexchange.com/a/82573/43388 що- небудь такого характеру, на якому я міг би знайти підручник? Але, мені потрібно вивчити складання спочатку, щоб полегшити перехід.
AceofSpades

1
Дякую, я думаю, мені потрібно вивчити складання за потребою. +1
AceofSpades

8

Я настійно пропоную вам переглянути свою мету, і ось чому:

Я вперше вивчив мову монтажу 6502 на мікрокомп'ютері BBC (модель B, 32K). Він мав дивовижну реалізацію BASIC, яка включала макроскладач. У нас їх було в школі, тому я писав всілякі шкідливі програми, які б робили такі речі, як пряма маніпуляція буфером екрана, щоб зробити леммінг ходити по кожному екрану, по кімнаті (вони були мережевими), якщо машини не використовували протягом 10 хвилин . Це призвело до прихисток хихикань серед моїх друзів 7 року.

Коли я придбав Commodore 64 вдома, я дізнався, що він має 6510 процесор, який також працював на 6502 мові збірки, але з цікавими додатками. Мені довелося придбати асемблер (прийшов на картридж ) і викликати програми через BASIC. Завдяки грандіозному баченню написання бестселерів, я врешті-решт створив кілька демонстраційних версій, які перетворювали на перерви апаратне відображення бітових відеозаписів, щоб зробити цікаві кольорові бар-ефекти, що оживили музику з прикольною фішкою. Вражаючий, але не такий корисний.

Потім я отримав Acorn Archimedes A310, який мав процесор ARM2, тому я використав таку ж дивовижну реалізацію BASIC із вбудованим макроскладачем, як BBC Micro (те саме спадщина). Мені вдалося зібрати пару ігор, для яких майстер-друг запропонував графіку, а також кілька демонстрацій на основі синусоїд. І те і інше було важкою роботою з програмуванням, і поганий код міг зняти машину (випадково реєструвати скидання апаратного забезпечення та ін.), Втративши все, якщо я не врятував (на дискету!).

В університеті мене познайомили з C ++ і, таким чином, C. Мені вдалося використати його для програмування Sun / Solaris та деяких інших великих комп'ютерів з мейнфреймом. Я поняття не маю, над якими архітектурними процесорами працювали ці машини - мені ніколи не потрібно було використовувати асемблер чи читати машинний код, оскільки інструменти C ++ дали мені силу, необхідну для створення професійних програм.

Після Uni я працював над Windows і кількома ароматами Unix. C і C ++ працювали на всіх цих машинах і, зрештою, Java теж зробила.

Потім я працював над Windows і Dreamcast, використовуючи C ++ з DirectX, і всеосяжний інструментальний ланцюг для налагодження.

Потім я взяв роботу, працюючи з чіпсетами на основі ARM для Smart TV (у 2000 році). Хоча мій досвід роботи з ARM2, можливо, був тут актуальним, робота була заснована на С. Я виявив, що всі роздуми над обладнанням, що я робив на Archimedes, можна також зробити в C, використовуючи прості операції з подрібненням бітів. Частина моєї ролі полягала в перенесенні кодової бази на Windows, Playstation 2, Linux, інші телевізійні та мобільні чіпсети. Усі ці платформи були доступні як з компілятором C (часто GCC), так і з деяким рівнем API для запису на базову машину - вбудований світ рідко є ядром O / S. Мені ніколи не потрібно було знати повний код машини для будь-якої конкретної платформи, окрім написання завантажувача та mini-BIOS, обидва вони вскочили в код C при першій можливій можливості (після встановлення векторів пастки,

Наступним завданням була робота з C ++, C # та JavaScript у Windows. Немає машинного коду.

Поточна робота - це робота з C ++, JavaScript, Python, LUA, HTML та іншими мовами на різних платформах. Я не маю уявлення, яким машинним кодом працюють ці платформи, і мені це не потрібно знати - компілятор переводить наш код у все, що йому потрібно. Якщо вона виходить з ладу, я виявляю помилку в налагоджувачі або за допомогою діагностики виконання (винятки, сигнали тощо).

Для розваги я розробляю додатки для iOS на маленький вільний час, який я маю вдома. Він використовує Objective-C і API, який працює в декількох наборах чіпів. Мабуть, вони базуються на зброї, але я ніколи не бачив машинного коду в своїй розробці.

Хоча це 'захоплююча вправа вивчати мову складання, зараз є набагато більш високі рівні інструментів та мов, які дозволяють бути на порядок (або два) більш продуктивними.

Кількість можливостей роботи, доступних для дивовижного програміста з мовлення / машинного коду, є незначною порівняно з тим, як JavaScript, Java, C #, C ++ або ObjC.

Я б радив вам зробити це хобі / побічним інтересом, а не основною метою.


6
Це хобі. Мене цікавить, як все працює, і, якщо можливо, навчитися ними маніпулювати на дуже базовому рівні. +1
AceofSpades

6

Моя пропозиція? Дізнайтеся MIPS та дізнайтеся, як побудувати (простий) MIPS-процесор. Насправді простіше, ніж здається.

Перевага MIPS перед деякими іншими архітектурами - простота. Ви не потрапите в тону дрібних деталей, але все одно ви дізнаєтесь усі великі ідеї, необхідні для написання коду в інших архітектурах.

Випадково це був заключний проект для мого (третього) класу вступного CS. Якщо хочете, ви можете прочитати завдання та переглядати лекції у вигляді відео чи слайдів .

Серед іншого, ми зробили кришку , як MIPS код перетворений довічним; нам навіть довелося розшифрувати якийсь (дуже простий) машинний код на іспитах.

Навіть якщо ви не хочете висвітлювати все, більшість лекцій читав хтось із улюблених викладачів студентів і їх цікаво спостерігати самостійно.


Дуже дякую за посилання та пояснення, з чого я повинен починати. +1
AceofSpades

6

Я студент, цікавий програмуванню і люблю це: від Java до C ++ і вниз до C. Я перейшов назад до баребонів і думав піти далі до Асамблеї.

Відмінний шлях. Мій стрибок (падіння?) З С на Асамблею і нижче був університетським курсом « Комп'ютерна організація та дизайн» , заснований на однойменній книзі .

Настійно рекомендую цю книгу для перших розділів про основні складання MIPS, аж до конвеєрного проектування та архітектури пам'яті. Ще краще було б пройти курс однієї теми або знайти лекції в Інтернеті.

Також перегляньте тренажер MARS MIPS, щоб забруднити письмові руки.


4

Якщо ви хочете зрозуміти, як машина працює повністю, чому б вам не піти на найнижчий можливий рівень і побудувати свій шлях до місця, де ви є (наприклад, C, C ++)?

Я маю на увазі: чому б вам не створити власний 4-розрядний суматор з транзисторами по ланцюгу (просто Google це, якщо ви шукаєте інструкції / посібник)?

Після цього побудуйте невеликий комп'ютер з деякою оперативною пам’яттю, а потім починайте вивчати збірку і написати програму чи дві з нею.


Якщо оригінальний плакат будує комп’ютер з нуля, йому доведеться визначити (а не просто вивчити) власну збірку.
Василь Старинкевич

@daniels Я розумію міркування, вивчаючи додавання з бітів, що є справжньо низьким рівнем. +1
AceofSpades

Альтернативою побудові комп'ютера з нуля може бути вивчення старого процесора (та його мови складання), наприклад, Z80 або 6502, який ще досить простий для розуміння. Я думаю, є навіть емулятори, з якими можна грати.
Джорджіо

@AceofSpades Чудовий спосіб легко створити процесори та компоненти процесора (наприклад, суматор) - це червоний камінь у Minecraft, я б рекомендував це. Я почав працювати над простими машинами в Minecraft, і це дуже посилило моє розуміння теорії та логіки за комп'ютерами.
Аарон

1

У мене є набір інструкцій, який був зроблений для цього, тренажер та деякі навчальні посібники з основ, одна інструкція чи концепція на урок. Просто введіть програму, запустіть її та дізнайтеся, що вона робить, перейдіть до наступного уроку.

http://www.github.com/dwelch67/lsasim

У мене також є тренажери для кількох основних наборів інструкцій. Будь-який або всі з них добре використовувати для засвоєння ASM (якщо ви дійсно відчуваєте, що вам доведеться вивчити x86, вивчіть його останньою, і використовуйте тренажер, як той, який я роздрібнив, 8088/86 спочатку рухайтеся вперед). Навчання на тренажері має плюси і мінуси. Один з головних проблем, особливо коли ви починаєте, чи не ставите ви нічого з ладу і маєте чудову видимість. Стрибнути головою спочатку на вбудовану платформу, мікроконтролер тощо, щоб вивчити новий набір інструкцій, ви повинні подолати перешкоди, щоб не бачити, що відбувається, ведучи до довгих списків способів виходу з ладу ...


1

Код Чарльза Петцольда - це дуже вдале вступ до теми та описує процес побудови комп'ютера, включаючи, як будувати суматори, лічильники та масиви оперативної пам’яті, а також вводить машинний код та мову складання та їхнє відношення до мов вищого рівня. Це також чудове читання з історії обчислень.

І я щойно прочитав це запитання на electronics.stackexchange, яке також може бути корисним


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.