Э. Таненбаум - Архитектура компьютера (1127755), страница 150
Текст из файла (страница 150)
??Ь??Х поддерживает только неявную компоновку, поэтому библиотека коллективного доступа состоит из двух частей: главной библиотеки (Ьозг !1Ьгагу), которая статически скомпонована с исполняемым файлом, и целевой библиотеки (гагйес 1)Ьгагу), которая вызывается во время работы программы. Несмотря на некоторые различия в деталях, по существу эта концепция соответствует концепции ?) Е?.. Краткое содержание главы Хотя большинство программ можно и нужно писать на языках высокого уровня, существуют такие ситуации, в которых необходимо применять язык ассемблера, по крайней мере, отчасти.
Сюда можно отнести программы для компьютеров с недостаточным объемом ресурсов (например, процессоры для смарт-карт, различных приборов, портативных цифровых устройств). Ассемблерная программа — это символьное представление программы на том или ином машинном языке. Она транслируется на машинный язык специальной программой, которая называется ассемблером. Если для какого-либо приложения требуется высокое быстродействие, лучше всего сначала написать программу на языке высокого уровня, затем путем тестов установить, исполнение какой части программы занимает большую часть времени,и переписать на ассемблере только эти части программы.
Практика показывает, что часто небольшая часть всей программы занимает болыпую часть всего времени выполнения этой программы. Во многих ассемблерах предусмотрены макросы, которые позволяют программистам давать символические имена целым последовательностям команд. Обычно зти макросы могут быть параметризнрованы.
Макросы реализуются с помощью алгоритма обработки строковых литералов. Вопросы и задания 593 Болыпинство ассемблеров двухпроходные. Во время первого прохода строится таблица символов для меток, литералов и объявляемых идентификаторов. Символические имена можно либо не сортировать и искать путем последовательного просмотра таблицы, либо сначала сортировать, а потом применять двоичный поиск, либо хэшировать. Если символические имена не нужно удалять во время первого прохода, хэширование — это лучший метод.
Исполняемая программа создается во время второго прохода. Что касается директив (псевдокоманд), то одни из них выполняются при первом проходе, другие— при втором. Программы, которые ассемблируются независимо друг от друга, можно скомпоновать вместе и получить исполняемую двоичную программу. Эту работу выполняет компоновщик. Его цель — это перераспределение в памяти и связывание имен. Динамическая компоновка — это технология, при которой определенные процедуры не компонуются до тех пор, пока они не вызваны. Библиотеки коллективного доступа в 11Х1Х и библиотеки динамической компоновки (1)ьЕ) в %'1поочз используют технологию динамической компоновки.
Вопросы и задания 1. Всего 2;4 кода программы отвечают за 50 ВЕ времени выполнения этой программы. Сравните следующие три стратегии с точки зрения времени программирования и выполнения. Предположим, что для написания программы на языке С требуется 100 человеко-месяцев, а программу на ассемблере писать в 10 раз труднее, но зато она работает в 4 раза эффективнее. 1) Вся программа написана на С. 2) Вся программа написана на ассемблере.
3) Программа сначала написана на С, а затем нужные 2 ВЕ программы переписаны на ассемблере. 2. Для двухпроходных ассемблеров существуют определенные соглашения. Могли бы они подойти и для следующих компиляторов: 1) Компилятор вместо ассемблерного кода генерирует объектные модули? 2) Компилятор генерирует символический язык ассемблера? 3. Все ассемблеры для процессоров 1пСе1 в качестве первого операнда получают целевой адрес, а в качестве второго — исходный адрес. Какие проблемы могут возникнуть прн другом подходе? 4. Можно ли следующую программу ассемблировать в два прохода? Е00 — это директива, которая приравнивает метку к выражению в поле операнда. А Е00 В В е00 с С Е000 0 Е004 594 Глава?. Уровень ассемблера Некая компания планирует разработать ассемблер для компьютера с 40-разрядным словом.
Чтобы снизить стоимость, менеджер проекта решил ограничить длину символических имен, чтобы каждое имя можно было хранить в одном слове. Менеджер объявил, что символические имена могут состоять только из букв, причем буква Д запрещена. Какова максимальная длина символического имени? Опишите вашу схему кодирования. Чем отличается команда от директивы? Чем отличается счетчик адресов команд от счетчика команд? А существует ли вообще между ними различие? Ведь тот и другой выполняют трассировку следующей команды в программе. Какой будет таблица символов (имен) после обработки следующих операто- ров ассемблера Репгшш 4 (первому оператору приписан адрес 1000)? Можете ли вы представить себе обстоятельства, при которых метка совпадет с кодом операции (например, может ли команда ИОУ использоваться в качест- ве метки)? Аргументируйте.
Какие шаги нужно совершить, чтобы путем двоичного поиска найти элемент «Вег)(е1еу» в следующем списке: Апп АгЪог, Вег)(е1еу, СашЪТЫяе, Епяепе, Ма(1)зоп, Ъ)етч Начеп, Ра!о А1го, Раза()епа, 8апга Сгпю 81опу Вгоо1(, Жезгтчоо(1, х'е1!отч 8рг(пйз. Когда будете вычислять средний элемент в списке из четного числа элементов, возьмите элемент, который идет сразу после среднего. 10.
Можно ли использовать двоичный поиск в таблице, в которой содержится простое число элементов? Вычислите хэш-код для каждого из следующих символических имен. Для этого сложите буквы (а = 1, Ь = 2 и т. д.) и возьмите результат по модулю раз- мера хэш-таблицы. Хэш-таблица содержит 19 слотов (от 0 до 18). 12. е1з,)ап, )е11е, шаайе Образует ли каждое символическое имя уникальное значение хэш-функции? Если нет, то как разрешить эту коллизию? Метод хэширования, описанный в тексте главы, позволяет скомпоновать все элементы, имеющие один хэш-код, в связном списке. Альтернативный метод — иметь только одну таблицу из п слотов, в которой в каждом слоте имеется пространство для одного ключа и его значения (или для указателей на них).
Если алгоритм хэширования порождает слог, который уже заполнен, производится вторая попытка с использованием того же алгоритма хэширо- ЕНЕНЕ5Т: К2: НН1ТНЕТ: мек!иеет; ЕО31: К!ВО: РОР ВХ РО5Н ВР МОУ ВР.5Р РОВН Х РО5Н 51 5ОВ 5!,ЗОО : (1 байт) ; (1 байт) : (2 байта) : (3 байта) : (1 байт) (3 байта) опоросы и задания 695 вания. Если и на этот раз слот заполнен, алгоритм применяется снова и т.
д. Так продолжается до тех пор, пока не будет найден пустой слог. Если доля слотов, которые уже заполнены, составляет Я, сколько попыток в среднем понадобится для того, чтобы ввести в таблицу новый символ7 14. Вероятно, когда-нибудь в будущем на одну микросхему можно будет поме- щать тысячи идентичных процессоров, каждый из которых содержит несколько слов локальной памяти. Если все процессоры могут считывать и записывать три общих регистра, то как реализовать ассоциативную память7 15.
Репйшш 4 имеет сегментированную архитектуру. Сегменты независимы. Ас семблер для этой машины может содержать директиву 5Е6 М, которая помещает последующий код и данные в сегмент М. Повлияет ли такая схема на счетчик адресов команд? 16. Программы часто компонуются с многочисленными библиотеками Е)Е) . А не будет ли более эффективным просто поместить все процедуры в один боль- шой 1)) (.-файл, а затем скомпоновать его? 17.
Можно ли отобразить Е)).).-файл на виртуальные адресные пространства двух процессов с разными виртуальными адресами7 Если да, то какие проблемы при этом возникают? Можно ли их разрешить7 Если нет, то что можно сделать, чтобы устранить их7 18. Опишем один из способов компоновки (статическая компоновка). Перед ока нированием библиотеки компоновщик составляет список необходимых процедур, то есть имен, которые в компонуемых модулях определены как внешние (ЕХТЕММ).
Затем компоновщик последовательно просматривает всю библиотеку, извлекая каждую процедуру, которая находится в списке нужных имен. Будет ли работать такая схема7 Если нет, то почему и как это можно исправить7 19. Может ли регистр использоваться в качестве фактического параметра в макровызове? А константа? Если да, то почему7 Если нет, то почему? 20. Вам нужно реализовать макроассемблер.
Из эстетических соображений ваш начальник решил, что макроопределения не должны предшествовать вызовам макросов. Как повлияет это решение на реализацию7 21. Подумайте, как можно поместить макроассемблер в бесконечный цикл. 22. Компоновщик считывает 5 модулей размером 200, 800, 600, 500 и 700 слов со- ответственно. Если они загружаются в этом порядке, то каковы константы пе- рераспределения памяти? 23. Напишите модуль таблицы символов, состоящий из двух процедур; еп1ег(зувЬо1, ча1пе) и 1ооМир(эупЬо1, ча1ие).
Первая вводит новые символические имена в таблицу, а вторая ищет их в таблице. Используйте какой-либо вариант хэширования. 596 Глава 7. Уровень ассемблера 24. Напишите простой ассемблер для компъютера М1с-1, о котором мы говорили в главе 4. Помимо оперирования машинными командами, обеспечьте возможность приписывать константы символическим именам во время ассемблирования, а также возможность ассемблировать константу в машинное слово. 25.