Программирование на языке ассемблера
До сих пор мы занимались программированием на машинном языке. Это единственный вид программ, которые непосредственно воспринимает аппаратура микропроцессора. Однако, как легко видеть, даже не очень сложные задачи требуют для своего решения достаточно больших программ, и их составление — дело трудоемкое и кропотливое. Поэтому создаются специальные средства, облегчающие подготовку программ на машинном языке. Ассемблеры Составлять программы гораздо удобнее, если наряду с символическими именами для команд, называемых мнемоническими кодами операций, можно употреблять для обозначения адресов в командах также символические имена, а не числовые значения. Например, чтобы загрузить содержимое ячейки памяти 538616 в аккумулятор, в нашем иллюстрированном микропроцессоре нужно выполнить команду из трех байтов 705386 (в шестнадцатеричном представлении). Естественно, более удобна и наглядна запись этой команды в виде LDR О, Мы можем получить эти удобства, если будем располагать некоторым средством, подставляющим числовые значения вместо символических имен (операций и адресов) после того, как программа уже написана. Это и составляет основную функцию программы-ассемблера. Программа, написанная в новой удобной форме, называется программой на языке ассемблера, а каждая команда называется предложением на языке ассемблера или оператором на языке ассемблера. Вообще говоря, программа на языке ассемблера — это, по существу, та же программа на машинном языке с символическими именами для адресов операндов, символическими именами для адресов команд и мнемоническими кодами операций. Задача ассемблера — заменить каждый мнемонический код операции соответствующим машинным кодом операции, отвести ячейки для каждой команды и каждого операнда и подставить вместо символических адресов их числовые значения. Как правило, между предложениями на языке ассемблера и командами на машинном языке существует взаимооднозначное соответствие. Однако бывают случаи, когда по одному предложению ассемблер генерирует несколько машинных команд.
На рис. 5.6 показана схема использования ассемблера. Программа на языке ассемблера называется исходной программой, а генерируемая программа на машинном языке — объектной программой. Ассемблер, выполняющий функции транслятора и сам являющийся программой, загружается в компьютер вместе с исходной программой.
Рис. 5.6. Схема использования ассемблера. X, где LDR — мнемонический код операции, 0 — обозначение общего регистра, а X — символическое обозначение ячейки памяти 5386
Исходная программа выступает в роли «данных», обрабатываемых программой-ассемблером. В результате генерируется объектная программа. Когда ассемблер работает на том же компьютере, что и объектная программа, он называется собственным ассемблером. Однако часто ассемблер бывает написан для большой универсальной ЭВМ, выполняющей процесс трансляции. Такой ассемблер называется кросс-ассемблером. В процессе трансляции ассемблер использует таблицы для присваивания числовых значений мнемоническим кодам операций и символическим адресам. В ассемблер всегда включается таблица со всеми допустимыми мнемоническими кодами операций и соответствующими им числовыми значениями. Так что замена операций выполняется просто. Для того чтобы присвоить числовое значение каждому символическому адресу, ассемблер сначала составляет так называемую таблицу имен, в которую заносит все встреченные в программе символические адреса. Затем он отводит область памяти для программы, вычисляет значения для всех символических адресов и после этого выполняет соответствующую подстановку.
Одно из главных преимуществ языка ассемблера заключается в легкости, с какой делаются вставки и удаления предложений в исходной программе. При написании программы часто обнаруживается, что в некоторую точку уже написанной части программы нужно вставить группу команд. В программе на машинном языке это потребует сдвига всех слов программы ниже вставленных команд. Более того, может оказаться, что адресные поля некоторых команд в программе (если, например, есть циклы или переходы) теперь должны ссылаться на переместившиеся команды. Это значит, что все такие адресные поля нужно откорректировать. В программе на языке ассемблера подобных проблем не возникает, поскольку адресам не даются числовые значения. Следовательно, при вставках предложений никаких трудностей не возникает. Точно так же трудностей не возникает и при выбрасывании предположений. Другое полезное свойство многих ассемблеров — это обнаружение ошибок. Конечно, ассемблер не может обнаружить логических ошибок в самом замысле программы; однако он может проверять соблюдение определенных синтаксических ограничений, наложенных на язык, и сообщить программисту об их нарушениях. Язык ассемблера Чтобы проиллюстрировать тесную взаимосвязь между языком ассемблера и языком машинных команд, обратимся снова к программе вычисления суммы 10 чисел из разд. 3. Программа была приведена в табл. 5.3, причем именно загружаемая в микрокомпьютер программа приведена в графе «команды на машинном языке». Программа на языке ассемблера для того же примера приведена в табл. 5.9. Каждая строка соответствует одному предложению на языке ассемблера. Как легко заметить, предложение состоит из четырех полей: поля метки, поля операции, поля операндов и поля комментария. Поле метки служит для ссылок на адрес данной команды, если такие ссылки потребуются. В этом поле употребляются символические имена, а не числовые адреса. Обычно эти имена должны удовлетворять следующим ограничениям. Общее число литер в имени не должно превышать некоторого значения, первая литера должна быть обязательно буквой, а не цифрой, нельзя употреблять в поле метки некоторые зарезервированные слова (например, мнемонические коды операций).
Таблица 5.9
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|