Пояснение % %

Link to original

В коде на языке C с использованием встроенного ассемблера символ % используется для обозначения операндов, регистров и меток. Вот более подробное объяснение значений % и % %:

Значения символов % и %%

  1. % в C-коде: В языке C символ % используется для обозначения имен переменных, которые будут переданы в ассемблерную вставку. Это помогает компилятору понять, какие переменные из C-кода должны быть связаны с операндами в ассемблерном коде. Пример: [array_ptr] "m"(array_ptr) - здесь %[array_ptr] указывает на переменную array_ptr из C-кода.

  2. % % в ассемблерном коде: Внутри ассемблерной вставки, чтобы отличить регистры и метки от переменных 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"  
);

Здесь происходит следующее:

  1. mov %[array_ptr], % %rdi; - загружает адрес массива array_ptr из C-кода в регистр rdi. Символ %[array_ptr] обозначает переменную array_ptr, переданную из C-кода, а % %rdi обозначает регистр rdi в ассемблерном коде.
  2. В секции входных операндов : [array_ptr] "m"(array_ptr), [N] "r"(n) символы % используются для обозначения переменных array_ptr и n из C-кода.

Общий смысл

  • %[имя_переменной]: используется для обозначения переменной из C-кода внутри ассемблерной вставки.
  • %%имя_регистра: используется для обозначения регистров процессора или меток внутри ассемблерного кода.

Использование этих символов помогает избежать путаницы и позволяет интегрировать ассемблерный код с C-кодом эффективно.