Что пишут на ассемблере в настоящем прошлом будущем? :)

Gokusei, Вот погугли, что есть такое "мультипликатор" и "демультипликатор", "регистр" и "триггер", "ОЗУ", "ПЗУ" и "ППЗУ".

Собственно, примерно вот с такого уровня схемотехники и начинается программирование. И это будет Ассемблер.

На всех высокоуровневых ЯП, по сути, пишется всё то же самое, но, первое важное отличие любого высокоуровнего ЯП заключается в том, что все они расчитываются на работу на любом компьютере целой группы подобных между собой архитектур, а АСМ - только на работу на одной конкретной архитектуре CPU. И, кроме этого, высокоуровневые языки намного более походят на обычную человеческую речь, нежели любой из ассемблеров.
По сути, любой язык программирования - набор конкретных инструкций машине для выполнения ей набора строго определённых действий. И асм - не исключение в этом контексте. Суть его в том, что этим языком можно описать все документированные действия CPU самым непосредственным для него образом. Остальные ЯП - требуют своеобразного перевода на "машинный язык". И этот перевод выполняет компилятор. Проблема возникает тогда и в том, что компилятор может не всегда учитывать все нюансы конкретной архитектуры CPU и, как следствие из этого, производный машинный код будет обладать высокой переносимостью, но, в связи с этим, будет неоптимальным по объёму получаемого машинного кода и не будет оптимально и наиболее эффективно использовать все возможности любого из имеющихся в представленной линейке CPU. То бишь, машинный код из компилятора по определению содержит избыточный код для данного конкретного процессора, но при этом не использует все его возможности.

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

Теперь вернёмся к непосредственному вашему интересу.
Возьмём демультипликатор на 4 входа и 16 выходов.
Подавая конкретный двоичный сигнал на входную группу контактов (к примеру, 0101) мы получим на котором-то из выходов (в нашем случае на #5) такой же двоичный сигнал, который, можем использовать для включения соответствующей лампочки.
Если у нас на каждом из выходов будет такая же схема с лампочкой, то просто подавая соответствующий двоичный код, мы можем включать/выключать соответствующие лампочки.
Но двоичный код нужно предварительно отправить в виде параллельного (и синхронного!) сигнала на данные входы демультиплексора.
И демультиплексоров у нас таких может быть очень много в схеме. А лампочки в конечном счёте могут быть сложены, например, в двумерную матрицу XY и соответствующая комбинация свечения этих лампочек на некотором удалении может восприниматься, как цельное изображение с конкретным для человека смыслом.
Для согласования и распределения входящих двоичных сигналов вполне можно, нужно и вообще логично использовать триггеры, регистры и устройства временного хранения данных - ОЗУ, ПЗУ и ППЗУ
Соответственно, для слаженной работы всей этой схемы и требуется некоторый CPU и алгоритм управления, вполне подходящий под понятие "ассемблер для данного CPU".

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

0