9.3.2. Выходные операнды
9.3.2. Выходные операнды
Во второй секции указаны выходные операнды инструкции. Каждому операнду соответствует строка адресации и выражение языка С, записанное в скобках. В случае выходных операндов (все они должны быть левосторонними значениями) строка адресации должна начинаться со знака равенства. Компилятор проверяет, действительно ли каждый выходной операнд является левосторонним значением (т.е может стоять в левой части оператора присваивания).
Список обозначений регистров для конкретной архитектуры можно найти в исходных текстах компилятора gcc (конкретнее — в определении макроса REG_CLASS_FROM_LETTER). Например, в файле gcc/config/i386/i386.h содержатся обозначения, соответствующие архитектуре x86 (табл. 9.1).
Таблица 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)Если есть несколько однотипных операндов, то они разделяются запятыми, как показано в секции входных операндов. Всего можно задавать до десяти операндов, адресуемых как %0, %1, … %9. Если выходные операнды отсутствуют, но есть входные операнды или модифицируемые регистры, то вторую секцию следует оставить пустой или пометить ее комментарием наподобие /* нет выходных данных */.