Пояснение % %
Link to originalВвиду того, что сборщик интерпретирует два подряд идущих знака процента как начало комментария, он не отображает содержимое, находящееся между парой таких знаков. Поэтому, чтобы избежать этого, вместо использования %% везде применяется % %.
В коде на языке C с использованием встроенного ассемблера символ %
используется для обозначения операндов, регистров и меток. Вот более подробное объяснение значений %
и % %
:
Значения символов % и %%
-
%
в C-коде: В языке C символ%
используется для обозначения имен переменных, которые будут переданы в ассемблерную вставку. Это помогает компилятору понять, какие переменные из C-кода должны быть связаны с операндами в ассемблерном коде. Пример:[array_ptr] "m"(array_ptr)
- здесь%[array_ptr]
указывает на переменнуюarray_ptr
из C-кода. -
% %
в ассемблерном коде: Внутри ассемблерной вставки, чтобы отличить регистры и метки от переменных C, используется двойной символ%
. Это необходимо, чтобы избежать конфликтов имен. Пример:mov %[array_ptr], % %rdi
- здесь% %rdi
указывает на регистрrdi
в ассемблерном коде.
Пример использования
Рассмотрим строку из вашего кода:
__asm__(
"mov %[array_ptr], % %rdi;"
...
:
: [array_ptr] "m"(array_ptr), [N] "r"(n)
: "rax", "rbx", "rcx", "rdx", "rdi"
);
Здесь происходит следующее:
mov %[array_ptr], % %rdi;
- загружает адрес массиваarray_ptr
из C-кода в регистрrdi
. Символ%[array_ptr]
обозначает переменнуюarray_ptr
, переданную из C-кода, а% %rdi
обозначает регистрrdi
в ассемблерном коде.- В секции входных операндов
: [array_ptr] "m"(array_ptr), [N] "r"(n)
символы%
используются для обозначения переменныхarray_ptr
иn
из C-кода.
Общий смысл
- %[имя_переменной]: используется для обозначения переменной из C-кода внутри ассемблерной вставки.
- %%имя_регистра: используется для обозначения регистров процессора или меток внутри ассемблерного кода.
Использование этих символов помогает избежать путаницы и позволяет интегрировать ассемблерный код с C-кодом эффективно.