... Я не понимаю ... цель двоеточиями ...
Как отметил Коломбо в своем комментарии, вот соответствующая страница руководства: 6.43.2 Extended Asm - Assembler Instructions with C Expression Operands. Двоеточия просто разделяют токены в блоке ASM. Они похожи на точку с запятой, завершающую инструкцию C (или, вернее, оператор запятой, поскольку они связаны).
И повторить то, что страница говорит, общий формат:
asm (
Instructions (Assembler Code)
: Outputs (C variables modified by the instructions)
: Inputs (C expressions read by the instructions)
: Clobbers (Registers or other values changed by the instructions)
)
Иногда не будет никаких маркеров между точкой с запятой. Например, вот что барьер памяти выглядит следующим образом:
__asm__ __volatile__ ("" ::: "memory")
Там нет кода на ассемблере, нет никаких C переменные, используемые в качестве вывода, и нет никаких C выражений, используемых в качестве входных данных. Но память указана как сбитая, поэтому компилятор знает, что ожидающие завершения чтения и записи были выполнены до того, как будет выполнена следующая инструкция.
... Я не понимаю ... смысл __volatile__
ОК, так что это может червей, потому что GCC и Visual Studio интерпретировать смысл volatile
по-разному (даже если они используют ту же спецификацию языка C).
В GCC единственная причина использования volatile
- это когда аппаратное обеспечение может менять память. Поэтому я считаю, что использование квалификатора volatile
является злоупотреблением в приведенном выше примере (поскольку он выглядит так, как функция сканирует байт NULL
и не выполняет операции ввода/вывода с отображением памяти).
Вы можете найти соответствующее обсуждение в списке рассылки GCC по адресу volatile shared memory. Ян Лэнс Тейлор, который предоставил ответ ниже, является одним из разработчиков GCC:
Нет, изменчивый не может решить эту проблему. Это не то, что для летучего . Летучий определитель предназначен для работы с аппаратным обеспечением памяти . Он не предназначен для многопроцессорной общей памяти . Если программа не является многопроцессорной, то добавление volatile никогда не сделает ее многопроцессорной.
EDIT: Как Тони указал ниже, volatile
is used to tame the optimizer так, что блок ASM не удаляется во время компиляции.
Также обратите внимание, что вы можете преобразовать код встроенный ассемблер для x86, но вы не можете сделать это для x64. Microsoft не поддерживает встроенную сборку для x64. См. Intrinsics and Inline Assembly на MSDN.
[Первый удар по Google] (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html). Вы в основном просите нас обобщить эту страницу? – Columbo
Нет, я пробовал самостоятельно несколькими способами, но не смог добиться успеха, поэтому я разместил здесь оригинальный код. – user1326293
Это похоже на 'strlen()' или подобное. Почему вы беспокоитесь и не используете обычный цикл или подходящую существующую замену? – wilx