Что означает %c в коде встроенной сборки GCC?
-
16-09-2019 - |
Вопрос
Я пытаюсь понять этот встроенный ассемблерный код, который исходит из _hypercall0
здесь.
asm volatile ("call hypercall_page+%c[offset]" \
: "=r" (__res) \
: [offset] "i" (__HYPERVISOR_##name * sizeof(hypercall_page[0])) \
: "memory", "edi", "esi", "edx", "ecx", "ebx", "eax")
У меня возникли проблемы с поиском информации о том, что %c
в первой строке означает.Я не нашел никакой информации в самом очевидном разделе Руководство по GCC, что объясняет %[name]
, но не %c[name]
.Есть ли еще какое-нибудь место, на которое мне следует обратить внимание?
Решение
Из Документация по внутренним элементам GCC:
`%cцифра' может использоваться для замены операнда, который является постоянным значением без синтаксиса, который обычно указывает на непосредственный операнд.
Другие советы
Проверьте выходные данные сборки (с помощью gcc -S
, или, может быть, разобрать объектный файл), и это может быть понятнее.
Я предполагаю, что это означает постоянный. hypercall_page
выглядит как таблица инструкций, каждая из которых выполняет системный вызов.Может быть, это сгенерирует call hypercall_page + {constant based on the expression given}
, по существу, вычислив адрес этого смещения во время компиляции.
В качестве отступления, это __HYPERVISOR##name
материал действительно напоминает мне о __NR_name_of_syscall
соглашение о типах, которое вы видите для системных вызовов в Linux <asm unistd.h=""> и подобных местах.