Самьюэл Алекс
Шрифт:
Таблица 9.1. Обозначения регистров в архитектуре Intel x86
Символ регистра | Регистры, которые могут использоваться компилятором gcc |
---|---|
R | Регистры общего назначения (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP) |
q | Общие регистры хранения данных (EAX, ЕВХ, ECX, EDX) |
f | Регистр для чисел с плавающей запятой |
t | Верхний стековый регистр для чисел с плавающей запятой |
u | Второй после верхнего стековый регистр для чисел с плавающей запятой |
a | Регистр EAX |
b | Регистр EBX |
с | Регистр ECX |
d | Регистр EDX |
x | Регистр SSE (регистр потокового расширения SIMD) |
y | Мультимедийные регистры MMX |
A | Восьмибайтовое значение, формируемое из регистров EAX и EDX |
D | Указатель приемной строки в строковых операциях (EDI) |
S | Указатель исходной строки в строковых операциях (ESI) |
Если есть несколько однотипных операндов, то они разделяются запятыми, как показано в секции входных операндов. Всего можно задавать до десяти операндов, адресуемых как
9.3.3. Входные операнды
В третьей секции задаются входные операнды. Строка адресации такого операнда не должна содержать знака равенства, в остальном синтаксис совпадает с синтаксисом выходных операндов.
Если требуется указать, что в одной инструкции осуществляется как чтение регистра, так и запись в него, необходимо в строке адресации входного операнда поставить номер выходного операнда. Например, если входной регистр должен быть тем же, что и регистр первого выходного операнда, назначьте ему номер 0. Выходные операнды нумеруются слева направо, начиная с нуля. Если просто указать одинаковое C-выражение для входного и выходного операндов, то это еще не означает, что оба значения будут помещены в один и тот же регистр.
Данную секцию можно пропустить, если входные операнды отсутствуют и следующая секция модифицируемых регистров пуста.
9.3.4. Модифицируемые регистры
Если в качестве побочного эффекта инструкция модифицирует значение одного или нескольких регистров, в функции
9.4. Пример
В архитектуре x86 есть инструкции, определяющие позицию старшего и младшего значащих битов в слове. Процессор выполняет эти инструкции очень быстро. С другой стороны, чтобы сделать то же самое на языке С, потребуется написать цикл с операциями побитового сдвига.
Инструкция
Ей соответствует такой фрагмент на языке С:
Чтобы сравнить скорость выполнения двух фрагментов, мы поместили их в цикл, где перебирается большое количество чисел. В листинге 9.1 приведена реализация на языке С. Программа перебирает значения от единицы до числа, указанного в командной строке. Для каждого значения переменной number вычисляется позиция старшего значащего бита. В листинге 9.2 показано, как сделать то же самое с помощью ассемблерной вставки. Обратите внимание на то, что в обоих случаях результат вычислений заносится в переменную