Машинный уровень и микропрограммный уровень
В ЭВМ любая информация представляется и хранится в виде двоичных слов. В соответствии с этим и отдельные команды также представляются в виде двоичных слов. Поскольку команды помещаются в память, то длину слова-команды выбирают в соответствии с длиной двоичных слов, хранимых в памяти. Команда может размещаться в нескольких последовательных ячейках памяти, причем число требуемых ячеек памяти может меняться от команды к команде.
Структура, форма и смысл отдельных команд машинного языка обусловливаются имеющимся набором команд и структурой машинных слов. На последовательных ЭВМ программа состоит из следующих друг за другом отдельных команд, выполняемых, как правило, в порядке их следования. Так как эта последовательность команд помещается в линейную (последовательную) память машины, каждая команда получает определенный адрес. Эти адреса используются в специальных командах (командах перехода), которые предназначены для достижения большей гибкости управления порядком выполнения команд программы. Обычно по завершении выполнения какой-либо команды для исполнения выбирается следующая по порядку команда. С помощью команды перехода можно прервать этот естественный порядок выполнения команд и указать явно адрес той команды, с которой следует продолжить выполнение программы.
Для формулирования чисто машинной программы важно знать и ее место в памяти (а также и ее отдельных команд), так как знание адресов отдельных команд необходимо для команд перехода. Часто в машинных программах исходят из того, что адресами последовательных команд являются последовательные натуральные числа или натуральные числа с постоянным шагом, если все слова-команды имеют фиксированную длину. Тогда достаточно знать только начальный адрес программы, чтобы установить адрес любой команды.
Чтение машинной программы, заданной в виде последовательности двоичных слов, чрезвычайно трудно. Такая запись также труднообозрима, и программистам надо затрачивать много сил и времени для формулирования программы в виде последовательности байтов. Возможность легко допустить ошибки и ненаглядность машинной программы требуют при программировании особенной дисциплины. Поэтому при составлении машинно-ориентированных программ очень важны систематический способ действий и удовлетворительно поставленная документация. На практике стараются по возможности избегать программирования на машинном языке. В большинстве случаев работают с проблемно-ориентированными языками, которые затем с помощью трансляторов переводятся на машинные языки.
Каждой машинной команде микропроцессора соответствует своя микропрограмма, состоящая из микроопераций. Микропрограммы всех команд содержатся в управляющей памяти устройства управления процессора, которая реализуется на программируемой логической матрице (ПЛМ). Устройство управления дешифрует код машинной команды и выполняет соответствующую ей микропрограмму. Микропрограмма определяет управляющие сигналы, выдаваемые устройством управления. Арифметико-логическое устройство (АЛУ) микропроцессора представляет собой комбинационные схемы, настраиваемые сигналами микроопераций на различные преобразования. Это может быть двоичное или двоично-десятичное сложение, вычитание, логическое умножение и т.д. При написании микропрограмм операций в АЛУ в микрокомандах задаются микрооперации, определяющие выбор источников операндов для АЛУ, настраивающие АЛУ на выполнение различных преобразований и указывающие место занесения результата, сформированного АЛУ.
Ассемблерный уровень
Ручное программирование на машинном языке является трудоемким процессом, поэтому для его автоматизации разработаны специальные, более удобные и наглядные символические языки, одним из которых является язык Ассемблера. Программа, составленная на языке Ассемблера, транслируется с помощью простой программы, называемой ассемблером, в машинную, состоящую из команд ЭВМ.
Ассемблер – программа, используемая для преобразования исходного текста, написанного на языке Ассемблера, в машинный код.
Транслятор – программа, преобразующая программу, написанную на одном языке программирования, в программу на другом языке или в машинные коды.
Язык Ассемблера является языком программирования, ориентированным на конкретную ЭВМ (с учетом структуры команд, памяти и т.д.). Вместе с тем в этот язык введены элементы, упрощающие и автоматизирующие процесс программирования: символьное обозначение команд и ячеек памяти, широкое использование привычных для человека обозначений и др. Таким образом, программа, описанная на уровне языка Ассемблера, является более осмысленной для программиста по сравнению с программой в машинных командах. Все это обусловило определение языка Ассемблера как машинно-ориентированного языка, содержащего макрокоманды. Понятие макрокоманды трактуется, как оператор на исходном языке, который может быть заменен определенной последовательностью других операторов, записанной на этом же исходном языке. Отметим, что машинно-ориентированный язык – это язык программирования, отражающий структуру вычислительной машины.
Язык Ассемблера позволяет непосредственно использовать систему команд ЭВМ и предоставляет пользователю ряд удобств при кодировании программ. В отличие от языков высокого уровня язык Ассемблера может контролировать каждую команду объектной программы, что в ряде случаев дает возможность создавать более эффективные и компактные программы. Преимуществом программ, написанных на машинных кодах и языке Ассемблера, является то, что они выполняются намного быстрее, чем программы, написанные на языке высокого уровня.
Ассемблерные программы чаще всего применяются в системном программировании. Большинство системных программ операционной системы пишется на языке Ассемблера, поскольку в нем учитываются все особенности машины.
Языки Ассемблера по сравнению с чисто машинными языками обычно получают следующие дополнительные элементы:
• многократные метки (несколько меток для одной команды);
• ограниченные арифметические (адресные) выражения;
• прямая запись констант (непосредственные операнды);
• символическая адресация;
• сегментирование программы (области действия имен);
• определение и вставка заменяющих текстов (макросредства).
Для записи программы на языке Ассемблера используются следующие типы операторов: машинные команды, команды Ассемблера, команды генерации, макрокоманды, команды комментариев.
Операторы машинных команд представляют символическую форму записи обычных команд ЭВМ. Набор операторов этих команд определяется системой команд ЭВМ.
Операторы команд Ассемблера определяют действия транслятора при переводе исходной программы на машинный язык. В свою очередь они разделяются на команды определения, команды секционирования и соединения.
Команды определения предоставляют программисту различные способы определения констант и областей памяти, устанавливают идентичность символических имен, используемых для одних и тех же элементов программы.
Команды секционирования и соединения позволяют делить программу на программные секции и устанавливать связи между программными частями, которые транслируются отдельно.
Операторы команд генерации составляют макросредства языка Ассемблера. Они используются при составлении макроопределений и при написании части программы. Операторы макрокоманд применяются для обращения к макроопределениям с некоторыми значениями параметров. Операторы команд комментариев поясняют программу на языке Ассемблера и никакого влияния не оказывают на содержание создаваемой программы.
Каждая команда языка состоит из четырех полей: имени, операции, операндов и комментария. Имя (метка) может быть из одного или нескольких символов. Поле операции содержит код какой-либо машинной операции. В поле операндов размещаются адреса регистров или ячеек памяти. Поле комментария поясняет значение команды.