Что такое ассемблер?
Языки ассемблеров Команды языка ассемблера Код операции Псевдооперации Литералы Свободный формат команд Некоторые типичные команды ассемблера для машин с побайтовой организацией Ассемблеры типа «трансляция — выполнение» Однопроходный ассемблер Двухпроходный ассемблер Символы Подробная блок-схема прохода Подробная блок-схема прохода 2 Пример трансляции Таблицы символов общие замечания Обработка таблицы Линейный поиск Двоичный поиск Сравнение двоичного и линейного способов поиска Метод хеширования Пример хеширования Скученность Назначение макрокоманды Различие между макрокомандами и подпрограммами Форматы макрокоманды Ключевой макрос Макропроцессор |
Что такое ассемблер?В разд. 3.1 были сформулированы отличия между различными типами транслирующих программ и в общих чертах описан ассемблер. В этом разделе рассматриваются более точные определения языков ассемблеров и ассемблеров. Часто говорят, что программирование является искусством, а не наукой. Можно поспорить с таким, утверждением, но необходимо признать, что по крайней мере во второй его части есть доля истины. В программировании нет основных аксиом, как в геометрии, алгебре или механике, терминология часто двухмыслена, и иногда отсутствуют четкие определения. Пример нечетко определенных терминов — языки ассемблеров, и ассемблеры. Возможно, лучше всего определить ассемблер как систему, помогающую программисту в подготовке программ на уровне машинного кода. В гл. 4 показано, насколько обременительно для программиста выписывание двоичных представлений последовательных команд, однако повторяющаяся часть этого процесса хорошо поддается автоматизации. С другой стороны, ясно, что такой способ кодирования предоставляет наибольшую гибкость и дает опытному программисту возможность оптимально использовать все аппаратные ресурсы машины. Ассемблер облегчает программистам использование двоичных кодов команд и адресов; он допускает мнемонические команды и символические адреса. Так утомительные распределение памяти и размещение регистров, так и перекрестные связи между различными частями программы организуются ассемблером. Если программа представляет собой комбинацию нескольких подпрограмм, ассемблер генерирует информацию; необходимую для того, чтобы связать вместе эти программные сегменты. В то же время программирование на языке ассемблера, дает ту же самую гибкость, которая может быть достигнута при непосредственном выписывании машинных команд. Если не касаться макрокоманд (см. разд. 5.5), то ассемблер может рассматриваться как транслирующая .программа, в которой устанавливается взаимно однозначное соответствие между каждой строкой исходной программы и командой машины. Что же касается псевдоопераций, то они могут быть обсуждены отдельно, так как их можно рассматривать в качестве инструкций ассемблеру, которым необходимо следовать во время трансляции, а не во время выполнения программы. Однако, даже если исключить псевдооперации, это широко принятое определение языков ассемблеров не точно, так как возможность использования макрокоманд является существенной частью современных ассемблеров. Следовательно, лучше принять более общее определение, состоящее в том, что языки ассемблеров являются машинно-ориентированными языками в отличие от проблемно-ориентированных языков высокого уровня. Они отражают структуру машин, для которых они разработаны, а не задачи, которые могут быть решены с их помощью. Они предоставляют программисту прямой доступ к регистрам, признакам, вырабатываемым операциями, индексированию и т. д., такой же, какой он имеет на уровне машинных кодов, но в более понятной символической форме. Ассемблер представляет собой транслирующую программу, преобразующую программы, написанные на языке ассемблера, в машинный код. В последующих разделах настоящей главы будут рассмотрены основные свойства языков ассемблеров, а также организация и функционирование ассемблеров и макроассемблеров. |