Вопрос

Я пытаюсь понять этот встроенный ассемблерный код, который исходит из _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=""> и подобных местах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top