В встроенном ассемблере GCC (GNU Compiler Collection) символ = в спецификаторе операнда используется для обозначения операндов, которые являются выходными. Он указывает компилятору, что значение этого операнда будет изменено инструкциями ассемблера, и что это измененное значение нужно сохранить. Вот подробное объяснение:

Примеры использования

Рассмотрим пример использования = для указания выходного операнда:

int result;
__asm__(
    "mov $10, eax, %[output];"
    : [output] "=m"(result)  // Операнд является выходным
    :
    : "eax"
);

В этом примере:

  • : [output] "=m"(result) указывает, что result является выходным операндом и должен быть размещен в памяти (m означает память).
  • "mov %%eax, %[output];" копирует значение регистра eax в result.

Другой пример с несколькими выходными операндами

int x = 5, y = 3, sum, diff;
__asm__(
    "add %[a], %[b];"
    "mov %[b], %[s];"
    "sub %[a], %[b];"
    "mov %[b], %[d];"
    : [s] "=r"(sum), [d] "=r"(diff)  // Два выходных операнда
    : [a] "r"(x), [b] "r"(y)
);

В этом примере:

  • [s] "=r"(sum) указывает, что sum будет размещен в регистре (r), и что это выходной операнд.
  • [d] "=r"(diff) указывает, что diff также будет размещен в регистре и является выходным операндом.
  • [a] "r"(x) и [b] "r"(y) указывают на входные операнды, которые будут размещены в регистрах.

Полный пример с выходным операндом

#include <stdio.h>
 
int main() {
    int a = 5, b = 10, result;
    __asm__(
        "add %[input_b], %[input_a];"  // Складываем значения
        "mov %[input_a], %[output];"   // Сохраняем результат в output
        : [output] "=r" (result)       // Спецификатор для выходного операнда
        : [input_a] "r" (a), [input_b] "r" (b)
    );
 
    printf("Result: %d\n", result); // Ожидаемый результат: 15
    return 0;
}

Здесь:

  • "=r" (result) указывает, что result будет выходным операндом, который будет размещен в регистре.
  • : [input_a] "r" (a), [input_b] "r" (b) указывает на входные операнды a и b, которые также будут размещены в регистрах.

Заключение

Символ = в спецификаторе операнда в GCC встроенном ассемблере используется для обозначения выходных операндов. Он указывает компилятору, что эти операнды будут изменены ассемблерными инструкциями и что измененные значения нужно сохранить. Понимание этого синтаксиса позволяет писать более точный и эффективный ассемблерный код, интегрированный с кодом на C.