Программирование для Linux. Профессиональный подход
Шрифт:
В третьей секции перечислены входные операнды. Переменная
Выражение
9.2.1. Преобразование функции asm в ассемблерные инструкции
Компилятор
Например, следующий фрагмент программы:
будет преобразован в такую последовательность команд x86:
Переменные
Первые две команды копируют переменную foo в регистры
9.3. Расширенный синтаксис ассемблерных вставок
В следующих подразделах будет описан синтаксис правил, по которым строятся выражения в функции
Сначала инструкция
9.3.1. Ассемблерные инструкции
Первая секция содержит ассемблерные инструкции, заключенные в кавычки. В рассматриваемом примере таких инструкций две:
Компилятор игнорирует содержимое первого раздела, разве что один уровень символов процента удаляется, т.е. вместо
Если при компиляции программы, содержащей функцию
9.3.2. Выходные операнды
Во второй секции указаны выходные операнды инструкции. Каждому операнду соответствует строка адресации и выражение языка С, записанное в скобках. В случае выходных операндов (все они должны быть левосторонними значениями) строка адресации должна начинаться со знака равенства. Компилятор проверяет, действительно ли каждый выходной операнд является левосторонним значением (т.е может стоять в левой части оператора присваивания).
Список обозначений регистров для конкретной архитектуры можно найти в исходных текстах компилятора
Таблица 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. Модифицируемые регистры
Если в качестве побочного эффекта инструкция модифицирует значение одного или нескольких регистров, в функции