Як саме ми переходимо від наборів бінарних / шестигранних до наборів інструкцій по збірці?


13

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

Одне здивує мене, хоча .... - як ми "отримуємо" набори інструкцій. Я дещо розумію, як працює Gates / TTL і подібне, але я не бачу, як ми переходимо до того, щоб перейти в mov, add, clr тощо ...?

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

редагувати: Я думаю, для «Чіткість», прикидаюсь, що я розповідаю про перший мікропроцесор, як вони перейшли від Бінарного до фактичного створення набору інструкцій?


2
Кожна інструкція має значення, компілятор перетворює ваш код у ці інструкції, виходячи з структури вашого коду.
Рамхаунд

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

1
пара тісно пов'язані з нею питання programmers.stackexchange.com/questions/81624 / ... і superuser.com/questions/307116 / ...
jhocking

3
як вони перейшли від Бінарного до фактичного створення набору інструкцій? Насправді "вони" не зробили - це навпаки, принаймні загалом. Дизайнер (и) процесора визначають операції, які буде виконувати процесор, потім вони створюють з цього набір інструкцій, а потім вони позначають інструкції (мнемоніка) на опкоди (двійковий код машини). @Scott Whitlock дав хорошу відповідь нижче, я просто хотів звернутися до останньої частини вашого запитання, оскільки ваше припущення, на мій досвід, принаймні відстале.
Радіан

1
Ця справді приємна книга: www1.idc.ac.il/tecs - це те, що мені все пояснило, більшість розділів доступні безкоштовно в Інтернеті. Ви розробляєте свій власний чіп (простою мовою опису апаратних засобів) від воріт nand, потім асемблер, потім компілятор, а потім пишете OS на створеній вами мові! Дивовижні речі, і як хтось без наукового ступеня, це був час, який я добре провів для мене!
bplus

Відповіді:


18

Серцем CPU є ALU . Він відповідає за отримання інструкції (наприклад, MOV), яка є лише деякою заздалегідь визначеною серією двійкових цифр, а також приймає 0, 1 або 2 операнди та виконує відповідну операцію над ними. Найпростішою інструкцією може бути NOP (без операції), який по суті нічого не робить. Ще одна типова операція - ADD (додає два значення).

АЛУ зчитує та записує дані з та до "регістрів". Це невеликі місця пам'яті, які є внутрішніми процесорами. Частина інструкції (від 2 до 3 біт на кожен вхід, залежно від того, скільки у вас є регістрів) вказує, з якого реєстру читати. У процесорі є блоки, що є зовнішніми для ALU, які обробляють завантаження необхідних даних (та інструкції) з пам'яті в регістри і записують результат з регістрів назад в пам'ять. Місце для запису результату також буде закодовано в інші 2 або 3 біти.

Вибір "оп-кодів", що є двійковим номером, що представляє операцію, не є довільним. Добре підібрані опкоди знижують складність АЛУ. Кожен біт або група бітів прагне вмикати та вимикати певні логічні ворота в ALU. Наприклад, інструкція ADD повинна була б дати можливість вихідному етапу вибрати результат внутрішньої логіки додавання. Так само, інструкція MUL обирає результат логіки множення. Залежно від конструкції, цілком ймовірно, що як суматор, так і множинні мікросхеми фактично виконують свою операцію на вхідних операндах, і змінюється лише вибір виходу (те, що записується на вихідні біти АЛУ).


1
Я здогадуюсь, що я прошу, як вони обирають? І як вони насправді беруться за її призначення?

1
@Sauron: Перечитайте ще раз 3-й абзац і спробуйте зрозуміти бінарні арифметичні та цифрові схеми. Я можу представляти набір інструкцій з 256 інструкціями 8-бітовою лінією в цифровій схемі. Це означає, що мені потрібно 8 портів io на моїх апаратних пристроях для передачі всіх можливих станів (2 стану на рядок ^ 8 рядків = 256 можливих станів). Потім процесор може вирішити, що робити з цим цифровим вхідним сигналом. Цифрова схема означає, що у вас є два апаратні стани: Hi і Lo, напруга або відсутність напруги. Ось звідки походить бінарне. Бінарне представництво - це найбільш близьке до металу.
Сокіл

3
@Sauron - знайдіть цифрові мультиплексори, щоб побачити, як цифровий ланцюг може вибрати одне з кількох значень. Якщо у вас є 8-бітна шина, вам просто потрібно 8 цих двійкових цифрових мультиплексорів паралельно.
Скотт Вітлок

1
@Falcon Добре ....... Я думаю, що це має більше сенсу. Я постійно забуваю, що врешті-решт все зводиться до бінарних сигналів .... і навіть така інструкція, як "mov", все ще представлена ​​як двійкова.

1
@Sauron - Проведіть деякі дослідження процесора, це допоможе вам зрозуміти, що таке коди операцій та як вони працюють. Чому обрані певні коди оп не важливо, навіть не задаючи питання "чому", не має великого сенсу. Розуміння того, як вони обираються, може допомогти вам зрозуміти більше про процесор та його структуру.
Рамхаунд

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 (усі у двійковій формі) у поєднанні з полем реєстрації. Тож ви можете бачити, як використовується шаблон для спрощення логіки.

Найперші комп'ютерні програми були написані вручну, кодуючи вручну 0 і 0, щоб створити програму машинною мовою. Потім це було запрограмовано в ПЗУ (пам'ять лише для читання). Зараз програми, як правило, записуються на флеш-пам'ять, що стирається електричним способом, у разі мікроконтролерів або в оперативній пам'яті не вистачає оперативної пам'яті, якщо мікропроцесори. (Останній ще потребує певної пам’яті лише для читання для завантаження.)

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

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

Оскільки перший мікропроцесор був розроблений задовго після того, як мейнфрейми та мінікомп'ютери були навколо, а 4004 взагалі не підходив для роботи асемблера, Intel, ймовірно, написала крос-асемблер, який працював на одному з його великих комп'ютерів, і переклав код складання для 4004 у бінарне зображення, яке можна запрограмувати в ROM.


4

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

Я зроблю все можливе, щоб підсумувати:

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

То як ми це досягнемо? Як вже було сказано, ми можемо скористатися цифровою логікою низького рівня та створити мультиплексори для різних шляхів. Мультиплексорами керують за допомогою набору бітів для введення - звідки ці біти взяті? Зашифровані з самих інструкцій. Винос: Інструкції, такі як mov, add і т. Д., - це лише набір бітів, який повідомляє процесору, як налаштувати шлях для конкретної операції. Те, що ви читаєте (mov, add) - це читана людиною форма (мова складання), і наша програма визначає процедуру шляхів даних та операцій.

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


3

якщо я розумію ваше запитання, я не розумію, як пов’язані бін / шестигранник або збірка.

Я припускаю, що м'ясо вашого питання полягає в тому, як мені дістатись до основних воріт, І, АБО НЕ, до таких інструкцій, як переміщення, завантаження, зберігання, додавання тощо.

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

Шукайте книгу Кодексу (щось щось щось) від Petzold. Може почати шлях до елементарного, але поволі ви пройдетесь ні з чим, що стосується комп’ютерів та електроніки, у бінарні, шестигранні та основні ворота тощо.

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

Дозвольте зупинитися і запитати вас, як ви пишете програму? Починаючи з порожнього екрана текстового редактора? Ви маєте деяке уявлення про завдання, яке ви намагаєтеся вирішити, які вам можуть знадобитися змінні, функції, мова програмування і т. Д. І кожна людина відрізняється, але певною мірою ви цим займаєтеся (скажімо, визначаючи та пишете функції), трохи цього (створення файлів заголовків із багаторазовим використанням визначає, перераховує, структури та ін.), і трохи іншого (просто код, заповнення функцій змінними та кодом). А ви обертаєтесь навколо різних завдань, врешті-решт відчуваєте, що маєте баланс розміру коду, швидкості, читабельності, якості, функціональності тощо. Нічого не відрізняється від апаратного дизайну. конструктори апаратних засобів також використовують мови програмування (vhdl, verilog) і проходять той же процес,

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

Таким чином, ви придумали якийсь набір інструкцій з нуля, ви використали певний досвід розробки апаратних засобів, щоб згрупувати подібні інструкції з подібними бітовими моделями, щоб їх було легше розшифрувати, не тільки для програмування мовою апаратних засобів, але це економить енергію та ворота та все таке Хороший матеріал. У наші дні ви зробили б якийсь симулятор, я розумію, що ARM був спочатку програмним симулятором, а потім апаратні конструкції з'явилися пізніше, не знаю, чи це правда, але дотримуйтесь цієї історії. Це залежить від команди, яку деякі команди можуть бути просто апаратними людьми і хочуть просто вступити в програмування в hdl, деякі, як я, можуть захотіти зробити і те і інше. У наші дні доступні хороші тренажери мови апаратних засобів, тому вам не доведеться будувати будь-яке обладнання, яке ви компілюєте та моделюєте, і велику частину налагодження здійснюєте за допомогою програмного забезпечення / пакету апаратного моделювання. команда програмного забезпечення може розробити асемблери та компілятори для набору інструкцій та за допомогою імітованих програм подачі ram та 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-elses, є компілятор, який приймає апаратний код мови програмування і перетворює його в логічні рівняння.

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

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

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

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


Це справді не відповідає на запитання автора, принаймні нічого не додає до дискусії, що прийнята відповідь не охоплює. Ваша двійкова математика не на 100% правильна, 1 + 1 - це 0 з переливом 1. Залежно від розміру реєстру це буде або 2, або 0.
Рамхаунд

@dwelch DAMN! Я твій шанувальник серця, якщо не менше. +1
AceofSpades

2

Процесори працюють на 0 і 1. Усі інструкції мали послідовність бітів, яка їх визначала. Це був машинний код. Що важко людям читати і писати. В якості першого кроку ми згрупували 0 і 1 в 4 бітові послідовності і використали від 0 до F для їх представлення. Це зменшило число, яке нам довелося запам’ятати, але все-таки запам'ятати шестнадцятковий код для інструкцій все-таки було непросто.

Тож ми почали використовувати збірку, яка мала такі слова, як MOV та ADD. Ассемблер замінить інструкції правильним набором 0 'та 1, перетворивши збірку "список" на машинний код.

Врешті-решт ми розробили "мови вищого рівня", де "інструкції" могли представляти цілі послідовності машинного коду.


FYI, восьмеричний використовувався як двійковий скорочення перед шістнадцятковим.
ocodo

Slomojo правильний, Octal, база 8 використовувала 3 біти, використовувалася разом із шестигранною, у базовій 16 - 4 біти. Октал мав перевагу в тому, що всі знали, що цифри від 0 до 7 представляють. Люди, як не вживали Hex, часто містифікувались "цифрами" від A до F.
Jim C

0

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


Частина 1: -Preface-

Трохи про себе:

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

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

Я граю у відеоігри, коли мені було близько 3 чи 4 років. У дитинстві я мав Atari, NES, Sega Genesis та PS1. Коли я дорослішав і в кінці підлітків і на початку 20-х років придбав PS2 і SNES з кращими вибраними назвами. Це також не враховує ігор на ПК, що йде так само, як Doom!

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

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

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

Мені завжди було захоплення не лише хотіти знати, як працюють електронні пристрої в мікросхемі на цифровому та логічному рівні, щоб навчитися програмувати комп’ютер, але я завжди мав бажання хочу зробити власне відео ігри. Ще на початку 90-х я хотів зробити ігри Frogger та Tetris ...


Це стало моєю провідною мотивацією та бажанням вирішити один із найскладніших типів програмування або розробки програмного забезпечення в галузі комп'ютерних наук, а це - 3D Game Engine Engine. Існують інші сфери в галузі комп'ютерних наук, які є настільки ж жорсткими, однак будь-які складні ігрові двигуни зазвичай або зазвичай включають майже всі з них, оскільки окремі компоненти або допоміжні двигуни вимагають своїх методів та властивостей.

У моїх середніх школах я мав певний досвід програмування, але це було обмежено жахливим Visual Basic. Я почав збирати і вивчати C / C ++ приблизно в 2002 - 2003 роках, лише через кілька років після того, як я закінчив середню школу в 1999 році. Навіть до цього часу я не маю досвіду класу коледжу в галузі комп’ютерних наук або комп'ютерної інженерії, але через відданість і рішучість, я навчився майже будь-якої концепції, що стосується комп'ютерів, апаратних засобів, програмування, алгоритмів тощо, і я все ще продовжую вчитися стільки, скільки можу ...

У перші дні навчання C / C ++ у мене був доступ до Інтернету, але Інтернет тоді був на ранній стадії, веб-сайти, як Amazon, Youtube, Facebook тощо, ще не існували, це були ще дні 56k набирайте модеми, які підтримують вашу телефонну лінію, якщо у вас не було другої спеціальної лінії. Минуло б кілька хвилин, щоб зображення вийшло на екран, незважаючи на постійне відтворення відео.

Тож коли мова зайшла про дослідження та вивчення програми програмування на C ++, ресурси були обмежені, а більшість - у текстовому форматі. Намагаючись вирішити проекти з ранніх навчальних днів в Інтернеті, багато з цих проектів були не повністю завершені, письменники були або професіоналами, або студентами коледжу, і вони зробили багато припущень, що читач уже знайомий з багатьма необхідними поняттями, такими як компіляція. , з'єднання та налагодження та інтеграція бібліотек.

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

З часом я вдосконалював деякі свої знання тут і там, і врешті-решт Інтернет покращився до DSL, і тепер високошвидкісний Інтернет, веб-сайти стали більш інтерактивними, відео почали з’являтися, якість відео з часом покращувалася, сайти такі як Youtube почав з’являтися, і все стало трохи простіше з боку досліджень. Все більше та більше навчальних посібників стали доступними, деякі були хорошими та корисними там, де інші навчали поганій практиці ...

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

Протягом багатьох років я спостерігав, як мова С ++ росте, розвивається і адаптується з часом. На початку він залишався майже таким же довгі роки, але за останні 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, і тепер я навіть спробував свої сили у Вулкані.

Я створив успішні ігрові двигуни, що працюють через різні підручники в Інтернеті як у текстовому, так і у відеоформаті. Я вже заявив, що в мене є сильний досвід математики, але це було обмежено обчисленням I & II. Мені довелося навчати себе «Векторний обчислення», про яке я мав деякі знання з мого класу фізики в коледжі, але щодо лінійної алгебри з аффінними перетвореннями та аналітичною геометрією я повинен був вивчити їх самостійно, коли певні рівняння, функції, методи, алгоритми та потрібні були концепції. Тоді мені довелося навчитися переводити їх у ефективний, читабельний, надійний, багаторазовий код, який був загальним та без помилок, вкладаючи сотні та тисячі годин налагодження.

Це дивовижне подорож вивчало теми та алгоритми, які включають управління пам’яттю, підрахунок посилань, інстанціювання, рекурсію та багато іншого, які використовуються в багатьох, якщо не всіх компонентах ігрового двигуна, де їх величезна кількість. Я міг би перерахувати їх усіх тут, але цього було б достатньо інформації, щоб заповнити 3 або 4 місця для відповідей, які варто написати. Однак я включатиму перелік загальних тем, а не їх підтемати.

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


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

Час тривав, і тоді я збоку трохи відступив і почав вникати в емуляцію апаратури. Я спеціально зосередився на NES, але хотів навчитися апаратній емуляції процесора взагалі. Це підштовхнуло мене до вивчення набору інструкцій, в якому я вже знав цю концепцію, і що це таке, оскільки я певною мірою був знайомий з сімейством x86 Intel, але тепер мені довелося вивчити набір інструкцій 6502.

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

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

Я все це вчився у вільний час, коли міг протягом останніх 15 - 18 років.


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

  • Мови - C ++

  • Підручники з 3D графікою та веб-сайти з ресурсами

  • Серії та канали Youtube стосуються вищезазначених тем, а також обладнання, комп’ютер та електротехніку. Занадто багато їх для переліку, тому я перерахую декілька з них, які я вважаю найбільш корисними та винахідливими. Я не надаватиму посилання, але ви можете шукати на YouTube на цих каналах.

    • 3Blue1Brown - Розширена математика
    • Bisqwit - Розширене програмування на C / C ++ (прикладні проекти) - апаратний емулятор NES
    • Джейсон Тернер - сучасні сучасні методи програмування на C ++
    • javidx9 - розширене програмування на C / C ++ (прикладні проекти) - апаратний емулятор NES / деяка збірка
    • MIT OpenCourse - Курси коледжу з математики та інформатики
    • Онлайн курси Bilkent - Курси коледжів з інформатики та комп'ютерної техніки (MIPS Design MIPS)
    • Теми та програми програмування на програмі Cherno - Advanced C / C ++ - Розробка ігрового двигуна
    • Ben Eater - Обладнання інженерії - Практичне застосування через Хлібні дошки
    • Академія Несо - Обладнання інженерії - теорія та поняття
    • Socratica - програмування Python
    • Простіше кажучи - Обладнання інженерії - теорія та поняття
    • Побітове розширення C / C ++ Проектування асемблера за допомогою апаратної емуляції
    • Bo Qian - C ++ Теми в структурах даних та алгоритмах.
    • Програмування LineByLine - Вулкан
    • Джошуа Шукер - програмування Вулкана
    • www.MarekKnows.com - C ++, розробка 3D математики та ігрових механізмів

І вони не враховують деяких книг, які я маю на ці теми.

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


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

-2

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

Державна машина приймає входи та поточний стан, запускає їх за булевою (і потенційно арифметичною) логікою, а потім забезпечує виходи та наступний стан. Одним із входів може бути регістр інструкцій. Одним з виходів може бути включення та вибір джерела для перезавантаження реєстру інструкцій, можливо також збільшення або завантаження іншого регістра, що виступає лічильником програми. З цим, плюс деяка адресна пам'ять, ви можете послідовно виконувати вказівки.

Після того, як у вас з'явиться спосіб послідовних інструкцій, ви можете використовувати логіку для декодування цих бітів інструкцій, плюс поточний стан, в іншу купу контрольних бітів. Деякі з цих контрольних бітів можуть виконувати функції вхідних даних для керування набором логіки, яка може виконувати арифметичну та загальнонаціональну логіку, називаючи це АЛУ. Інші біти можуть завантажувати матеріали або вибирати входи для ALU. Інші біти можуть сказати, де зберігати результати АЛУ. Або завантажте адреси регістрів. Або записати в пам'ять або інші виходи. І т.д.

Частина проектування набору інструкцій - це лише з'ясування, які комбінації бітів при їх розшифровці керують усіма регістрами та послідовністю машинного послідовності. Це було зроблено і (пере) оптимізовано тисячі різних способів.

Існує щонайменше 3 рівня університетських підручників з цієї нетривіальної теми.


2
Це не пояснює, як операція MOV прикривається бінарним значенням. Тут не згадується інструкція Операція MOV - це значення, ключове слово, яке ми використовуємо, тому нам не потрібно запам'ятовувати бінарне значення від 16 до 32 біт.
Рамхаунд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.