Обсуждение игр для изучения программирования на ассемблере и почему изучение ассемблера актуально и сегодня.

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

Чтобы уточнить, это не предназначено как способ изучения программирования на ассемблере в реальном мире, например, как программировать микропроцессор Intel x86 или ARM.

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

Разве кодирование на ассемблере не устарело?

да. Так зачем этому учиться?

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

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

Мой интерес к этому начался с обучения программированию моих детей. Обучаю их программированию на Джулии, царапинам и MakeCode. Однако это очень похоже на математику и абстрактно. Это не дает моим детям четкого представления о том, как на самом деле работают компьютеры.

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

Итак, вот список способов изучить программирование на ассемблере и мой опыт работы с различными вариантами.

Компьютер Маленький Человек

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

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

Этот парень бегает и выполняет инструкции, как процессор выполняет инструкции программы в памяти.

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

Машина человеческих ресурсов

Эта игра подходит для детей, так как они находят в ней забавные персонажи. Однако это непростая игра. Я должен сидеть с детьми и помогать им.

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

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

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

ТИС-100

Zachtronics делают кучу головоломок наподобие обучающих игр. ТИС-100 - одна из первых их игр по программированию.

Это очень похоже на концепцию Little Man Computer с некоторыми особенностями:

  • У вас не один процессор для программирования, а несколько, которые обмениваются данными друг с другом.
  • У вас нет памяти. У вас есть несколько регистров ЦП, которые нужно использовать с умом.

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

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

На скриншоте видно, что каждый ЦП (или узел) подключен к множеству других узлов. Внутри них можно писать небольшие программы на ассемблере. Ассемблерный код очень похож на Little Man Computer (LMC).

Вот пример:

MOV 8, ACC   # Put number 8 in accumulator
MOV LEFT     # Add number from left node to ACC
MOV ACC, RIGHT # Move number in ACC to right node

Выучить ассемблерный код довольно быстро. Инструкций не так много. У вас всего два регистра ACC и BAK.

У вас есть только следующие категории инструкций:

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

Шэньчжэнь I / O

Shenzhen I / O расширяет идеи, разработанные в TIS-100, но превращает его во что-то, что немного больше похоже на игру.

Предыстория здесь состоит в том, что вас наняли делать дрянные маленькие электронные устройства в Шэньчжэне, Китай.

Это может быть фальшивая камера наблюдения или рекламный щит, который должен оживлять свет.

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

Программирование в этом случае очень похоже, но с некоторыми особенностями, отличающими его от TIS-100:

  • Вместо единых узлов с одинаковыми способностями. У вас есть маленькие микроконтроллеры с разными размерами вывода и памятью для ассемблерного кода.
  • В отличие от TIS-100 вы явно подключаете эти микроконтроллеры друг к другу.
  • Поскольку мы имеем дело с системами реального времени, время стало проблемой. Следовательно, есть инструкция сна slp.

Некоторое поведение ассемблерного кода в Shenzhen I / O напоминает то, что называется условным исполнением на микропроцессорах ARM. Вот пример из руководства ARM:

ADD     r0, r1, r2    ; r0 = r1 + r2, don't update flags
ADDS    r0, r1, r2    ; r0 = r1 + r2, and update flags
ADDSCS  r0, r1, r2    ; If C flag set then r0 = r1 + r2, 
                      ; and update flags
CMP     r0, r1        ; update flags based on r0-r1.

По сути, вы можете добавить суффикс к инструкциям ARM, чтобы они выполнялись условно. Например. инструкция ADD будет добавлять два числа каждый раз. В то время как ADDEQ будет добавляться только в том случае, если предыдущие два числа проверены, где они равны (EQ). Если вы хотите, чтобы он выполнялся, если они не равны (NE), вы должны написать ADDNE.

В ассемблерном коде ввода-вывода Шэньчжэня есть изюминка.

teq acc 0
+ teq p0 100
+ mov 1 x1
- mov 0 x1
  mov p0 acc
  slp 1

В небольшой программе выше вы можете заметить, что перед некоторыми инструкциями есть метки (+) и (-). Это для условного исполнения. teq acc 0 проверяет, равен ли регистр acc 0.

Инструкция + teq p0 100 выполняется только в том случае, если предыдущий тест был верным.

- mov 0 x1, с другой стороны, выполняется только в том случае, если предыдущий тест был ложным.

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

Хотя даже более современный RISC-процессор, такой как RISC-V, не имеет таких инструкций.

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

Симуляторы Маленького Человека

Поскольку LMC настолько проста, я реализовал свой собственный симулятор LMC, ассемблер и дизассемблер в Julia. Вы можете проверить это здесь". Это всего 200 строк кода.

Чтобы быстро опробовать это, вы также можете использовать один из этих двух веб-симуляторов:

Сердечный ЦП

Это был простой процессор, работавший на картоне еще в 1960-х годах. С тех пор для него сделали симулятор.

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

Подробнее про Кардиологический читайте здесь.

Процессор Notch's DCPU-16

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

Одним из интересных моментов является то, что его спецификация содержала идею области памяти для графики, а это означало, что с помощью эмуляторов или симуляторов DCPU-16 вы могли создавать простую растровую графику. В Интернете полно различных эмуляторов DCPU-16, созданных разными людьми. Вот один из примеров эмулятора DCPU-16 на веб-странице.

С полной спецификацией DCPU-16 можно ознакомиться здесь. Вот некоторые из кодов операций, поддерживаемых этим процессором, чтобы получить представление о них:

  • SET b, a устанавливает b в a.
  • ADD b, a устанавливает b в a + b
  • IFE b, a выполнить следующую инструкцию, если b == a
  • IFG b, a выполнить следующую инструкцию, если b > a

Последние мысли

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

Я попытаюсь основать эту статью на simplecpudesign.com, который реализует действительно минимально сложный ЦП.

Но я воспользуюсь возможностью поговорить немного подробнее о том, как вы на самом деле соединяете логические элементы AND, OR и NAND для создания таких вещей, как сумматоры, декодеры и т. Д., Из которых состоит ЦП.

Я хочу получить более подробную информацию, например, о вроде того, как ЦП декодирует инструкцию и переключает различные функции в ALU (Arithmetic Logic Unit). Не волнуйтесь, если сейчас ни один из этих жаргонов не имеет для вас никакого смысла. Об этом и пойдет речь в следующей статье. Чтобы объяснить многое из внутреннего устройства ЦП.