Перед кодом ассемблера, как GCC узнает, что регистр служит кешем для области памяти и, следовательно, должен быть сброшен в память?
Поскольку GCC является единственнымкто генерирует этот код
Как правило, с точки зрения GCC:
[C code to compile]
[your inline asm with clobber]
[C code to compile]
GCC генерирует инструкции по сборке до и после встроенного ассемблера, следовательно, он знает все до и после него.Теперь, поскольку клоббер памяти означает барьер памяти sw, применяется следующее:
[GCC generated asm]
[compiler memory barrier]
[GCC generated asm]
Таким образом, GCC генерирует сборку до и после барьера и знает, что он не может иметь доступ к памяти, пересекающий барьер памяти.По сути, с точки зрения GCC, есть код для компиляции, затем барьер памяти, затем больше кода для компиляции, и все, единственное ограничение, которое применяется барьером памяти, заключается в том, что сгенерированный GCC код не должен иметь доступ к памяти, пересекающий этот барьер.
Таким образом, если, например, GCC загружает регистр со значением из памяти, изменяет его и сохраняет его обратно в память, загрузка и сохранение не могут пересечь барьер.В зависимости от кода, они должны находиться до или после барьера (или дважды с обеих сторон).
Я бы порекомендовал вам прочитать эту связанную SO тему .