Найти тему
IT. Как это работает?

От транзистора до фреймворка. Часть 8. Ассемблер

Видео: YouTube

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

Схема процессора и набор инструкций
Схема процессора и набор инструкций

Для начала решим простую задачу сложения двух чисел. Пусть нам даны два числа . Необходимо вычислить их сумму.

Блок схема. Алгоритм.

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

Блок-схема алгоритма
Блок-схема алгоритма

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

Вывод результата.

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

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

Подсистема вывода процессора
Подсистема вывода процессора

Машинный код.

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

Машинный код
Машинный код

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

Панель управления компьютером IBM System 360
Панель управления компьютером IBM System 360

Сразу шагаем немного вперед. Рассмотренные ранее мнемоники машинных команд запоминаются и воспринимаются гораздо лучше машинных кодов. Более того, каждой строчке программы на мнемонических командах соответствует машинная команда.

Ассемблер.

Запишем текст программы в виде мнемоник.

Программа на языке ассемблера
Программа на языке ассемблера

Все что после точки с запятой является комментарием и не участвует в генерации машинных команд. Так как арифметико-логическое устройство работает с числами, хранящимися в памяти, то присутствие слагаемых там необходимо. Память данных представляет собой массив ячеек, заполненный нулевыми значениями. Она изображена внизу рисунка и послужит ориентиром. После строки комментария четыре строчки заносят в память исходные данные. Это числа 7 и 8, которые будут лежать в ячейках 3 и 4 соответственно. Команда ldi заносит число в регистр аккумулятор. Команда sto сохраняет содержимое аккумулятора в ячейке с указанным адресом. После этого числа 7 и 8 присутствуют в памяти данных. Далее все действия будут в соответствии с блок схемой алгоритма. Занесем одно из слагаемых в аккумулятор. Это сделает команда lda 3. Добавим к содержимому аккумулятора второе слагаемое. Это сделает команда add 4. Число из четвертой ячейки складывается с содержимым и результат записывается в аккумулятор. Теперь содержимое аккумулятора с результатом сложения помещается в ячейку 5. Это сделает команда sto  5. Выведем результат командой sto 31. Завершает работу программы команда halt.

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

Ассемблер переводит текст программы в машинный код
Ассемблер переводит текст программы в машинный код

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

Выполнение программы.

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

-8

Вторая инструкция сохраняет семерку в ячейку 3.

-9

Следующая инструкция загружает в аккумулятор число 8.

-10

Далее восьмерка сохраняется в ячейке 4.

-11

Теперь загружаем в аккумулятор первое слагаемое из ячейки 3.

-12

Складываем его с содержимым ячейки 4.

-13

Как можно заметить, в аккумуляторе появилась сумма этих чисел. Сохраняем сумму в пятую ячейку.

-14

Выводим результат на светодиоды путем сохранения результата в ячейку с адресом 31.

-15

Конец работы программы. В случае корректной работы программы двоичный код числа 15 будет изображен при помощи светодиодов.