Для реализации операций чтения или записи ОЗУ, кроме адреса и собственно данных, требуются еще сигналы управления. В простейшем случае это сигналы записи (WR) и чтения (RD). Для их формирования используем еще один регистр, выходы которого выведем за пределы микросхемы микропроцессора. Назовем его регистром управления (CR). Для формирования необходимых сигналов достаточно записывать в определенный бит регистра логический 0 или 1. Определим формат регистра управления. Пусть бит 0 этого регистра будет сигналом записи, а бит 1 - сигналом чтения. Остальные биты этого регистра пока не важны. Если потребуются дополнительные сигналы управления системной шиной, то можно воспользоваться зарезервированными сейчас битами. Полученный формат регистра управления приведен на рис. 4.21.
![]()
Рис. 4.21.Формат регистра управления (CR)
Блок микропрограммного управления
В простейшем случае блок микропрограммного управления можно построить на счетчике с возможностью предварительной записи и ПЗУ.
Структурная схема такого блока приведена на рис. 4.22.

Рис. 4.22.Блок микропрограммного управления
В этой схеме адрес очередной микрокоманды формирует двоичный счетчик. Если требуется осуществить безусловный или условный переход, то новый адрес записывается из ПЗУ в этот счетчик, как в обычный параллельный регистр, по сигналу параллельной записи V. Переход к следующему адресу микрокоманды производится по сигналу синхронизации микропроцессора CLK.
В приведенной схеме условный переход возможен по знаку результата операции, переносу, нулевому результату или переполнению. Следует заметить, что достаточно лишь флага N (знака числа) для реализации перехода по нескольким условиям: больше, меньше, больше или равно, меньше или равно.
Содержимое ПЗУ блока микропрограммного управления называется микропрограммой. Именно эта микропрограмма и реализует конкретный микропроцессор. При смене микропрограммы, в принципе, можно реализовать на одном и том же кристалле другой микропроцессор.
Команды микропроцессора
Команды микропроцессора в отличие от микрокоманд разрабатываются независимо от аппаратуры микросхемы, поэтому их разрядность обычно кратна восьми разрядам. Команда микропроцессора содержит как минимум код операции (КОП). Она может состоять только из кода операции, когда не требуется указывать адрес операнда (операнды это данные, над которыми выполняется заданная операция), или может состоять из кода операции и адресов операндов или данных. Однобайтовые команды позволяют работать с внутренними программно доступными регистрами процессора. Многобайтные команды могут содержать адреса операндов, размещенных в ОЗУ или ПЗУ, или сами операнды (данные). Форматы команд очень сильно зависят от структуры процессора. Рассмотрим построение команд для 8-разрядного процессора, построенного по архитектуре фон Неймана. Примеры форматов команд для такого процессора приведены на рис. 4.23.

Рис. 4.23.Форматы различных команд микропроцессора
Если для кода операции используется 8-разрядное число (байт), то при помощи этого числа можно закодировать 256 операций. В процессе разработки системы команд для операции может быть назначен любой код. Система команд является важным признаком, характеризующим конкретное семейство процессоров.
При кодировании команд разработчик микропроцессора может назначить любой операции любое число. Например, для операции сложения можно назначить код 1, для операции вычитания код 12 и т. д. Для выполнения одной и той же операции над разными регистрами процессора назначаются разные коды команд. Поэтому для операции суммирования может потребоваться 8 чисел (команд). Например, 1 - просуммировать аккумулятор с регистром R0, 2 - просуммировать аккумулятор с регистром R1, 3 - просуммировать аккумулятор с регистром R2 и т. д.
Запоминать эти коды очень утомительно для человека. При программировании в машинных кодах легко совершить ошибку и очень трудно найти ее, особенно если коды различаются только одним битом. Для сокращения объема записи вместо двоичного кода можно воспользоваться шестнадцатеричным, однако это не увеличивает удобочитаемости программы. Фрагмент шестнадцатеричного представления исполняемого кода программы для микропроцессора приведен на рис. 4.24.

Рис. 4.24.Фрагмент исполняемого кода микропроцессора
Ну, как? Очень легко разобраться в такой последовательности чисел?
Я думаю, не слишком. Чтобы уменьшить объем запоминаемой информации и увеличить наглядность исходного текста программы, для каждой операции процессора придумывают мнемоническое обозначение.
В качестве мнемонического обозначения операции обычно используют сокращения английских слов, образующих название этой операцию. Например, для операции копирования используется мнемоническое обозначение MOV; для операции суммирования - ADD; для операции вычитания - SUB; для операции умножения - MUL и т. д.
Полная запись команды содержит мнемоническое обозначение операции и используемые этой операцией операнды, которые перечисляются через запятую. При этом обычно операнд-приемник результата записывается первым, а операнд-источник операнда - вторым. Например:
MOV R0, А ;Скопировать содержимое регистра А в регистр R0
ADD A, R5 ;Просуммировать содержимое регистров R5 и А, результат поместить в регистр А
Приведенные выше команды - однобайтовые, т. к. в них используются только внутренние регистры процессора. Если в команде используется константа в качестве операнда или указывается адрес операнда в памяти, то код команды будет занимать в памяти два или три байта. Например:
MOV А, 1025 ;Скопировать содержимое ячейки памяти с адресом 1025 в регистр А
ADDA, #110 ;Просуммировать содержимое регистра А с числом 110
Несмотря на то, что общий объем исходного текста программы увеличивается, скорость написания и особенно отладки программ при применении мнемонического обозначения команд возрастает. Кто сомневается, может попробовать разобраться в программе, приведенной на рис. 4.24.
Теперь вместо одного текста программы в памяти компьютера или на бумаге придется хранить два варианта представления: один для человека, в дальнейшем будем называть этот вариант исходным текстом программы; другой для микропроцессора, в дальнейшем будем называть этот вариант загрузочным модулем.
Преобразование программы, записанной в мнемоническом виде, в машинные коды является рутинной работой, которую можно поручить компьютерной программе. Язык программирования, в котором для обозначения машинных команд используются мнемонические обозначения, называется ассемблером. Точно так же называют и программу или пакет программ, которые осуществляет трансляцию (преобразование) исходного текста программы, написанной на языке программирования ассемблер (исходный модуль), в машинные коды (загрузочный модуль).
Теперь, когда мы рассмотрели все составные части микропроцессора: операционный блок, блок микропрограммного управления, - а также систему команд, можно, наконец, приступить к реализации самого микропроцессора. Напомню, что архитектура микропроцессора реализуется микропрограммой и очень мало зависит от аппаратуры, для которой пишется эта микропрограмма. То есть, написав микропрограмму, мы тем самым построим микропроцессор с конкретной архитектурой. Микропрограмма состоит из сотен однотипных блоков, написанных для различных команд микропроцессора, поэтому достаточно рассмотреть реализацию нескольких типовых команд.