Реклама:

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)?

EVEREST: POP ВХ ; (1 байт)

К2: PUSH BP ; (1 байт)

WHITNEY: MOV BP,SP ; (2 байта)

MCKINLEY: PUSH X ; (3 байта)

FUJI: PUSH SI ; (1 байт)

KIBO: SUB SI,300 : (3 байта)

9. Можете ли вы представить себе обстоятельства, при которых метка совпадет с кодом операции (например, может ли команда M0V использоваться в качестве метки)? Аргументируйте.

10. Какие шаги нужно совершить, чтобы путем двоичного поиска найти элемент "Berkeley" в следующем списке: Ann Arbor, Berkeley, Cambridge, Eugene, Madison, New Haven, Palo Alto, Pasadena, Santa Cruz, Stony Brook, Westwood, Yellow Springs. Когда будете вычислять средний элемент в списке из четного числа элементов, возьмите элемент, который идет сразу после среднего.

11. Можно ли использовать двоичный поиск в таблице, в которой содержится простое число элементов?

12. Вычислите хэш-код для каждого из следующих символических имен. Для этого сложите буквы (а = 1, Ъ = 2 и т. д.) и возьмите результат по модулю размера хэш-таблицы. Хэш-таблица содержит 19 слотов (от 0 до 18).

els, jan, jelle, maaike

Образует ли каждое символическое имя уникальное значение хэш-функции? Если нет, то как разрешить эту коллизию?

13. Метод хэширования, описанный в тексте главы, позволяет скомпоновать все элементы, имеющие один хэш-код, в связном списке. Альтернативный метод - иметь только одну таблицу из п слотов, в которой в каждом слоте имеется пространство для одного ключа и его значения (или для указателей на них). Если алгоритм хэширования порождает слот, который уже заполнен, производится вторая попытка с использованием того же алгоритма хэширования. Если и на этот раз слот заполнен, алгоритм применяется снова и т. д. Так продолжается до тех пор, пока не будет найден пустой слот. Если доля слотов, которые уже заполнены, составляет R, сколько попыток в среднем понадобится для того, чтобы ввести в таблицу новый символ?

14. Вероятно, когда-нибудь в будущем на одну микросхему можно будет помещать тысячи идентичных процессоров, каждый из которых содержит несколько слов локальной памяти. Если все процессоры могут считывать и записывать три общих регистра, то как реализовать ассоциативную память?

15. Pentium 4 имеет сегментированную архитектуру. Сегменты независимы. Ассемблер для этой машины может содержать директиву SEG N, которая помещает последующий код и данные в сегмент N. Повлияет ли такая схема на счетчик адресов команд?

16. Программы часто компонуются с многочисленными библиотеками DLL. А не будет ли более эффективным просто поместить все процедуры в один большой DLL-файл, а затем скомпоновать его?

17. Можно ли отобразить DLL-файл на виртуальные адресные пространства двух процессов с разными виртуальными адресами? Если да, то какие проблемы при этом возникают? Можно ли их разрешить? Если нет, то что можно сделать, чтобы устранить их?

18. Опишем один из способов компоновки (статическая компоновка). Перед сканированием библиотеки компоновщик составляет список необходимых процедур, то есть имен, которые в компонуемых модулях определены как внешние (EXTERN). Затем компоновщик последовательно просматривает всю библиотеку, извлекая каждую процедуру, которая находится в списке нужных имен. Будет ли работать такая схема? Если нет, то почему и как это можно исправить?

19. Может ли регистр использоваться в качестве фактического параметра в макровызове? А константа? Если да, то почему? Если нет, то почему?

20. Вам нужно реализовать макроассемблер. Из эстетических соображений ваш начальник решил, что макроопределения не должны предшествовать вызовам макросов. Как повлияет это решение на реализацию?

21. Подумайте, как можно поместить макроассемблер в бесконечный цикл.

22. Компоновщик считывает 5 модулей размером 200, 800, 600, 500 и 700 слов соответственно. Если они загружаются в этом порядке, то каковы константы перераспределения памяти?

23. Напишите модуль таблицы символов, состоящий из двух процедур: enter (symbol, value) и lookup (symbol, value). Первая вводит новые символические имена в таблицу, а вторая ищет их в таблице. Используйте какой-либо вариант хэширования.

24. Напишите простой ассемблер для компьютера Млс-1, о котором мы говорили в главе 4. Помимо оперирования машинными командами, обеспечьте возможность приписывать константы символическим именам во время ассемблирования, а также возможность ассемблировать константу в машинное слово.

25. Добавьте макросы к ассемблеру, который вы должны были написать, выполняя предыдущее задание.

Краткое содержание главы7 || Оглавление || Глава 8. Параллельные компьютерные архитектуры