Адрес памяти
|
Содержимое памяти
|
Комментарий
|
00100h
|
1110 0101
|
Читать слово в регистр AX
из порта ввода 5.
|
00101h
|
0000 0101
|
00102h
|
0100 0000
|
Увеличить на единицу содержимое AX.
|
00103h
|
1110 0111
|
Передать слово из регистра AX
в порт вывода 2.
|
00104h
|
0000 0010
|
00105h
|
1110 1011
|
Повторить действия путем перехода
по адресу на семь байт назад.
|
00106h
|
1111 1001
|
По комментариям становится понятно, что первые две комбинации нулей и единиц, хранящихся в ячейках памяти по адресам 100h и 101h (h – символ шестнадцатеричного числа) определяет команду чтения слова данных из порта ввода под номером 5 в регистр микропроцессора AX. Команда по адресу 102h увеличивает значение регистра AX на единицу. Затем выполняется передача содержимого регистра AX в порт вывода 2. Команда, записанная по адресам 105h и 106h, выполняет переход по адресу 100h, и затем весь процесс повторяется заново.
Представленный фрагмент программы в машинных (числовых) кодах команд микропроцессора называется объектной. Разработав объектную программу, ее можно загрузить в оперативную память вычислительной машины и запустить на выполнение. Как не трудно заметить, создание напрямую объектных программ довольно утомительное занятие. Современные модели микропроцессоров имеют систему команд, включающую сотни различных инструкций. Поэтому запомнить и, тем более, безошибочно применить их чрезвычайно сложно.
Значительно проще было бы использовать близкий для человека язык символьных описаний для тех действий, которые необходимо выполнить. Разработав такой язык можно затем создать специальные инструментальные средства, выполняющие преобразование программы с символьного языка в объектный код. Программы, написанные на таких искусственных языках, называются исходными, а инструментальные средства, выполняющие преобразование, – трансляторами (рис. 1).
Существует два вида трансляторов: ассемблеры предназначены для преобразования исходных программ, написанных на языке ассемблера, и компиляторы – для трансляции программ с языков высокого уровня.
Рис. 1. Процесс трансляции исходной программы в объектный код.
Язык ассемблера позволяет разрабатывать программы на уровне команд микропроцессора, но вместо числовых кодов он определяет символьные обозначения. Например, рассмотренный фрагмент программы на языке ассемблера будет выглядеть следующим образом:
L: IN AX, 5 ; читать слово данных из порта 5 в регистр AX
INC AX ; увеличить на единицу регистр AX
OUT 2, AX ; вывести в порт 2 содержимое регистра AX
JMP L ; перейти по метке L
Воспринимать эти строчки теперь стало значительно проще. На языке ассемблера машинные команды имеют вид мнемонических обозначений или мнемоник (в нашем примере мнемониками являются IN, INC, OUT и JMP), а адреса памяти и константы могут быть представлены не последовательностью битов, а символами. Поэтому для изучения, понимания и использования языка ассемблера требуется намного меньше усилий, чем при создании программ на машинном языке.
Для преобразования аббревиатур английских слов в числовые коды команд должна быть вызвана программа ассемблера. Функцией ассемблера является преобразование исходной программы в объектную, понятную микропроцессору (рис. 2). Отношения между программой на языке ассемблера и результатом трансляции – объектным кодом, всегда однозначные. Язык ассемблера позволяет полностью контролировать процесс получения объектного кода.
Рис. 2. Трансляция программы на языке ассемблера в объектный код.
Существует много разновидностей ассемблеров, разработанных различными фирмами. Для микропроцессоров фирмы Intel традиционно на рынке ассемблеров имеется два основных пакета: макроассемблер MASM компании Microsoft и турбо ассемблер TASM компании Borland. Оба пакета содержат трансляторы, компоновщики, отладчики и другие средства для полноценной разработки программ на ассемблере.
Приведем еще один пример того же самого алгоритма, но уже на языке высокого уровня, например, на Паскале (пакет Borland® Pascal 7.0):
1: portw[2]:=portw[5]+1; { получить из порта 5 слово данных, увеличить
его значение на единицу и вывести в порт 2 }
goto 1; { перейти на метку 1 }
Здесь для доступа к портам ввода-вывода используются предопределенный массив portw. Индексом массива является адрес порта, к которому необходимо обратиться. Как видно, теперь полностью потерян контроль над процессом получения объектного кода. Каким образом эти две строчки будут преобразованы в объектный код, зависит от выбранной версии компилятора языка Паскаль (рис. 3).
Рис. 3. Трансляция программы на языке высокого уровня в объектный код.
В общем случае отношения между исходной программой на языке высокого уровня и полученным в результате трансляции объектным кодом не очевидны. Кроме того, поскольку для каждого оператора высокого уровня может потребоваться от двух до десяти машинных команд, это приводит к снижению эффективности полученного объектного кода по сравнению с языком ассемблера. Компилятор может сгенерировать значительно более избыточный код, чем человек при написании того же алгоритма на языке ассемблера.
Поэтому на языке ассемблере целесообразно разрабатывать программы, которые должны обеспечить эффективную работу с аппаратной частью микропроцессорной системы, либо критичные по времени выполнения или расходованию памяти алгоритмы. Впоследствии они могут быть оформлены в виде подпрограмм и совмещены с основной программой на языке высокого уровня.
Из рассмотренных примеров можно видеть, что в общем случае язык программирования является механизмом абстрагирования. Он дает возможность описать вычисления абстрактно и в то же время позволяет программе (транслятору) перевести это описание в детализированную форму, необходимую для выполнения на вычислительном устройстве. Существует естественное противоречие между стремлением к краткому, ясному и надежному выражению вычисления на высокоабстрактном уровне и стремлением к гибкости подробного описания на самом низком уровне.
Начиная с этой главы, будут рассмотрены методы разработки программ на языке ассемблера для микропроцессора 8086 компании Intel, положившего начало самой распространенной в настоящее время ветви микропроцессорной архитектуры. В последующих главах будут описаны способы программирования различных микропроцессорных устройств и плат сбора данных, используемых при разработке средств измерительных техники.
Do'stlaringiz bilan baham: |