Как именно мы переходим от Binary / Hex к наборам инструкций по сборке?


13

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

Одна вещь меня озадачивает, хотя ... как мы "получаем" наборы инструкций. Я немного понимаю, как работает gates / TTL и тому подобное, но я не понимаю, как мы можем перейти от этого к mov, add, clr и т. Д. ...?

Это, наверное, глупый вопрос .... но я имею в виду, я вспоминаю первые микропроцессоры / контроллеры и думаю ... как именно они разработали набор инструкций и заставили его работать?

редактировать: я думаю, для Clarity, представьте, что я говорю о первом микропроцессоре, как они перешли от Binary к созданию набора команд?


2
Каждая инструкция имеет значение, компилятор преобразует ваш код в эти инструкции в зависимости от структуры вашего кода.
Ramhound

1
Я не уверен, правильно ли я понимаю ваш вопрос, но я думаю, что вы можете найти свой ответ здесь , здесь или здесь .
e-MEE

1
пара тесно связанных вопросов programmers.stackexchange.com/questions/81624/… и superuser.com/questions/307116/…
jhocking

3
как они перешли от Binary к созданию набора инструкций? На самом деле, «они» не сделали - это наоборот, по крайней мере, в целом. Разработчик (и) ЦП определяет операции, которые будет выполнять ЦП, затем он создает набор команд из этого и затем сопоставляет инструкции (мнемонику) с кодами операций (двоичный машинный код). @ Скотт Уитлок дал хороший ответ ниже, я просто хотел бы ответить на последнюю часть вашего вопроса, потому что ваше предположение, по моему опыту, по крайней мере, является обратным.
Радиан

1
Это действительно хорошая книга: www1.idc.ac.il/tecs - это то, что объяснило мне все это, большинство глав доступны бесплатно онлайн. Вы создаете свой собственный чип (на простом языке аппаратного описания) из nand gates, затем из ассемблера, затем из компилятора, затем пишете операционную систему на языке, который вы создали! Удивительные вещи, и, как кто-то без образования, это было хорошо проведенное время для меня!
bplus

Ответы:


18

Сердце процессора - это АЛУ . Он отвечает за получение инструкции (например, MOV), которая представляет собой просто некоторый заранее заданный ряд двоичных цифр, а также за принятие 0, 1 или 2 операндов, и выполнение над ними соответствующей операции. Самой простой инструкцией может быть NOP (без операции), который по сути ничего не делает. Другой типичной операцией является ADD (добавляет два значения).

АЛУ считывает и записывает данные из и в «регистры». Это небольшие области памяти внутри процессора. Часть инструкции (от 2 до 3 бит для каждого входа в зависимости от того, сколько регистров у вас есть) указывает, из какого регистра нужно читать. В ЦПУ есть внешние устройства по отношению к АЛУ, которые обрабатывают загрузку требуемых данных (и инструкции) из памяти в регистры и запись результата из регистров обратно в память. Место для записи результата также будет закодировано в еще 2 или 3 бита.

Выбор «кодов операций», который представляет собой двоичное число, представляющее операцию, не является произвольным. Правильно подобранные коды операций уменьшают сложность ALU. Каждый бит или группа битов имеют тенденцию включать и отключать определенные логические элементы в ALU. Например, инструкция ADD должна позволять выходному каскаду выбирать результат внутренней логики добавления. Аналогично, инструкция MUL будет выбирать результат логики умножения. В зависимости от конструкции вполне вероятно, что обе схемы сумматора и умножения фактически выполняют свою работу над входными операндами, и меняется только выбор вывода (то, что записывается в выходные биты ALU).


1
Я думаю, что я спрашиваю, как они выбирают? И как они на самом деле идут о назначении этого?

1
@Sauron: перечитайте третий абзац еще раз и попытайтесь понять двоичные арифметические и цифровые схемы. Я могу представить набор команд с 256 инструкциями 8-битной линией в цифровой схеме. Это означает, что мне нужно 8 портов ввода / вывода на моих аппаратных устройствах для передачи каждого возможного состояния (2 состояния на строку ^ 8 строк = 256 возможных состояний). Затем процессор может решить, что делать с этим цифровым входным сигналом. Цифровая схема означает, что у вас есть два состояния оборудования: Hi и Lo, напряжение или отсутствие напряжения. Вот откуда бинарный файл. Двоичное представление - самое близкое к металлу.
Сокол

3
@Sauron - посмотрите цифровые мультиплексоры, чтобы увидеть, как цифровая схема может выбирать одно из нескольких значений. Если у вас 8-битная шина, вам просто нужно 8 из этих двоичных цифровых мультиплексоров параллельно.
Скотт Уитлок

1
@ Сокол Хорошо ....... Я думаю, что это имеет больше смысла. Я постоянно забываю, что в итоге все сводится к двоичным сигналам ... и даже такая инструкция, как "mov", все еще представляется в виде двоичного кода.

1
@Sauron - проведите небольшое исследование процессора, это поможет вам понять, что такое op-коды и как они работают. Почему определенные коды операций выбраны не важно, даже если задать вопрос «почему», не имеет большого смысла. Понимание того, как они выбраны, может помочь вам лучше понять процессор и его структуру.
Ramhound

9

Я восприму ваш вопрос буквально и буду обсуждать в основном микропроцессоры, а не компьютеры в целом.

Все компьютеры имеют какой-то машинный код. Инструкция состоит из кода операции и одного или нескольких операндов. Например, инструкция ADD для Intel 4004 (самый первый микропроцессор) была закодирована как 1000RRRR, где 1000 - код операции для ADD, а RRRR - номер регистра 0-15 (0000-1111 в двоичном виде).

Все другие инструкции, которые ссылаются на один из 16 4-битных регистров (например, INC, ISZ, LD, SUB, XCHG), также используют младшие 4 бита для кодирования номера регистра и различные кодировки старших 4-битов для указания код операции. Например, ADD, SUB, LD и XCHG используют коды операций 1000, 1001, 1010 и 1011 (все в двоичном формате) в сочетании с полем регистра. Таким образом, вы можете увидеть, как шаблон используется для упрощения логики.

Самые первые компьютерные программы были написаны от руки, с ручным кодированием 1 и 0, чтобы создать программу на машинном языке. Затем он был запрограммирован в ПЗУ (постоянное запоминающее устройство). Теперь программы обычно записываются в электрически стираемую флэш-память, в случае микроконтроллеров, или заканчиваются ОЗУ, если это микропроцессоры. (Последнему все еще нужна какая-то постоянная память для загрузки.)

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

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

Поскольку первый микропроцессор был разработан задолго до появления мэйнфреймов и миникомпьютеров, а 4004 на самом деле не подходил для работы с ассемблером, Intel, вероятно, написала кросс-ассемблер, который работал на одном из своих больших компьютеров, и перевела код ассемблера для 4004 в двоичный образ, который может быть запрограммирован в ПЗУ.


4

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

Я сделаю все возможное, чтобы подвести итог:

Как упомянуто здесь, в основе у нас есть ALU - что нужно знать об ALU (и других частях процессора), так это то, что он реконфигурируем для различных операций. Более конкретно, у нас есть возможность перенастроить путь данных , то есть, каким образом параметры выбираются, какую операцию выполнять и где они хранятся впоследствии. Представьте себе возможность манипулировать этими тремя вещами - это наш контроль .

Итак, как нам это сделать? Как уже упоминалось, мы можем использовать преимущества низкоуровневой цифровой логики и создавать мультиплексоры для разных каналов. Мультиплексоры управляются с помощью набора битов для ввода - откуда эти биты взяты? Кодируется из самой инструкции. Вывод: такие инструкции, как mov, add и т. Д., Представляют собой просто набор битов, которые сообщают процессору, как настроить его путь к данным для конкретной операции. То, что вы читаете (mov, add) - это читаемая человеком форма (язык ассемблера), и наша программа определяет процедуру путей данных и операций.

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


3

если я понимаю ваш вопрос, я не понимаю, как связаны bin / hex или сборка.

Я предполагаю, что суть вашего вопроса в том, как мне добраться от основных ворот И, ИЛИ, НЕ к таким инструкциям, как перемещение, загрузка, сохранение, добавление и т. Д.

У меня есть свой маленький набор инструкций по обучению, который я сделал с нуля, в котором есть некоторые детали, например, о том, как сложение и вычитание работают из базовых элементов и тому подобное http://github.com/dwelch67/lsasim .

Ищите код (что-то, что-то) книгу от Petzold. Может начинать с элементарных, но медленно, от компьютера и электроники, постепенно уводит вас в бинарные, шестнадцатеричные, базовые элементы и т. Д.

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

Позвольте мне остановиться и спросить вас, как вы пишете программу? Начиная с пустого экрана в текстовом редакторе? У вас есть представление о задаче, с которой вы пытаетесь решить переменные, которые могут вам понадобиться, о функциях, языке программирования и т. Д. И каждый человек индивидуален, но в некоторой степени вы делаете это немного (скажем, определение и написание функций), немного этого (создание заголовочных файлов с повторно используемыми определениями, перечислениями, структурами и прочим), и немного другое (просто код, заполнение функций переменными и кодом). И вы обращаетесь к различным задачам, в конце концов вы чувствуете, что у вас есть баланс между размером кода, скоростью, удобочитаемостью, качеством, функциональностью и т. Д. Ничего не отличается от аппаратного дизайна. разработчики оборудования также используют языки программирования (vhdl, verilog) и проходят через тот же процесс,

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

Итак, вы изобрели некоторый набор инструкций с нуля, вы использовали некоторый опыт в разработке аппаратного обеспечения для группировки похожих инструкций с одинаковыми битовыми шаблонами, чтобы их можно было легче декодировать не только для программирования на аппаратном языке, но и для экономии энергии, затворов и всего этого. хорошая вещь. В наши дни вы могли бы создать своего рода симулятор, насколько я понимаю, ARM сначала был программным симулятором, а потом разработкой аппаратного обеспечения, не знаю, правда ли это, но придерживаюсь этой истории. Это зависит от команды, в которой некоторые команды могут быть просто аппаратными специалистами и хотят просто заняться программированием в hdl, а некоторые, как я, могут захотеть сделать и то и другое. В наши дни доступны хорошие имитаторы языка аппаратного обеспечения, поэтому вам не нужно собирать какое-либо оборудование, которое вы компилируете и моделируете, и выполняйте большую часть отладки с помощью программы / пакета аппаратного моделирования. Команда разработчиков программного обеспечения может разрабатывать ассемблеры и компиляторы для набора инструкций и использовать программы имитации оперативной памяти и ROM для симулированного процессора и проверять его темп. мы смоделировали полную загрузку Linux на процессоре, над которым я работал не так давно, это заняло много часов, но это сработало (таким образом мы обнаружили ошибку в кеше логики).

Так что теперь о том, что я действительно думаю, что вы спрашивали. Как добраться от основных ворот до процессора с набором инструкций. Итак, базовые вентили И, ИЛИ, НЕ на самом деле являются аналоговыми, они не имеют понятия времени, вы не можете мгновенно изменять напряжение на входах, и по мере изменения этого напряжения выходы начинают меняться. Затворы сделаны из транзисторов, а транзисторы являются усилителями, принимают входной сигнал, умножают его на некоторое число и позволяют такому току течь по другой стороне. когда мы используем их в качестве логических элементов, мы фактически перенасыщаем их, входное напряжение настолько высокое или низкое, что транзистор может управлять только максимальным напряжением или отсутствием напряжения (тока). в основном транзистор превращается в выключатель. Короче говоря, нет понятия времени. Чтобы иметь набор инструкций, нам нужно, чтобы инструкции выполнялись для того, чтобы мы могли последовательно проходить через программу, у нас должна быть концепция того, как мы выполняем эту инструкцию, и в следующем временном интервале мы будем работать над этой инструкцией. Так же, как игра превращения усилителя в переключатель, вы играете в похожие игры, используя базовые логические элементы с часами. часы поступают из магических кристаллов в банке (не стоит вдаваться в это здесь), которая создает напряжения, которые включаются и выключаются с некоторой фиксированной скоростью. используйте это напряжение в логических уравнениях, и вы можете начать последовательность вещей. часы поступают из магических кристаллов в банке (не стоит вдаваться в это здесь), которая создает напряжения, которые включаются и выключаются с некоторой фиксированной скоростью. используйте это напряжение в логических уравнениях, и вы можете начать последовательность вещей. часы поступают из магических кристаллов в банке (не стоит вдаваться в это здесь), которая создает напряжения, которые включаются и выключаются с некоторой фиксированной скоростью. используйте это напряжение в логических уравнениях, и вы можете начать последовательность вещей.

очень очень кратко рассмотрим эту таблицу истинности:

0 0 0
0 1 1
1 0 1
1 1 0

в двоичном виде:

0 + 0 = 1
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 (2 decimal)

фокусируясь только на lsbit, однобитном сумматоре, приведенная выше таблица истинности описывает однобитный сумматор. Это также описывает ворота XOR. Один вход верен или другой, но не оба.

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

Как вы превращаете этот аналоговый сумматор в инструкцию ADD, если у вас есть логика, которая смотрит на инструкцию, которая служит входом для этих затворов, которые вы организовали. некоторые из битов в инструкции говорят, что это инструкция добавления, некоторые из битов говорят, что один операнд является таким-то и таким регистром, может быть, регистром 7, другие биты могут сказать, что другой операнд является регистром 4. и в зависимости от используемой вами архитектуры в инструкции может быть указан другой регистр, в котором говорится, что результат помещается в регистр 2. Теперь дополнительная логика видит это, так как мне нужно, чтобы содержимое регистра 7 направлялось на один вход alu adder, а входы регистра 4 - на сумматор, и вы маршрутизируете выход сумматора для регистрации 2. Поскольку часы являются частью этой логики, существует период времени от начала тактового периода до начала следующего тактового периода, когда все аналоговые сигналы располагаются и разрешают логическое уравнение, для которого они предназначены. В отличие от того, когда вы нажимаете выключатель света, вы меняете состояние освещения с выключенного на включенное. требуется время для того, чтобы этот свет разогрелся и в основном перешел в устойчивое состояние. Не сильно отличается здесь.

Есть некоторая логика, которая говорит такие вещи, как, если этот период синхронизации является фазой выполнения инструкции AND, то в следующий период синхронизации я собираюсь сохранить результат в выходном регистре. в то же время я собираюсь получить следующую инструкцию и т. д. Так что для современных процессоров, где выполнение alu часто составляет всего один такт, потому что аналоговая логика может быстро разрешать логические уравнения. Старые процессоры, которые вам приходилось считать до некоторого числа, оставляют сумматор подключенным, ждут x количество тактов для разрешения логики сумматора, затем выбирают результат из выходных данных, подают alu различные входы, ждут x количество тактов для что разрешить, повторять вечно или пока не отключится питание.

Что я подразумеваю под логическими уравнениями? просто, если вы хотите, вы можете думать об этом с точки зрения И, ИЛИ, НЕ ворот. Для каждого входного бита схемы сумматора alu существует уравнение, вероятно, очень длинное уравнение, которое включает в себя тактовые импульсы, которые включают триггеры (отдельные / единичные биты памяти), которые содержат текущую инструкцию (плюс уравнения, которые питают каждый из этих биты памяти) и так далее. Возьмите одну написанную вами программную функцию на языке, на котором вы ее написали, предполагая, что это функция, которая принимает входные данные, выполняет задачу, а затем завершает работу и возвращает результат. Подумайте обо всех возможных комбинациях входных данных и о том, какие пути выполнения выполняются через эту функцию. Возможно, вы написали это на каком-то высокоуровневом языке, но вы могли бы даже на этом языке переписать его, чтобы сделать его более примитивным и более примитивным, используя множество вложенных структур if-then-else. и, возможно, иди вниз на ассемблере. В отличие от уравнений, о которых я говорю, программист на аппаратном обеспечении не программирует в этих длинных многомерных уравнениях больше, чем вы, вероятно, программируете в длинных многословных деревьях «если потом» на ассемблере, когда предпочитаемый язык программирования экономит так много. Точно так же, как используемый вами компилятор превращает ваш маленький исходный код в многослойную сборку с большим количеством if-then-elses, так и есть компилятор, который берет код языка аппаратного программирования и превращает его в логические уравнения.

Теперь вернемся к первому процессору (который сегодня мы будем рассматривать как микроконтроллер, но тогда это был процессор). Вы сделали все вышеперечисленное на бумаге, и вы не использовали аппаратные языки программирования, вы на самом деле написали логические уравнения, но вы еще более тщательно выбрали битовые комбинации для инструкций, чтобы сделать число вентилей и проводов для соединения этих вентилей максимально простым. как практично. На бумаге вы должны были вручную создать длинный список логических элементов, а затем нарисовать фактические компоненты на взорванной версии силиконовой маски. даже сегодня чипы изготавливаются с использованием процесса, аналогичного фотографическому или шелкографическому, с точки зрения непрофессионалов, поэтому вы можете взять эти синие отпечатки, если хотите, и уменьшить их, а затем применить их к слоям кремния.

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

Точно так же, как первый, скажем, компилятор C, вероятно, был написан на каком-то другом языке, затем он стал самоприемником, будучи переписанным на C и скомпилированным первым компилятором C, затем снова сам по себе. Затем компиляторы C были использованы для изобретения других языков программирования, которые затем стали самостоятельными. Мы изобрели операционные системы и текстовые редакторы, которые были созданы на их основе, и это всего лишь чёрная магия, которую могут сделать несколько человек за занавеской в ​​углу ...

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


Это действительно не отвечает на вопрос автора, по крайней мере, ничего не добавляет к обсуждению, что принятый ответ не охватывал. Ваша двоичная математика неверна на 100% 1 + 1 равно 0 с переполнением 1. В зависимости от размера реестра это будет либо 2, либо 0.
Ramhound

@ Dwelch ЧЕРТ! Я ваш поклонник, если не меньше. +1
AceofSpades

2

Процессоры работают на 0 и 1. Все инструкции имеют последовательности битов, которые их определяют. Это был машинный код. Это трудно для людей, чтобы читать и писать. В качестве первого шага мы сгруппировали 0 и 1 в 4-битные последовательности и использовали от 0 до F для их представления. Это уменьшило число, которое мы должны были запомнить, но все еще было нелегко запомнить шестнадцатеричный код для инструкций.

Таким образом, мы начали использовать ассемблер, в котором были такие слова, как MOV и ADD. Ассемблер заменит инструкции на правильный набор 0 и 1, преобразуя «листинг» сборки в машинный код.

В конце концов мы разработали языки «более высокого» уровня, где «инструкции» могли представлять целые последовательности машинного кода.


К вашему сведению, восьмеричное использовалось как двоичное сокращение перед шестнадцатеричным.
ocodo

Сломохо прав, Октал, основание 8 использовало 3 бита, использовалось вместе с шестнадцатеричным, основание 16 использовало 4 бита. Преимущество Octal в том, что все знали, что представляют цифры от 0 до 7. Люди, которые не использовали Hex, часто были озадачены «цифрами» от A до F.
Джим C

0

Я недавно сталкивался с этим Q / A и приблизительно год назад, когда я начал путешествовать по этому пути; Я нашел бы это очень хорошим ресурсом и справочной страницей в отношении связанных с этим моих собственных вопросов.


Часть 1: -Preface-

Немного обо мне:

В середине-конце 80-х, когда я еще учился в начальной школе, я разбирал ненужные стереосистемы, видеомагнитофоны и другие электронные устройства, которые были с 50-х по 80-е годы, смотрел на печатные платы и всегда хотел знать, как они работа ... Как они на самом деле получали сигнал вещания, производили аудио, видео, делали то и это и т. д ... Я мог распознавать отдельные части здесь и там, такие как резистор, конденсатор, диод и транзистор, но не сделал знать, что они делали или как они функционировали в таком молодом возрасте.

На протяжении многих лет я всегда был исключительным в математике, физике и химии. Я в высшей степени понимал математику и даже мог прочитать некоторые простые или базовые схемы из моих школьных и школьных дней, которые пришли позже, но я так и не смог узнать о логических элементах и ​​их построении ... Однако я так и сделал изучать булеву алгебру в старших классах из моего курса «Логика, вероятность и статистика». Все мои уроки математики и естественных наук были классами с отличием. Я не принимал Calculus до второго семестра в местном колледже. Я сдал экзамен по алгебре в колледже и взял курс тригонометрии на курсы повышения квалификации. Мой самый высокий уровень математики в классе - это исчисление II одной переменной.

Я играю в видеоигры с 3 или 4 лет. В детстве у меня были Atari, NES, Sega Genesis и PS1. Когда я стал старше, мне было чуть больше 20 лет, и я приобрел PS2 и SNES с избранными играми. Это также не относится к играм на ПК, которые восходят к Doom!

Я всегда был заядлым игроком в консоль и ПК, и это не относится к пинболу и аркадным играм.

Мой первый компьютер мне дали, когда мне было около 12 лет на Рождество в начале 90-х. Дни DOS 6.0 и либо Win 3.11, либо OS / 2. С тех пор я всегда был знаком с семейством операционных систем Windows, и все системы, которые у меня были, были архитектуры Intel. Я имел ограниченный опыт работы с Apple или Mac из школы или колледжа, но у меня никогда не было привилегии работать на системах Linux. У меня есть Cygwin, и я попробовал свои силы в изучении bash, но я так привык к Dos или синтаксису командной строки.

В начале 90-х я получал одну или две копии PC-World и вводил фрагменты кода в QBasic, который я не очень хорошо знал, и попытался бы заставить эти программы работать. Единственной успешной была программа, которая превращала нажатия клавиш в домашнем ряду клавиш в различные звуки мелодий звонка. Я не имею в виду мелодии звонка на сотовом телефоне, я имею в виду непрерывную частоту, пока вы держите клавишу нажатой.

Моя страсть всегда была не только в том, чтобы хотеть узнать, как электронные устройства работают в цепи на цифровом и логическом уровне, чтобы научиться программировать компьютер, но у меня всегда было желание сделать свое собственное видео. игры. Еще в начале 90-х я хотел сделать игры Frogger и Tetris ...


Это стало моей главной мотивацией и желанием заняться одним из самых сложных видов программирования или разработки программного обеспечения в области компьютерных наук - 3D Game Engine Design. Есть и другие области в области компьютерных наук, которые столь же сложны, однако любые сложные игровые движки, как правило, или обычно включают почти все из них, так как отдельные компоненты или подсистемы требуют своих методов и / или свойств.

У меня был некоторый опыт программирования в школьные годы, но это было ограничено ужасным Visual Basic. Я начал изучать C / C ++ примерно в 2002–2003 годах, и только через несколько лет после того, как окончил среднюю школу в 1999 году. Даже по сей день у меня нет опыта работы в колледже по компьютерным наукам или компьютерным технологиям, но уже через самоотверженность и решительность, я узнал почти все концепции, когда речь идет о компьютерах, оборудовании, программировании, алгоритмах и т. д., и я все еще продолжаю изучать столько, сколько могу ...

В первые дни изучения C / C ++ у меня был доступ к Интернету, но тогда Интернет находился на ранней стадии, таких сайтов, как Amazon, Youtube, Facebook и т. Д., Еще не было, это были времена 56k. наберите модемы, которые убирают вашу телефонную линию, если у вас не было второй выделенной линии. Потребуется несколько минут, чтобы изображение отобразилось на экране, не говоря уже о непрерывном воспроизведении видео.

Поэтому, когда дело дошло до исследований и обучения программированию на C ++, ресурсы были ограничены, и большинство из них были в текстовом формате. Пытаясь заняться проектами с первых дней обучения в Интернете, многие из этих проектов не были полностью завершены, писатели были либо профессионалами, либо студентами колледжа, и они делали много предположений о том, что читатель уже знаком со многими необходимыми понятиями, такими как компиляция , связывание и отладка и интеграция библиотеки.

Для тех, кто ничего не знает об этих темах, они в замешательстве, потому что они не знают, что пошло не так, ни как исправить это, и как заставить это работать должным образом. В те дни у меня было очень много проб и ошибок с очень ограниченными ресурсами. Обращаться за помощью, такой как мы можем теперь с этим сайтом или искать подробные объяснения, которые вы можете найти на cppreference, не было доступно! Если бы вы лично никого не знали, вы бы не обратились за помощью!

С течением времени я кое-где улучшил свои знания, и в конечном итоге интернет перешел на DSL, и теперь высокоскоростной интернет, веб-сайты стали более интерактивными, видео начали появляться, качество видео со временем улучшилось, сайты такие когда начал появляться Youtube, и с исследовательской стороны стало немного легче. Все больше и больше учебных пособий стали доступны, некоторые были хорошими и полезными, в то время как другие учили плохой практике ...

Я также потратил много времени на поиск и приобретение необходимых инструментов для разработки. Мне пришлось изучить синтаксис языка, процесс компиляции и компиляции, компоновку, сборку и отладку. Затем мне пришлось узнать о различных доступных библиотеках и API-интерфейсах, которые существуют, и о том, как настроить мои проекты или решения для связи всех этих зависимостей.

На протяжении многих лет я наблюдал, как язык C ++ рос, развивался и адаптировался с течением времени. В начале он оставался почти таким же на протяжении многих лет, но за последние 10 лет он резко изменился за этот короткий промежуток времени с момента его создания.

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

С тех пор я много лет учил себя на C / C ++ с целью научиться программировать в 3D-графике и проектировать игровой движок. Я потратил 100-1000 часов на поиск, исследование и многое другое на чтение, изучение и применение этих знаний в разработке полезных рабочих продуктов и приложений. У меня всегда было желание и желание узнать больше, чтобы улучшить свои навыки и мастерство.


Это был первый этап, затем я начал читать и работать с DirectX 9.c, что я делал на C / C ++ и даже на C #. Затем я перешел на DirectX 10 и Legacy OpenGL 1.0. Из них вышли DirectX 11 и OpenGL 3.x - 4.x, и теперь я даже попробовал свои силы в Vulkan.

Я создал успешные игровые движки, работающие с различными онлайн-уроками в текстовом и видеоформатах. Я уже говорил, что у меня хороший опыт в математике, но он ограничивался исчислением I и II. Я должен был научить себя Векторному исчислению, о котором у меня были некоторые знания из моего курса физики на основе исчисления в колледже, но что касается линейной алгебры с аффинными преобразованиями и аналитической геометрией, мне пришлось учить их самостоятельно, когда некоторые уравнения, функции, методы, алгоритмы Понятия были необходимы. Затем мне пришлось научиться переводить их в эффективный, читаемый, надежный, многократно используемый код, который был бы по возможности универсальным и не содержал ошибок.

Это было изумительное путешествие, изучающее темы и алгоритмы, которые включают управление памятью, подсчет ссылок, создание экземпляров, рекурсию и многое другое, которые используются во многих, если не во всех компонентах игрового движка, где они обширны. Я мог бы перечислить их все здесь, но этого было бы достаточно, чтобы заполнить 3 или 4 места для ответов. Тем не менее, я включу список общих тем, а не их подтемы.

Здесь представлены темы или список тем, которые состоят из полностью функционального игрового движка, который включает в себя все различные методы рендеринга, настройку конвейеров рендеринга и шейдеров, методы шейдинга и освещения с помощью шейдеров, предварительной и последующей обработки, буферов кадров, обратных буферов. загрузка изображений, загрузка и анализ аудио и моделей, создание примитивных фигур со свойствами цветного материала, текстуры и нормальных координат с ручным отображением текстур, трансформациями объектов, типами камер, иерархиями графов сцен, классами менеджеров для текстур, аудио, шрифтов и шейдеров и управление памятью, система регистрации с обработкой исключений, методы многопоточного и параллельного программирования, сетевое взаимодействие, физический движок, обнаружение столкновений, генератор частиц, анимация, игровой ИИ, генерация ландшафта, небесные рамки и небесные купола, рендеринг воды,листва и многое другое ..., GUI с текстурированным шрифтом для рендеринга текста, наложения HUD, инвентаризации, генерации карт и макросов, системы состояний и конечных автоматов и, наконец, написание синтаксического анализатора для создания собственного языка сценариев для автоматизации большей части этих объектов. возможность изменять значения данных в движке без необходимости перекомпиляции, просто загружая файлы данных, чтобы заполнить объекты данных и структуры в их соответствующих контейнерах при запуске приложения.и, наконец, написание синтаксического анализатора для создания собственного языка сценариев для автоматизации большей части этих объектов, чтобы иметь возможность изменять значения данных в движке без необходимости перекомпиляции, просто загружая файлы данных для заполнения объектов данных и структур в их соответствующих контейнерах при запуске приложения.и, наконец, написание синтаксического анализатора для создания собственного языка сценариев для автоматизации большей части этих объектов, чтобы иметь возможность изменять значения данных в движке без необходимости перекомпиляции, просто загружая файлы данных для заполнения объектов данных и структур в их соответствующих контейнерах при запуске приложения.


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

Время шло, а потом я немного отступил и начал изучать аппаратную эмуляцию. Я сосредоточился конкретно на NES, но хотел изучить аппаратную эмуляцию процессоров в целом. Это привело меня к изучению набора инструкций, в котором я уже знал концепцию, и что это было, так как я был до некоторой степени знаком с семейством Intel x86, но теперь мне пришлось изучать набор инструкций 6502.

Тем не менее, углубившись в это, я закончил тем, что провел больше исследований и начал изучать архитектуру набора инструкций с инженерной точки зрения. Это заставило меня узнать о том, как ЦП строится из логических элементов и как логические элементы строятся из транзисторов вместе с другими различными электрическими компонентами. Так что я узнал об этом с двух сторон сверху вниз и снизу вверх. Оба метода были очень эффективными, и я думаю, что изучение обоих помогает создать тот мост или разрыв, где программное обеспечение сочетается с аппаратным обеспечением.

После этого мне пришлось освежить свою булеву алгебру, и в итоге я узнал о K-картах, таблицах импликации, машинах состояний Мили и Мура, а также о многих других вещах, которые связывают двоичную логику и арифметику с физическими логическими элементами и интегральными схемами. И это подводит меня к недавнему прошлому, когда я начал работать с Logisim и начал изучать HDL, VHDL, Verilog и т. Д.

Я изучал все это в свободное время, когда мог, на протяжении последних 15-18 лет.


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

  • Языки - C ++

  • Учебники и ресурсы по 3D-графике

  • В сериалах и каналах Youtube рассказывается о вышеперечисленных темах, а также об оборудовании, компьютерах и электротехнике. Их слишком много, чтобы перечислить, поэтому я перечислю некоторые из них здесь, которые я считаю наиболее полезными и находчивыми. Я не буду предоставлять ссылки, но вы можете искать YouTube для этих каналов.

    • 3Blue1Brown - Высшая математика
    • Bisqwit - Расширенное программирование на C / C ++ (прикладные проекты) - Эмулятор оборудования NES
    • Джейсон Тернер - Продвинутые современные методы программирования на C ++
    • javidx9 - Расширенное программирование на C / C ++ (проекты приложений) - Эмулятор оборудования NES / Некоторые сборки
    • MIT OpenCourse - курсы колледжа по математике и информатике
    • Bilkent Online Courses - Курсы по компьютерным наукам и вычислительной технике (CPU Design MIPS)
    • The Cherno - Расширенные темы и приложения для программирования на C / C ++ - Разработка игрового движка
    • Ben Eater - Аппаратное обеспечение - Практическое применение через макеты
    • Академия Несо - Аппаратная инженерия - Теория и концепции
    • Socratica - программирование на Python
    • Проще говоря - Аппаратное обеспечение - Теория и концепции
    • Побитовый - Advanced C / C ++ Разработка ассемблера с помощью аппаратной эмуляции
    • Бо Цянь - C ++ Темы в структурах данных и алгоритмах.
    • LineByLine - Вулкан Программирование
    • Джошуа Шакер - Вулкан Программирование
    • www.MarekKnows.com - C ++, 3D Math и разработка игрового движка

И это не принимает во внимание некоторые из различных моих книг по этим темам.

-Примечание- Пожалуйста, не голосуйте по этому вопросу, так как это всего лишь сообщение читателю моего личного опыта, и оно лишено каких-либо попыток ответить или дать ссылку на исходный вопрос. В следующие пару дней, когда у меня будет время; Я добавлю дополнительный ответ, чтобы высказать свои соображения по поводу вопроса ОП, предоставляя полезные ссылки в качестве справочного материала и набора ресурсов, и я также обновлю этот ответ, чтобы включить некоторые ссылки здесь и изменить эту заметку. Уже поздно, и у меня нет времени, чтобы вычитать и редактировать то, что я уже написал. Я сделаю это, когда смогу ».


Я только что обновил этот ответ или пост. Я собирался добавить 2-ую часть, которая фактически ответит на вопрос, однако у меня недостаточно очков репутации, чтобы сделать это. Мне потребуется некоторое время, чтобы набрать необходимые очки репутации, прежде чем я смогу добавить свой второй ответ. Этот пост не является настоящим ответом, но я буду использовать его в качестве справочного материала и искать в таблице обоснование моего истинного ответа. Для преодоления разрыва между программным и аппаратным обеспечением необходимо иметь некоторые из перечисленных выше ресурсов.
Фрэнсис Куглер

-2

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

Конечный автомат принимает входные данные и текущее состояние, пропускает их через логическую (и потенциально арифметическую) логику, а затем предоставляет выходные данные и следующее состояние. Одним из входов может быть регистр команд. Один из выходов может быть разрешением и выбором источника для перезагрузки регистра команд, может также увеличивать или загружать другой регистр, действующий как программный счетчик. С этим, плюс некоторая адресуемая память, вы можете последовательно выполнять инструкции.

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

Часть разработки набора команд просто определяет, какие комбинации битов при декодировании управляют всеми регистрами и последовательностью конечного автомата. Это было сделано и (ре) оптимизировано тысячами разных способов.

Есть по крайней мере 3 уровня университетских учебников по этому нетривиальному предмету.


2
Это не объясняет, как операция MOV включается в двоичное значение. Здесь не упоминается, что инструкция MOV - это значение, это ключевое слово, которое мы используем, поэтому нам не нужно запоминать 16-32-битное двоичное значение.
Ramhound
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.