Электроника:Цифровая электроника/Принципы цифровых вычислений/Микропроцессорное программирование

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Макаров В. (valemak)
Проверка/Оформление/Редактирование: Мякишев Е.А.


Микропроцессорное программирование[1]

«Словарь» инструкций, которым обладает любой конкретный микропроцессорный чип, специфичен именно для этой модели чипа. Intel 80386, например, использует совершенно другой набор двоичных кодов, чем Motorola 68020, для обозначения эквивалентных функций.

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

В то время как программное обеспечение на машинном языке может быть «сформулировано» в двоичной системе счисления, оно часто записывается в шестнадцатеричной форме, потому что с ней легче работать людям. Например, я приведу лишь несколько распространённых кодов инструкций для микропроцессорного чипа Intel 8080:

Примеры кодов инструкций для Intel 8080
Шестнадцатеричн. Двоичн. Описание инструкции
7B 01111011 Переместить содержимое регистра A в регистр E
87 10000111 Добавить содержимое регистра A в регистр D
1C 00011100 Увеличить содержимое регистра E на 1
D3 11010011 Вывод байта данных на шину данных

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

В языке ассемблера вместо реального шестнадцатеричного или двоичного кода для описания шагов программы используются двух-, трёх- или четырёхбуквенные мнемонические слова. Например, инструкция 7B для Intel 8080 будет выглядеть как «MOV A,E» на ассемблере.

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

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

Если программа должна быть сохранена в энергозависимой памяти, такой как оперативная память работающего компьютера, скорее всего, будет способ ввести её вручную через клавиатуру этого компьютера (некоторые компьютеры имеют мини-программу, хранящуюся в ПЗУ, которая сообщает микропроцессору, как принимать нажатия клавиш с клавиатуры и сохранять их как команды в ОЗУ), даже если это слишком глупо, чтобы делать как-то иначе.

Так зачастую разрабатываются компьютерные «хобби»-сборки. Если компьютер, который нужно запрограммировать, представляет собой полнофункциональный персональный компьютер с операционной системой, дисководами и вот этим всем, можно просто дать команду ассемблеру сохранить готовую программу на диск для последующего извлечения.

Чтобы «запустить» вашу программу, нужно просто ввести имя файла вашей программы в консоли, нажать клавишу  ↵ Enter , и регистр счётчика программ микропроцессора будет установлен так, чтобы он указывал на место («адрес») на диске, где находится первая хранимая инструкция, и ваша программа будет запускаться оттуда.

Хотя программирование на машинном языке или языке ассемблера позволяет создавать быстрые и высокоэффективные программы, для выполнения всего, кроме самых простых задач, требуется ну очень много времени и навыков, потому что каждая инструкция машинного языка настолько «топорна». Ответом на этот вызов является разработка для программистов способов писать на языках «высокого уровня», которые могут более гибко выражать человеческую мысль. Вместо того, чтобы вводить десятки загадочных кодов на ассемблере, программист, пишущий на языке высокого уровня, мог бы написать что-то вроде этого…

Print "Hello, world!"

… и ожидать, что компьютер напечатает «Hello, world!» без дальнейших инструкций о том, как именно на аппаратном и программном уровне это сделать. Это отличная идея, но как микропроцессору понять такое «человеческое» мышление, когда его словарный запас так ограничен?

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

Переводчик необходим для перевода слов каждого человека на язык собеседника одним и тем же способом каждый раз. Для микропроцессора это означает другую программу, написанную другим программистом на машинном языке, которая распознает шаблоны символов ASCII высокоуровневых команд, таких как Print (Печать), и может преобразовывать их в необходимые байтовые шаги, которые микропроцессор может напрямую понимать.

Если этот перевод делается по ходу выполнения программы, как переводчик, вмешивающийся непосредственно в живую беседу между двумя людьми, то это «интерпретация». С другой стороны, если вся программа переводится на машинный язык одним махом, как если бы переводчик сначала записал весь монолог на бумаге, а затем перевёл все слова за один присест и оформил бы перевод в отдельном письменном документе на другом языке, то такой процесс называется «компиляция».

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

Такие языки программирования, как BASIC и FORTH, являются интерпретаторами. Такие языки, как C, C++, FORTRAN и PASCALкомпиляторы. Компилируемые языки обычно считаются выбором для профессиональных программистов из-за эффективности конечного продукта.

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

Разработка этих интерпретаторов и компиляторов является весьма впечатляющим достижением: люди, создающие эти программы, безусловно, без куска хлеба никогда не останутся, особенно если учесть работу, которую они должны выполнять, чтобы их программные продукты соответствовали быстро меняющимся моделям микропроцессоров, появляющимся на рынке!

Чтобы смягчить эти трудности, ведущие производители микропроцессорных чипов (прежде всего, Intel и Motorola) стараются проектировать свои новые продукты так, чтобы они были обратно совместимы со своими старыми продуктами. Например, весь набор инструкций для чипа Intel 80386 содержится в последних чипах Pentium IV, хотя чипы Pentium имеют дополнительные инструкции, которых нет в чипах 80386.

Это означает, что программы на машинном языке (равно как и компиляторы), написанные для компьютеров 80386, будут работать на новейшем и лучшем процессоре Intel Pentium IV, но программы на машинном языке, написанные специально для использования большего набора команд Pentium, не будут работать на 80386, потому что старый ЦП просто не имеет некоторых из этих инструкций в своем словаре: блок управления внутри 80386 не может их декодировать.

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

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

См.также

Внешние ссылки