Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Программирование для Linux. Профессиональный подход - Митчелл М.

Митчелл М., Оулдем Дж., Самьюал А. Программирование для Linux. Профессиональный подход — М.: Вильямс , 2003. — 288 c.
ISBN 5-8459-0243-6
Скачать (прямая ссылка): programmirovaniedlyalinux2003.djvu
Предыдущая << 1 .. 75 76 77 78 79 80 < 81 > 82 83 84 85 86 87 .. 128 >> Следующая

Глава 9. Встроенный ассемблерный код 175
9.3.2- Выходные операнды
Во второй секции указаны выходные операнды инструкции. Каждому операнду
соответствует строка адресации и выражение языка С, записанное в скобках.
В случае выходных операндов (все они должны быть левосторонними
значениями) строка адресации должна начинаться со знака равенства.
Компилятор проверяет, действительно ли каждый выходной операнд является
левосторонним значением (т.е может стоять в левой части оператора
присваивания).
Список обозначений pei негров для конкретной архитектуры можно найти в
исходных текстах компилятора gcc (конкретнее - в определении макроса
REG_CLASS_FROM_LETTER). Например, в файле gcc/config/i386/i386.h
содержатся обозначения, соответствующие архитектуре х86 (табл. 9.1).
Таблица 9.1. Обозначения регистров в архитектуре Intel х86
Символ регистра Регистры, которые могут использоваться компилятором gcc
К Регистры общего назначения (ЕАХ, ЕВХ, ЕСХ. EDX, ESI, EDI, EBP, ESP)
Ч Общие регистры хранения данных (ЕАХ. ЕВХ. ЕСХ. EDX)
f Регистр для чисел с плавающей запятой
г Верхний стековый регистр д ля чисел с плавающей запятой
U Второй после верхнего стековый регистр для чисел с плавающей
запятой
а Регистр ЕАХ
Ь Регистр ЕВХ
с Регистр ЕСХ
d Регистр EDX
X Регистр SSE (регистр потокового расширения SIMD)
У Мультимедийные регистрм ММХ
Л Восьмибайтовое значение, формируемое из регистров ЕАХ и EDX
D Указатель приемной строки в строковых операциях (EDI)
S Указатель исходной строки в строковых операциях (ESI)
Если есть несколько однотипных операндов, то они разделяются запятыми,
как показано в секции входных операндов. Всего можно задавать до десяти
операндов, адресуемых как %0, %1, ... %9. Еслн выходные операнды
отсутствуют, но есть входные операнды или модифицируемые регистры, то
вторую секцию следует оставить пустой или пометить ее комментарием
наподобие /* нет выходных данных */.
9.3.3. Входные операнды
В третьей секции задаются входные операнды. Строка адресации такого
операнда ие должна содержать знака равенства, в остальном синтаксис
совпадает с синтаксисом выходных операндов.
Если требуется указать, что в одной инструкции осуществляется как чтение
регистра, так и запись в него, необходимо в строке адресации входного
операнда поставить номер выходного операнда. Например, если входной
регистр должен быть тем же, что и регистр первого выходного операнда,
назначьте ему номер 0. Выходные операнды нумеруются слева направо,
начиная с нуля. Если просто указать одинаковое С-выражение для входного и
выходного операндов, то это еще не означает, что оба значения будут
помещены в один и тот же регистр.
Данную секцию можно пропустить, если входные операнды отсутствуют и
следующая секция модифицируемых регистров пуста.
176 Часть II. Секреты Linux
9.3.4. Модифицируемые регистры
Если в качестве побочного эффекта инструкция модифицирует значение одного
или нескольких регистров., в функции asm С) должна присутствовать
четвертая секция. Например, инструкция fucomip меняет регистр кода
завершения, обозначаемый как сс. Строки, представляющие затираемые
регистры, разделяются запятыми. Если инструкция способна изменить
произвольную ячейку памяти, в этой секции должно стоять ключевое слово
memory. На основании этой информации компилятор определяет, какие
значения должны быть загружены повторно после завершения функции asm().
При отсутствии данной секции компилятор может еде тать неверное
предположение о том, что регистры содержат прежние значения, н это
скажется на работе программы.
9.4. Пример
В архитектуре х86 есть инструкции, определяющие позицию старшего и
младшего значащих битов в слове. Процессор выполняет эти инструкции очень
быстро. С другой стороны, чтобы сделать то же самое на языке С,
потребуется иаписать цикл с операциями побитового сдвига.
Инструкция bsrl вычисляет местоположение старшего значащего бита в нервом
операнде и записывает резучьтат (иомер позиции начиная с нуля) во второй
операнд. Например, следующая команда анализирует переменную number и
помещает результат в переменную pos i t ion:
asm {"bsrl %1, %G" : *=r" (positxon) : "r* (number)};
Ей соответствует такой фрагмент на языке С: long х;
for (i (number " 1), position = 0; i != 0; ++position) x "- 1;
Чтобы сравнить скорость выполнения двух фрагментов, мы поместили их в
цикл, где перебирается большое количество чисел. В листинге 9.1 приведена
реализация на языке С. Программа перебирает значения от единицы до числа,
указанного в командной строке. Для каждого значения переменной number
вычисляется позиция старшего значащего бита. В листинге 9.2 показано, как
сделать то же самое с помощью ассемблерной вставки. Обратите внимание на
то, что в обоих случаях результат вычислений заносится в переменную
result, объявленную со спецификатором volatxle. Это необходимо для
подавления оптимизации со стороны компилятора, который удалит весь блок
вычислений, если их результаты не используются или не заносятся в память.
Предыдущая << 1 .. 75 76 77 78 79 80 < 81 > 82 83 84 85 86 87 .. 128 >> Следующая