Оглавление:

Кодирование и тестирование компьютера на машинном языке: 6 шагов
Кодирование и тестирование компьютера на машинном языке: 6 шагов

Видео: Кодирование и тестирование компьютера на машинном языке: 6 шагов

Видео: Кодирование и тестирование компьютера на машинном языке: 6 шагов
Видео: Разнёс чужой код за 15 секунд. Часть 1 #код #айти #программирование #рефакторинг 2024, Ноябрь
Anonim
Image
Image

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

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

Для компьютерного дизайна я адаптировал один из моей электронной книги Kindle «Собери свой компьютер - с нуля». Я начал с описанного здесь компьютера BYOC и сократил его до различных базовых BYOC-I (I для инструктируемого), которые мы будем использовать в этом руководстве.

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

Дальнейшее чтение

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

Шаг 1: Список деталей

Иерархия и коды машинного языка
Иерархия и коды машинного языка

Список запчастей короткий. Требуются только эти два элемента, оба загружаемые бесплатно:

  1. «Logisim-win-2.7.1.exe» - Logisim - популярный и простой в использовании логический симулятор. Загрузите исполняемый файл Logisim отсюда и создайте ярлык в удобном месте, например, на рабочем столе. Дважды щелкните значок Logisim, чтобы запустить его. Примечание. Logisim использует пакет времени выполнения Java, расположенный здесь. Вас могут попросить загрузить его.
  2. BYOC-I-Full.cir "- Загрузите файл схемы Logisim ниже.

Запустите Logisim, затем нажмите «File-Open» и загрузите файл BYOC-I-Full.cir. На изображении выше показана рабочая среда Logisim. BYOC-I представлен блоком подсхемы. Внешне подключены два входа, Reset и Run, и шестнадцатеричные дисплеи для регистров BYOC-I и программной памяти.

Программная память BYOC-I предварительно загружена простой программой, которая считает от 1 до 5 в регистре A. Чтобы запустить (Запустить) программу, выполните следующие действия.

Шаг 1 - Щелкните по инструменту Poke Tool. Курсор должен измениться на тычащий «палец». Шаг 2 - Дважды нажмите на вход сброса, один раз изменив его на «1» и еще раз, чтобы снова изменить его на «0». Это сбрасывает BYOC-I для запуска программы по адресу 0. Шаг 3 - Нажмите на вход Run один раз, чтобы изменить его на «1». Регистр A должен показывать, что счетчик изменяется от 1 до 5, а затем повторяется. Шаг 4 - Если программа не выполняется, нажмите Ctrl-K, и она должна запуститься.

Если вы хотите изучить возможности Logisim, щелкните ссылку «Справка» в строке меню. Оттуда вы можете изучить «Учебное пособие», «Руководство пользователя» и «Справочник по библиотеке» Logisim. Здесь можно найти отличное видео-введение.

Шаг 2. Иерархия и коды машинного языка

Иерархия и коды машинного языка
Иерархия и коды машинного языка

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

В качестве пояснения мы начнем с кодов и перейдем к программному уровню. Затем мы закодируем простую программу, загрузим ее в память BYOC-I и выполним.

Коды состоят из фиксированного числа двоичных (1 и 0) цифр или битов, для краткости. Например, в таблице ниже показаны все возможные коды (всего 16) для кода шириной 4 бита. Рядом показан шестнадцатеричный код (с основанием 16) и его десятичный эквивалент. Шестнадцатеричный используется для обозначения двоичных значений, поскольку он более компактен, чем двоичный, и его легче преобразовать из двоичного кода, чем из десятичного. Префикс «0x» позволяет узнать, что следующее за ним число является шестнадцатеричным или для краткости «шестнадцатеричным».

Двоичное - Шестнадцатеричное - Десятичное

Ширина кода определяет, сколько элементов может быть представлено. Как уже отмечалось, приведенный выше 4-битный код может представлять до 16 элементов (от 0 до 15); то есть, 2 умножить на 2, взятые четыре раза, или 2 в 4-й степени равно 16. В общем, количество представимых элементов равно 2 в n-й степени. Вот краткий список возможностей n-битного кода.

n - Количество элементов 1 22 43 84 165 326 647 1288 256

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

Код типа инструкции (tt) Существует четыре типа инструкций: (1) MVI - немедленно переместить 8-битное постоянное значение в регистр памяти. Регистр памяти - это устройство, которое хранит данные, которые будут использоваться для вычислений, (2) MOV - перемещение данных из одного регистра в другой, (3) RRC - выполнение вычисления между регистрами и (4) JMP - переход к другой инструкции вместо перехода к следующей инструкции. Принятые коды типов инструкций BYOC-I следующие:

00 MVI01 MOV10 RRC11 JMP

Код регистра (dd и ss) BYOC-I имеет четыре 8-битных регистра, способных хранить значения от 0 до 255. 2-битного кода достаточно для обозначения четырех регистров:

00 F регистр 01 E регистр 10 D регистр 11 A регистр

Расчетный код (ccc) BYOC-I поддерживает четыре арифметических / логических операции. Чтобы обеспечить возможность расширения до восьми вычислений в будущем, используется 3-битный код:

000 ADD, сложите два 8-битных значения в назначенных регистрах и сохраните результат в одном из регистров 001 SUB, вычтите два 8-битных значения в назначенных регистрах и сохраните результат в одном из регистров 010-011 Зарезервировано для будущего использования 100 И, логически И два 8-битных значения в назначенных регистрах и сохранить результат в одном из регистров 101 ИЛИ, логически ИЛИ два 8-битных значения в назначенных регистрах и сохранить результат в одном из регистров с 110 по 111, Зарезервировано для будущего использования

Код перехода (j) 1-битовый код, который указывает, является ли переход безусловным (j = 1) или обусловлен ненулевым результатом вычисления (j = 0).

Код данных / адреса (v… v) / (a… a) 8-битные данные могут быть включены в определенные инструкции, представляющие значения от 00000000 до 11111111 или от 0 до 255 в десятичном виде. Эти данные имеют ширину 8 бит для хранения в 8-битных регистрах BYOC-I. В десятичной арифметике мы не показываем ведущие нули. С помощью компьютерной арифметики мы показываем ведущие нули, но они не влияют на значение. 00000101 численно совпадает с десятичным числом 101 или 5.

Рекомендуемые ссылки

Двоичная нотация - https://learn.sparkfun.com/tutorials/binary Шестнадцатеричная нотация -

Дальнейшее чтение

Идея использования кодов для управления процессом возникла очень давно. Один из ярких примеров - жаккардовый ткацкий станок. Автоматизированный ткацкий станок управлялся цепочкой деревянных карт, в которых просверливались отверстия, обозначающие коды пряжи разного цвета для ткачества. Свой первый я увидел в Шотландии, где из него делали разноцветные тартаны. Узнайте больше о жаккардовых ткацких станках здесь.

Шаг 3: Анатомия инструкций BYOC-I

Анатомия инструкций BYOC-I
Анатомия инструкций BYOC-I

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

Тип инструкции MVI требует наибольшее количество бит, всего 12. Сделав командное слово длиной 12 бит, мы приспособим все инструкции. Неиспользуемым (так называемым «безразличным») битам присваивается значение 0. Вот набор инструкций BYOC-I.

  1. Move Immediate (MVI) - 00 dd vvvvvvvv Функция: Переместить 8-битное значение данных V = vvvvvvvv в регистр назначения dd. После выполнения регистр dd будет иметь значение vvvvvvvv. Сокращение: MVI R, V, где R - это A, D, E или F. Пример: 00 10 00000101 - MVI D, 5 - Переместите значение 5 в регистр D.
  2. Переместить регистр в регистр (MOV) - 01 dd ss 000000 Функция: Переместить данные из исходного регистра ss в регистр назначения dd. После выполнения оба регистра имеют то же значение, что и исходный регистр. Сокращение: MOV Rd, Rs, где Rd - регистр назначения A, D, E или F, а Rs - регистр источника A, D, E или F. Пример: 01 11 01 000000 - MOV A, E - Переместить значение в регистре E для регистрации A.
  3. Register to Register Calculation (RRC) - 10 dd ss ccc 000 Функция: Выполнение назначенного вычисления ccc с использованием регистра источника ss и регистра назначения dd, а затем сохранение результата в регистре назначения. Сокращения: ADD Rd, Rs (ccc = 000 Rd + Rs, сохраненные в Rd); SUB Rd, Rs (ccc = 001 Rd - Rs хранятся в Rd); AND Rd, Rs (ccc = 100 Rd AND Rs, хранящиеся в Rd); ИЛИ Rd, Rs (ccc = 101 Rd ИЛИ Rs хранится в Rd). Пример: 10 00 11 001 000 - SUB F, A - Вычесть значение в регистре A из регистра F с результатом в регистре F.
  4. Перейти к другой инструкции (JMP) - 11 j 0 aaaaaaaa Функция: изменить выполнение на другую инструкцию, расположенную по адресу aaaa aaaa (a) Безоговорочно (j = 1) -11 1 0 aaaaaaaa Сокращение: JMP L, где L - адрес aaaa aaaa Пример: 11 1 0 00001000 - JMP 8 - Изменить выполнение на адрес 8. (b) Условно (j = 0), когда предыдущий расчет дал ненулевой результат - 11 0 0 aaaaaaaa Сокращение: JNZ L, где L - адрес aaaa aaaa. Пример: 11 0 0 00000100 JNZ 4 Если последнее вычисление дало ненулевое значение, измените выполнение на адрес 4.

Биты командного слова нумеруются слева (старший значащий бит) вправо (младший значащий бит) от 11 до 0. Фиксированный порядок и расположение кодов следующие:

Биты - Код11-10 Тип команды 9-8 Регистр назначения7-6 Регистр источника5-3 Расчет: 000 - добавить; 001 - вычесть; 100 - логическое И; 101 - логическое ИЛИ7-0 Постоянное значение v… v и a… a (от 0 до 255)

Набор инструкций представлен на рисунке выше. Обратите внимание на структурированный и упорядоченный вид кодов в каждой инструкции. В результате BYOC-I имеет более простую конструкцию и делает инструкции более понятными для человека.

Шаг 4: Написание компьютерной инструкции

Кодирование компьютерной инструкции
Кодирование компьютерной инструкции

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

1. Переместите значение 1 в регистр A. Регистры BYOC-I могут хранить значения от 0 до 255. В этом случае регистр A будет иметь значение 1 (00000001 двоичное) после выполнения инструкции.

Аббревиатура: MVI A, 1 Требуемые коды: Тип MVI - 00; Регистр назначения A - 11; Значение - 00000001 Слово инструкции: 00 11 00000001

2. Переместите содержимое регистра A в регистр D. После выполнения оба регистра будут иметь значение первоначально в регистре A.

Сокращение: MOV D, A (помните, что пункт назначения является первым, а источник - вторым в списке) Требуемые коды: Тип MOV - 01; Регистр назначения D - 10; Регистр источника A - 11 Слово команды: 01 10 11 000000

3. Добавьте содержимое регистра D в регистр A и сохраните его в регистре A. После выполнения значение регистра A будет суммой исходного значения регистра A и регистра D.

Сокращение: ADD A, D (результат сохраняется в регистре назначения) Необходимые коды: Тип RRC - 10; Регистр назначения A - 11; Регистр источника D - 10; Добавить в расчет - 000 Слово инструкции: 10 11 10 000 000 (ccc - это первая 000 - добавить)

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

Сокращение: JNZ 3 Требуемые коды: Тип JMP - 11; Тип прыжка - 0; Адрес - 00000003 Слово команды: 11 0 0 00000003 (тип перехода - первый 0)

5. Безусловный переход к адресу 0. После выполнения выполнение изменяется на инструкцию по данному адресу.

Сокращение: JMP 0 Требуемый код: Тип JMP - 11; Тип прыжка - 1; Адрес - 00000000 Слово инструкции; 11 1 0 00000000

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

Шаг 5: Анатомия компьютерной программы

Анатомия компьютерной программы
Анатомия компьютерной программы

Компьютерная программа - это список инструкций, которые компьютер выполняет, начиная с начала списка и продолжая вниз по списку до конца. Такие инструкции, как JNZ и JMP, могут изменить, какая инструкция будет выполняться следующей. Каждая инструкция в списке занимает один адрес в памяти компьютера, начиная с 0. Память BYOC-I может содержать список из 256 инструкций, что более чем достаточно для наших целей.

Компьютерные программы предназначены для выполнения данной задачи. Для нашей программы мы выберем простую задачу, считая от 1 до 5. Очевидно, что нет инструкции «подсчет», поэтому первый шаг - разбить задачу на шаги, которые могут быть обработаны самим BYOC-I. ограниченный набор инструкций.

Шаг 1 Переместите 1 в регистр AS Шаг 2 Переместите регистр A в регистр DS Шаг 3 Добавьте регистр D в регистр A и сохраните результат в регистре AS Шаг 4 Переместите 5 в регистр ES Шаг 5 Вычтите регистр A из регистра E и сохраните результат в регистре ES Шаг 6 Если результат вычитания не был равен нулю, вернитесь к шагу 4 и продолжите счет Шаг 7 Если результат вычитания был нулевым, вернитесь назад и начните заново

Следующим шагом является перевод этих шагов в инструкции BYOC-I. Программы BYOC-I начинаются с адреса 0 и номера последовательно. Адреса переходов добавляются последними после ввода всех инструкций.

Адрес: Инструкция - Аббревиатура; Описание 0: 00 11 00000001 - MVI A, 1; Переместите 1 в регистр A1: 01 10 11 000000 - MOV D, A; Переместите регистр A в регистр D2: 10 11 10 000 000 - ADD A, D; Добавить регистр D к регистру A и сохранить результат в регистре A3: 00 01 00 00000101 - MVI E, 5; Переместить 5 регистр E4: 10 01 11 001 000 - SUB E, A; Вычесть регистр A из регистра E и сохранить результат в регистре E5: 11 0 0 00000010 - JNZ 2; Если результат вычитания не был нулевым, вернитесь к адресу 3 и продолжите счет 6: 11 1 0 00000000 - JMP 0; Если результат вычитания был нулевым, вернитесь и начните заново

Перед переносом программы в память, двоичный код инструкции должен быть изменен на шестнадцатеричный для использования с редактором Logisim Hex Editor. Сначала разделите инструкцию на три группы по 4 бита в каждой. Затем переведите группы в шестнадцатеричный, используя таблицу на шаге 2. Будут использоваться только последние три шестнадцатеричные цифры (выделены жирным шрифтом ниже).

Адрес - Двоичный код команды - Двоичный раздел команды - Инструкция (шестнадцатеричный) 0 001100000001 0011 0000 0001 - 0x03011 011011000000 0110 1100 0000 - 0x06C02 101110000000 1011 1000 0000 - 0x0B803 000100000101 0001 0000 0101 - 0x01054 100111001 0001 0000 0101 - 0x01054 100111001 0001 0000 0101 - 0x01054 1001110000 11000000 0x0109 01000000 - 001000 01100 - 009 111000000010 1110 0000 0000 - 0x0E00

Пришло время перенести программу в память BYOC-I для тестирования.

Шаг 6: перенос программы в память и тестирование

Перенос программы в память и тестирование
Перенос программы в память и тестирование
Перенос программы в память и тестирование
Перенос программы в память и тестирование

Глядя на «главную» схему Logisim, показанный блок BYOC-I является символом реальной компьютерной схемы, обозначенным «BYOC-I» в Панели проводника. Чтобы ввести программу в память BYOC-I:

  1. Щелкните правой кнопкой мыши блок BYOC-I (называемый «подсхемой») и выберите (наведите курсор мыши и щелкните левой кнопкой мыши) «Просмотр BYOC-I».
  2. Контур BYOC-I появится в Рабочей области. Щелкните правой кнопкой мыши символ «Память программ» и выберите «Редактировать содержимое …».
  3. Используя шестнадцатеричный редактор Logisim, введите шестнадцатеричный код (только жирный шрифт), как показано выше.

Теперь вы готовы к выполнению программы. Вернитесь к главной цепи, дважды щелкнув «BYOC-I» на панели проводника. Для запуска входы «Пуск» и «Сброс» должны быть равны «0». Используя инструмент Poke Tool, сначала измените Reset на «1», а затем обратно на «0». Это делает начальный адрес 0x0000 и подготавливает схему BYOC-I к выполнению. Теперь установите для параметра Run значение «1», и программа выполнится. (Примечание: вам в основном нужно нажать Control-K один раз, чтобы запустить часы Logisim. Это функция, которая позволяет вам останавливать часы Logisim и переходить по программе, нажимая Control-T несколько раз. Попробуйте это когда-нибудь!)

Часы Logisim настраиваются на широкий диапазон частот. В загруженном состоянии это 8 Гц (8 циклов в секунду). Компьютер BYOC-I спроектирован так, что для выполнения каждой инструкции требуется четыре тактовых цикла. Итак, чтобы вычислить скорость BYOC-I, разделите тактовую частоту на 4. При 8 Гц его скорость составляет 2 инструкции в секунду. Вы можете изменить часы, нажав «Моделировать» на панели инструментов и выбрав «Тиковая частота». Возможный диапазон от 0,25 Гц до 4100 Гц. Была выбрана медленная скорость 8 Гц, чтобы вы могли наблюдать за счетчиком в регистре A.

Максимальная скорость моделирования BYOC-I (~ 1000 инструкций в секунду) очень медленная по сравнению с современными компьютерами. Аппаратная версия компьютера BYOC, описанная в моей книге, выполняет более 12 миллионов инструкций в секунду!

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

  1. Напишите программу, которая начинается с 5 и ведет обратный отсчет до 0. (ANS. Count5to0.txt ниже)
  2. Начиная с 2, считайте на 3, пока число не превысит 7. Вы можете немного поработать в уме, проверить, есть ли 8, зная, что он приземлится там, а затем перезапустите. Напишите свою программу в более общем виде, который действительно проверяет, «превышает» ли счетчик определенное число. Подсказка: узнайте, что происходит, когда вычитание дает отрицательное значение, например, 8-9 = -1. Затем поэкспериментируйте с логическим И, чтобы проверить, равен ли старший бит в 8-битном числе "1". (ANS. ExceedsCount.txt)

Можете ли вы вспомнить другие сложные проблемы для компьютера BYOC-I? Что еще он может сделать, учитывая его ограничения? Поделитесь со мной своим опытом на [email protected]. Если вас интересует программирование микропроцессоров, посетите мой сайт www.whippleway.com. Там я переношу машинное кодирование на современные процессоры, такие как серия ATMEL Mega, используемая в Arduinos.

Рекомендуемые: