К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 20
Текст из файла (страница 20)
Пользовательская программа обычно вводится в компьютер с помощью клавиатуры и сохраняется либо в памяти, либо на магнитном диске. На этом этапе она представляет собой просто набор строк, состоящих из буквенно-цифровых символов. Для ее обработки запускается ассемблер, который считывает пользовательскую программу, анализирует ее и генерирует соответствующую программу на машинном языке. Эта программа состоит из последовательности нулей и единиц, определяющих команды, которые должны быть выполнены компьютером. Пользовательская программа в исходном текстовом формате называется исходной, а ассемблированная программа на машинном языке — обьектной. О работе ассемблера мы поговорим в разделе 2.6.2, а пока давайте рассмотрим некоторые аспекты языка ассемблера.
В языке ассемблера конкретного компьютера регистр символов может учитываться, а может и не учитываться, то есть заглавные и прописные буквы в нем могут различаться, а могут не различаться. В этой книге для обозначения имен и меток мы будем использовать заглавные буквы, что, как вы понимаете, облегчит чтение команд. Например, команду Моте мы запишем так: МОЧЕ КО,ЗПМ Мнемоническое обозначение МОЧЕ представляет собой код операции, то есть двоичную последовательность, соответствующую данной операции. Ассемблер транслирует это обозначение в понятный компьютеру двоичный код операции.
За мнемоническим обозначением операции следует как минимум один пробел, а затем информация, определяющая операнды команды. В нашем примере исходным операндом является содержимое регистра КО. Далее идет спецификация результирующего операнда, отделенная от исходного операнда лишь запятой, без разделяющего пробела, Результирующий операнд хранится в памяти, а его двоичный адрес представлен именем ЗПМ. Поскольку существует несколько режимов адресации, позволяющих задавать расположение операндов, язык ассемблера дает возможность указать, какой из режимов адресации используется для конкретного операнда.
Например, числовое значение или имя, явно заданное в приведенной выше команде как ЗПМ, может применяться для обозначения абсолютного режима адресации. Символ «№» обычно означает, что операнд указан непосредственно. Так, следую|цая команда АРО №5,КЗ прибавляет число 5 к содержимому регистра КЗ и в этот же регистр помещает результат. Использование символа «№» — не единственный способ обозначения непосредственной адресации. В некоторых языках ассемблера на непосредственную адресацию указывает мнемоническое обозначение самой команды. Например, приведенная выше команда сложения может быть записана так: А1ЗР1 5,КЗ 84 Глава 2. Машинные команды и программы Суффикс 1 в мнемоническом обозначении А1И)1 говорит о том, что исходный операнд команды задан непосредственно (1пппео1аге).
Косвенная адресация обычно обозначается с помощью скобок, в которые заключается имя операнда, или с помощью специального символа, обозначающего указатель на операнд. Например, если число 5 должно быть помещено в память по адресу, хранящемуся в регистре К2, соответствующее действие задается так: МОЧЕ Ф5,(К2) или так: МОУЕ1 5,(К2) В данном случае суффикс 1 указывает на косвенную адресацию (1пд1гесг).
2.6.1. Директивы ассемблера В дополнение к использованию механизма представления команд в программе язык ассемблера позволяет программистам задавать информацию совсем иного рода, необходимую для правильной трансляции исходной программы в объектную. Мы уже упоминали, что всем задействуемым в программе именам при трансляции назначаются числовые значения. Предположим, что имя 511М используется для представления значения 200. Для того чтобы сообщить об этом факте ассемблеру, нужно включить в исходную программу такую инструкцию: 51)М ЕЯ() 200 Эта инструкция не соответствует команде, которая будет выполнена при реализации объектной программы. Более того, в объектной программе ее вообще не будет.
Данная инструкция просто информирует ассемблер, что везде, где в программе встречается имя 51)М, оно должно быть заменено значением 200. Такие инструкции, называемые директивами ассемблера, используются при трансляции исходной программы в объектную. Давайте вернемся к программе, схематически представленной на рис. 2.12. Для того чтобы выполнить эту программу на компьютере, нужно написать ее исходный код на соответствующем языке ассемблера, задействовав всю информацию, необходимую для трансляции исходной программы в объектную. Предположим, что каждая команда и каждый элемент данных занимают по одному слову памяти.
Это упрощенное представление принято исключительно для данного примера. К тому же мы предположим, что память адресуется побайтово и что длина слова составляет 32 разряда. Объектная программа должна быть загружена в основную память, как показано на рис. 2.17. На этом рисунке указаны адреса памяти, по которым должны располагаться машинные команды и элементы данных после того, как программа будет загружена для выполнения.
Если ассемблер должен сгенерировать объектную программу в соответствии с этими условиями, ему необходимо знать: + как интерпретировать имена; + куда поместить команды в памяти; + куда поместить данные-операнды в памяти. 2.6. Язык ассемблера 85 100 104 108 1.ООР 112 116 120 124 128 132 811М 200 Х 204 Х11М1 208 ХУМ2 212 ХВМл 604 Рис.
2.17. Организация памяти для программы, представленной на рис. 2.12 Чтобы предоставить ассемблеру эту информацию, исходная программа должна быть подобна проиллюстрированной на рис. 2.18. Эта программа начинается с директив ассемблера. Мы уже обсуждали директиву ЕЧпаге, ЕЯ13, информирующую ассемблер о значении константы БПМ. Вторая директива, ОИС1Х, указывает ассемблеру, куда поместить следующий блок данных. В нашем случае это место памяти определяется адресом 204. По данному адресу должно быть загружено значение 100 (количество элементов в списке), о чем информирует директива ПАТА%'ОЕП.
Для каждой инструкции, в результате выполнения которой в память помещаются команда либо данные, должна быть задана метка. Она будет играть роль идентификатора, которому присваивается адрес соответствующего элемента в памяти. Поскольку директиве ПАТА%ОЕ1) назначена метка Х, имени Х будет присвоено значение 204. Когда это имя будет встречаться в оставшейся части программы, одно будет заменяться данным значением. Такое использование метки Х эквивалентно директиве ассемблера Х ЕОУ 204 Директива КЕБЕКттЕ объявляет, что блок памяти размером 400 байт резервируется для данных, а имя ХУМ1 будет ассоциироваться с адресом 208.
Такая директива не вызывает загрузки по указанному адресу каких-либо данных. Данные могут загружаться в память посредством процедуры ввода, описанной ниже. Еще одна директива ОК1С1Х указывает, что команды объектной программы должны загружаться в память по адресу 100. За ней следуют команды исходной программы, написанные в соответствии с мнемоникой и синтаксисом языка ассемблера. Последней инструкцией исходной программы является директива ЕХР, указываюшая ассемблеру на конец текста исходной программы.
Эта директива содержит метку ЯТАКТ, идентифицирующую адрес, с которого должно начинаться выполнение программы. И наконец, инструкция КЕТ11КХ. Это директива ассемблера, идентифицирующая точку, в которой выполнение программы должно быть прекращено. Она сообщает ассемблеру о необходимости вставить в программу машиннуго команду, возвращающую управление операционной системе компьютера, Большинство языков ассемблера требуют, чтобы инструкции исходной программы записывались в форме Эти четыре поля обычно разделяются одним или несколькими пробелами либо табуляторами. Метка — зто необязательное имя, представляющее адрес в памяти, по которому будет загружена команда на машинном языке, сгенерированная на основе данной инструкции.
Метки могут представлять и адреса данных в памяти. На рис. 2.18 вы видите пять меток: Я1М, Х, М1М1, ЕТАКТ и 1.ООР. Метка адреса в памяти Адресная информация или данные Операция Директивы ассемблера Х П1М1 Инструкции, на основе которых генерируются машинные команды 8ТАКТ 1.СОР Директивы ассемблера Рис. 2.18. Представление программы, приведенной на рис.
2Л7, на языке ассемблера Для каждой командьг или директивы ассемблера в поле «Операция» задается мнемоническое обозначение ее кода. В поле еОперандь содержится адресная информация для доступа к одному или нескольким операндам, что зависит от типа 86 Глава 2. Машинные команды и программы Метка Операция Операнд(ы) Комментарий ЕЯ11 ОК1С1Х ОАТАйгОКО КЕЕЕКЧЕ ОК1С1Х МОЧЕ МОЧЕ С1.К АРО АОП ПЕС ВСТХ МОЧЕ КЕТ11КХ 200 204 100 400 100 Х,К1 йХ11М1,К2 КО (К2),КО Ф4,К2 К1 1.ООР К0,811 М 2.6.
Язык ассемблера 87 команды. Поле «Комментарий» ассемблер просто игнорирует — оно предназначено для документирования программы и облегчения ее понимания. Мы обсудили лишь базовые характеристики языков ассемблера. Основополагающие элементы языка ассемблера у всех компьютеров одинаковы, но несмотря на это языки разных компьютеров имеют различную сложность и отличаются друг от друга многими деталями. 2.6.2.
Ассемблирование и выполнение программ Прежде чем исходную программу, написанную на языке ассемблера, можно будет выполнить, ее необходимо ассемблировать (транслировать) в объектную программу на машинном языке. Эта задача осуществляется программой-ассемблером, заменяющей все символические обозначения операций и адресных режимов двоичными кодами, используемыми в машинных командах, а все имена и метки — их настоящими значениями. Ассемблер присваивает командам и блокам данных адреса, начиная с адреса, заданного в директиве ОК101Х.
Эта директива отвечает за размещение по нужным адресам констант, которые могут быть заданы в директивах РАТМЧОКР, и резервирует память в соответствии с указаниями, содержащимися в директивах КЕБЕКЪ'Е. Важнейшим моментом процесса ассемблирования является определение значений, заменяющих имена. В тех случаях, когда значение имени определяется директивой ЕЯ11, это очень простая задача. Но если имя задается в поле «Метка» команды, представляемое им значение определяется положением этой команды в ассемблированной объектной программе. Поэтому в ходе формирования машинного кода ассемблер должен отслеживать адреса, по которым будут загружаться последовательные команды программы. Например, именам 5ТАКТ н 1.00Р будут назначены значения 100 и 112 соответственно.