Я студент, начинающий программировать и любящий его, от Java до C ++ и вплоть до C. Я перешел назад к голым местам и подумал, что нужно пойти дальше к Assembly.
Но, к моему удивлению, многие люди говорили, что это не так быстро, как С, и в этом нет смысла. Они предложили научиться программировать ядро или писать компилятор Си. Я мечтаю научиться программировать в двоичном формате (машинный код) или, может быть, программировать на «голое железо» (физически программировать микроконтроллер), писать BIOS или загрузчики или что-то в этом роде.
Единственная возможная вещь, которую я услышал после стольких исследований, - это то, что шестнадцатеричный редактор - самая близкая вещь к машинному языку, которую я мог найти в эту эпоху и эпоху. Есть ли другие вещи, о которых я не знаю? Есть ли ресурсы, чтобы научиться программировать на машинном коде? Предпочтительно на 8-битном микроконтроллере / микропроцессоре.
Этот вопрос похож на мой, но я заинтересован в практическом изучении, а затем в понимании теории.
источник
program bare metal
каждый раз пинаю свой серверный ящик. Творит чудеса!Ответы:
Люди не программируют в машинном коде (если они не мазохистские). Они используют (или разрабатывают) инструменты для генерации машинного кода (компилятор или ассемблер, включая инструменты кросс-разработки) или, возможно, библиотеки, генерирующие машинный код (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 Кнута, проще.
источник
Как было заявлено ранее, Learn Assembly .
Так что ассамблея
symbolic representation of machine code
.Теперь вы можете спросить: «Хорошо, как я могу узнать все это?» Я так рад, что вы спросили:
источник
Я настоятельно рекомендую вам пересмотреть свою цель и вот почему:
Сначала я выучил язык ассемблера 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.
Я бы посоветовал вам сделать это хобби / побочным интересом, а не главной целью.
источник
Мое предложение? Изучите MIPS и научитесь создавать (простой) процессор MIPS. На самом деле это проще, чем кажется.
Преимущество MIPS над некоторыми другими архитектурами заключается в простоте. Вы не будете погружены в тонну мелких деталей, но вы все равно узнаете все важные идеи, необходимые для написания кода в других архитектурах.
По совпадению, это был последний проект для моего (третьего) вступительного класса CS. При желании вы можете прочитать задание и просмотреть лекции в виде видео или слайдов .
Среди прочего, мы сделали крышку , как MIPS код преобразуемый двоичном; нам даже пришлось декодировать некоторый (очень простой) машинный код на экзаменах.
Даже если вы не хотите освещать все вопросы, большинство лекций прочитал один из любимых лекторов студентов, и их интересно посмотреть самим.
источник
Отличный путь. Мой прыжок (падение?) С C на Assembly и ниже - это университетский курс Computer Organization and Design , основанный на одноименной книге .
Настоятельно рекомендуем эту книгу для первых глав по базовой сборке MIPS, вплоть до конвейерной архитектуры и архитектуры памяти. Еще лучше было бы пройти курс на ту же тему или найти несколько лекций в Интернете.
Также см. MARS MIPS Simulator, чтобы испачкать руки при написании сборки.
источник
Если вы хотите понять, как машина работает полностью, почему бы вам не перейти на самый низкий уровень из возможных и проложить свой путь туда, где вы находитесь (например, C, C ++)?
Под этим я подразумеваю: почему бы вам не построить свой собственный 4-битный сумматор с транзисторами на схеме (просто Google, если вы ищете инструкции / учебное пособие)?
После этого соберите небольшой компьютер с небольшим количеством оперативной памяти, а затем начните изучать сборку и напишите на ней программу или две.
источник
У меня есть набор инструкций, созданный для этого, симулятор и несколько уроков по основам, одна инструкция или концепция на урок. Просто введите программу, запустите ее, затем изучите, что она делает, и переходите к следующему уроку.
http://www.github.com/dwelch67/lsasim
У меня также есть тренажеры для нескольких основных наборов инструкций. Любое или все из них хорошо использовать для изучения asm (если вы действительно чувствуете, что должны изучать x86, изучите его в последний раз и используйте симулятор, подобный тому, который я раздвоил, сначала 8088/86, а затем двигайтесь вперед). Обучение на симуляторе имеет свои плюсы и минусы, один из главных плюсов, особенно при запуске, заключается в том, что вы ничего не разбиваете и у вас хорошая видимость Сначала, прыгнув в голову во встроенную платформу, микроконтроллер и т. Д., Чтобы освоить новый набор инструкций, вы должны преодолеть препятствия неспособности увидеть, что происходит, что приводит к длинному списку способов сбоев ...
источник
Код Чарльза Петцольда - очень хорошее введение в предмет и описывает процесс создания компьютера, включая, как создавать сумматоры, счетчики и массивы RAM, а также знакомит с машинным кодом и языком ассемблера и их отношением к языкам более высокого уровня. Это также отличная статья об истории вычислений.
И я только что прочитал этот вопрос на electronics.stackexchange, который тоже может быть полезен
источник
Для изучения машинного языка и программирования
можно использовать программное обеспечение MASM.
Для MASM можно использовать следующую ссылку.
http://en.wikipedia.org/wiki/Microsoft_Macro_Assembler
http://www.microsoft.com/en-us/download/details.aspx?id=12654
источник