Понимание функции x86 ASM в C - PullRequest
       7

Понимание функции x86 ASM в C

0 голосов
/ 27 сентября 2018

В настоящее время я работаю над проектом pintos, и у меня возник вопрос о некоторых макросах сборки, которые включены в проект

#define syscall1(NUMBER, ARG0)                                           \
({                                                               \
  int retval;                                                    \
  asm volatile                                                   \
    ("pushl %[arg0]; pushl %[number]; int $0x30; addl $8, %%esp" \
       : "=a" (retval)                                           \
       : [number] "i" (NUMBER),                                  \
         [arg0] "g" (ARG0)                                       \
       : "memory");                                              \
  retval;                                                        \
})

Этот макрос вызывается для установки стека для системного вызова только с одним аргументом.Мы выдвигаем один аргумент, номер системного вызова и переходим к ядру.Мы пропускаем только NUMBER и ARG0, мне было интересно, откуда взялись [number] и [arg0] (строчные буквы).Я прочитал несколько документов, но не нашел ответов.Хотелось бы помочь!

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

В расширенном синтаксисе GCC для обозначения [ name ] " ограничений " ( выражение ) говорит:

  • Сделать выражение доступным для кода сборки.
  • Поместить выражение в месте, удовлетворяющем ограничениям .Ограничения описывают приемлемые места для использования, такие как общие регистры процессора, регистры с плавающей запятой и память.Они могут также включать символы, указывающие GCC, что выражение будет изменено кодом сборки или и прочитано, и изменено.(Для выходных операндов выражение должно быть lvalue, чтобы обеспечить место для записи нового значения.)
  • Использовать name в качестве названия места.Затем, когда GCC видит % [ name ] в коде сборки, он заменяет его на выражение сборки, которое указывает на это место, например %raxили 16(r3). [ name ] часть записи операнда является необязательной.Если вы этого не сделаете, GCC присваивает имена операндов 0, 1, 2,…, поэтому код ассемблера будет ссылаться на них с % 0 , % 1 , % 2 , ...
0 голосов
/ 27 сентября 2018

Часть, заключенная в квадратные скобки, является символическим именем, используемым только в шаблоне ASM.Часть в скобках - это ссылка на имя переменной в вашей C-программе.(Более подробное описание ниже)

Из документации GCC для шаблона ASM:

[ [asmSymbolicName] ] constraint (cvariablename)
  • asmSymbolicName

    Указывает символическое имя для операнда.Назовите имя в шаблоне ассемблера, заключив его в квадратные скобки (т. Е. «% [Value]»).Область действия имени - это оператор asm, содержащий определение. * Допустимо любое допустимое имя переменной C, включая имена, уже определенные в окружающем коде. * Нет двух операндов внутриВ этом же операторе asm может использоваться одно и то же символическое имя.

    Если не используется asmSymbolicName, используйте положение операнда (начиная с нуля) в списке операндов в шаблоне ассемблера.Например, если есть три выходных операнда, используйте «% 0» в шаблоне для ссылки на первый, «% 1» для второго и «% 2» для третьего.

  • ограничение

    Строковая константа, определяющая ограничения на размещение операнда;Подробности см. В разделе Ограничения.
    Выходные ограничения должны начинаться с '=' (переменная перезаписывает существующее значение) или с '+' (при чтении и записи).При использовании '=' не предполагайте, что местоположение содержит существующее значение при входе в asm, за исключением случаев, когда операнд связан со входом;см. Входные операнды.

    После префикса должно быть одно или несколько дополнительных ограничений (см. Ограничения), которые описывают, где находится значение.Общие ограничения включают «r» для регистра и «m» для памяти.Когда вы перечисляете более одного возможного местоположения (например, "= rm"), компилятор выбирает наиболее эффективное, основываясь на текущем контексте.Если вы перечисляете столько альтернатив, сколько позволяет оператор asm, вы разрешаете оптимизаторам создавать наилучший код.Если вам необходимо использовать конкретный регистр, но ваши машинные ограничения не обеспечивают достаточного контроля для выбора нужного регистра, переменные локального регистра могут обеспечить решение (см. Переменные локального регистра).

  • cvariablename

    Определяет выражение C lvalue для хранения выходных данных, обычно это имя переменной.Заключенные в скобки являются обязательной частью синтаксиса. *

...

Расширенные инструкции Asm - Ассемблер с операндами выражения C

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...