Ресурсы по обучению программированию в машинном коде? [закрыто]

24

Я студент, начинающий программировать и любящий его, от Java до C ++ и вплоть до C. Я перешел назад к голым местам и подумал, что нужно пойти дальше к Assembly.

Но, к моему удивлению, многие люди говорили, что это не так быстро, как С, и в этом нет смысла. Они предложили научиться программировать ядро ​​или писать компилятор Си. Я мечтаю научиться программировать в двоичном формате (машинный код) или, может быть, программировать на «голое железо» (физически программировать микроконтроллер), писать BIOS или загрузчики или что-то в этом роде.

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

Этот вопрос похож на мой, но я заинтересован в практическом изучении, а затем в понимании теории.

Туз пик
источник
2
В чем именно проблема здесь? Если вы спрашиваете, можно ли кодировать в машинном коде, то ответ, вероятно, «да». Если вы просите обучающие материалы, то а) проясните, что это ваш вопрос, но б) это не конструктивный вопрос.
ChrisF
6
С не достаточно ли металла?
Том Сквайрс
6
Я program bare metalкаждый раз пинаю свой серверный ящик. Творит чудеса!
Яннис
7
Вы когда-нибудь думали пойти еще дальше? Взломай
SK-logic
3
@ SK-logic, да, программирование машинного кода станет невыносимым примерно через 1 час. Вы правы, лучшая и более продуктивная идея - перейти к реализации процессора. Существуют также виртуальные версии 6502 ( visual6502.org ), а также люди, которые имеют или стремятся создавать ЦП с использованием современной дискретной логики ( bradrodriguez.com/papers/piscedu2.htm )
Angelo

Ответы:

27

Люди не программируют в машинном коде (если они не мазохистские). Они используют (или разрабатывают) инструменты для генерации машинного кода (компилятор или ассемблер, включая инструменты кросс-разработки) или, возможно, библиотеки, генерирующие машинный код (LLVM, libjit, GNU lightning, ....) Поэтому ресурсы о генерации машинного кода, компиляции, оптимизаторах и микроархитектурах также актуальны.

И очень часто хороший оптимизирующий компилятор генерирует лучший машинный код, чем вы могли бы сделать. Вероятно, вы не сможете написать 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 Кнута, проще.

Василий Старынкевич
источник
8
«Люди не программируют на C (...). Они используют современные языки, возможно, с бэкэндом C»
Abyx
Я определенно согласен. И мой текущий рабочий проект (MELT, см. Gcc-melt.org ) - это DSL, переведенный на C.
Василий Старынкевич,
Я добавил некоторые ссылки на МСА
Василий Старынкевич
6
Как насчет тех, кто хочет создать и ассемблер? Есть причины изучать машинный код, хотя они не так распространены.
Джетти
Я бы сказал, что он изучает архитектуру набора команд (используя мнемонику сборки). Вы редко узнаете точное кодирование инструкции (например, 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, но с некоторыми интересными дополнениями. Пришлось купить ассемблер (пришел на картридж ) и вызывать программы через бейсик. С грандиозным видением написания бестселлера, мне в итоге удалось создать несколько демонстраций, в которых аппаратные регистры отображения видео с разбивкой по битам записывают прерывания для создания интересных цветовых эффектов, которые анимируются в стиле фанк-музыки. Впечатляет, но не так полезно.

Затем я получил 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, возможно, был уместен здесь, работа была основана на C. Я обнаружил, что все работы с аппаратными средствами, которые я делал на Архимеде, также могут быть выполнены в C с использованием простых операций переворота битов. Часть моей роли заключалась в том, чтобы перенести кодовую базу на Windows, Playstation 2, Linux, другие телевизионные и мобильные чипсеты. Все эти платформы были доступны как с компилятором C (часто GCC), так и с некоторым уровнем API для записи на базовый компьютер - встроенный мир редко является ядром O / S. Мне никогда не нужно было знать полный машинный код для какой-либо конкретной платформы, кроме написания загрузчика и мини-BIOS, которые оба переходили на C-код при первой доступной возможности (после настройки векторов перехвата,

Следующей работой была работа с C ++, C # и JavaScript на Windows. Нет машинного кода.

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

Ради интереса я занимаюсь разработкой приложений для iOS, когда у меня дома мало свободного времени. Он использует Objective-C и API, который работает на нескольких чипсетах. Очевидно, они основаны на ARM, но я никогда не видел никакого машинного кода в моей разработке.

Хотя это увлекательное занятие по изучению ассемблера, сейчас есть гораздо более высокоуровневые инструменты и языки, которые позволяют вам работать на порядок (или два) более продуктивно.

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

Я бы посоветовал вам сделать это хобби / побочным интересом, а не главной целью.

JBRWilkinson
источник
6
Это хобби. Меня интересует, как все работает, и я учусь манипулировать ими на самом базовом уровне, если это возможно +1
AceofSpades
6

Мое предложение? Изучите MIPS и научитесь создавать (простой) процессор MIPS. На самом деле это проще, чем кажется.

Преимущество MIPS над некоторыми другими архитектурами заключается в простоте. Вы не будете погружены в тонну мелких деталей, но вы все равно узнаете все важные идеи, необходимые для написания кода в других архитектурах.

По совпадению, это был последний проект для моего (третьего) вступительного класса CS. При желании вы можете прочитать задание и просмотреть лекции в виде видео или слайдов .

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

Даже если вы не хотите освещать все вопросы, большинство лекций прочитал один из любимых лекторов студентов, и их интересно посмотреть самим.

Тихон Jelvis
источник
Большое спасибо за ссылки и объяснения, с чего мне начать. +1
AceofSpades
6

Я студент, начинающий программировать и любящий его, от Java до C ++ и вплоть до C. Я перешел назад к голым местам и подумал, что нужно пойти дальше к Assembly.

Отличный путь. Мой прыжок (падение?) С C на Assembly и ниже - это университетский курс Computer Organization and Design , основанный на одноименной книге .

Настоятельно рекомендуем эту книгу для первых глав по базовой сборке MIPS, вплоть до конвейерной архитектуры и архитектуры памяти. Еще лучше было бы пройти курс на ту же тему или найти несколько лекций в Интернете.

Также см. MARS MIPS Simulator, чтобы испачкать руки при написании сборки.

Мэтт Стивенсон
источник
4

Если вы хотите понять, как машина работает полностью, почему бы вам не перейти на самый низкий уровень из возможных и проложить свой путь туда, где вы находитесь (например, C, C ++)?

Под этим я подразумеваю: почему бы вам не построить свой собственный 4-битный сумматор с транзисторами на схеме (просто Google, если вы ищете инструкции / учебное пособие)?

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

Даниэль Скокко
источник
Если оригинальный постер строит компьютер с нуля, ему придется определить (а не просто изучить) свою собственную сборку.
Василий Старынкевич
@daniels Я понимаю причину, изучая сложение из битов, что является действительно низким уровнем. +1
AceofSpades
Альтернативой созданию компьютера с нуля может быть изучение какого-то старого процессора (и его языка ассемблера), такого как Z80 или 6502, который все еще достаточно прост для понимания. Я предполагаю, что есть даже эмуляторы, с которыми вы можете играть.
Джорджио
@AceofSpades Отличный способ легко собрать процессоры и компоненты процессора (например, сумматор) с помощью Redstone в Minecraft, я бы порекомендовал это. Я начал работать над некоторыми простыми машинами в Minecraft, и это значительно улучшило мое понимание теории и логики компьютеров.
Аарон
1

У меня есть набор инструкций, созданный для этого, симулятор и несколько уроков по основам, одна инструкция или концепция на урок. Просто введите программу, запустите ее, затем изучите, что она делает, и переходите к следующему уроку.

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

У меня также есть тренажеры для нескольких основных наборов инструкций. Любое или все из них хорошо использовать для изучения asm (если вы действительно чувствуете, что должны изучать x86, изучите его в последний раз и используйте симулятор, подобный тому, который я раздвоил, сначала 8088/86, а затем двигайтесь вперед). Обучение на симуляторе имеет свои плюсы и минусы, один из главных плюсов, особенно при запуске, заключается в том, что вы ничего не разбиваете и у вас хорошая видимость Сначала, прыгнув в голову во встроенную платформу, микроконтроллер и т. Д., Чтобы освоить новый набор инструкций, вы должны преодолеть препятствия неспособности увидеть, что происходит, что приводит к длинному списку способов сбоев ...

Старожил
источник
1

Код Чарльза Петцольда - очень хорошее введение в предмет и описывает процесс создания компьютера, включая, как создавать сумматоры, счетчики и массивы RAM, а также знакомит с машинным кодом и языком ассемблера и их отношением к языкам более высокого уровня. Это также отличная статья об истории вычислений.

И я только что прочитал этот вопрос на electronics.stackexchange, который тоже может быть полезен

br3w5
источник