Большинство ассемблеров двухпроходные. Во время первого прохода строится таблица символов для меток, литералов и объявляемых идентификаторов. Символические имена можно либо не сортировать и искать путем последовательного просмотра таблицы, либо сначала сортировать, а потом применять двоичный поиск, либо хэшировать. Если символические имена не нужно удалять во время первого прохода, хэширование — это лучший метод. Исполняемая программа создается во время второго прохода. Что касается директив (псевдокоманд), то одни из них выполняются при первом проходе, другие — при втором.
Программы, которые ассемблируются независимо друг от друга, можно скомпоновать вместе и получить исполняемую двоичную программу. Эту работу выполняет компоновщик. Его цель — это перераспределение в памяти и связывание имен. Динамическая компоновка — это технология, при которой определенные процедуры не компонуются до тех пор, пока они не вызваны. Библиотеки коллективного доступа в UNIX и библиотеки динамической компоновки (DLL) в Windows используют технологию динамической компоновки.
Вопросы и задания
1. Всего 2 % кода программы отвечают за 50 % времени выполнения этой программы. Сравните следующие три стратегии с точки зрения времени программирования и выполнения. Предположим, что для написания программы на языке С требуется 100 человеко-месяцев, а программу на ассемблере писать в 10 раз труднее, но зато она работает в 4 раза эффективнее.
1) Вся программа написана на С.
2) Вся программа написана на ассемблере.
3) Программа сначала написана на С, а затем нужные 2 % программы переписаны на ассемблере.
2. Для двухпроходных ассемблеров существуют определенные соглашения. Могли бы они подойти и для следующих компиляторов:
1) Компилятор вместо ассемблерного кода генерирует объектные модули?
2) Компилятор генерирует символический язык ассемблера?
3. Все ассемблеры для процессоров Intel в качестве первого операнда получают целевой адрес, а в качестве второго — исходный адрес. Какие проблемы могут возникнуть при другом подходе?
4. Можно ли следующую программу ассемблировать в два прохода? EQU — это директива, которая приравнивает метку к выражению в поле операнда.
A EQU В В EQU С С EQU D D EQU 4
5. Некая компания планирует разработать ассемблер для компьютера с 40-разрядным словом. Чтобы снизить стоимость, менеджер проекта решил ограничить длину символических имен, чтобы каждое имя можно было хранить в одном слове. Менеджер объявил, что символические имена могут состоять только из букв, причем буква Q запрещена. Какова максимальная длина символического имени? Опишите вашу схему кодирования.
6. Чем отличается команда от директивы?
7. Чем отличается счетчик адресов команд от счетчика команд? А существует ли вообще между ними различие? Ведь тот и другой выполняют трассировку следующей команды в программе.
8. Какой будет таблица символов (имен) после обработки следующих операторов ассемблера Pentium 4 (первому оператору приписан адрес 1000)?