Хорошо, это встроенный ассемблер gcc, который очень мощный, но трудный для понимания.
Во-первых,% char - это специальный char. Это позволяет вам определять регистр и номер заполнителей (более подробно об этом позже). К сожалению,% также используется как часть имени регистра (например,% EAX), поэтому в встроенном ассемблере gcc вы должны использовать два процента символов, если хотите назвать регистр.
% 0,% 1 и% 2 (и т. Д.) Являются входными и выходными операндами-заполнителями. Они определены в списке, за которым следует строка ассемблера.
В вашем примере% 0 становится заполнителем для y, а% 1 становится заполнителем для x. Компилятор будет следить за тем, чтобы переменные были в регистрах для входных операндов до того, как исполняется asm-код, и он будет гарантировать, что выходной операнд будет записан в переменную, указанную в списке выходных операндов.
Теперь вы должны понять, что такое r (y): это входной операнд, который резервирует регистр для переменной y и присваивает его заполнителю% 1 (поскольку это второй операнд, указанный после строки встроенного ассемблера ).
Есть много других типов заполнителей. m позволяет вам указать место в памяти, и если я не ошибаюсь, я могу быть использован для числовых констант. Вы найдете их все в документации gcc.
Тогда есть список клоббер. Этот список важен! В нем перечислены все регистры, флаги и т. Д., Которые модифицируются в вашем коде ассемблера (например, EAX в вашем примере). Если вы ошибетесь, оптимизатор не узнает, что было изменено, и очень вероятно, что вы получите код, который не работает.
Ваш пример, кстати, почти бессмыслен. Он просто загружает значение X в регистр и присваивает этот регистр EAX. После этого EAX сохраняется в другом регистре, который впоследствии станет вашей переменной y. Так что все, что он делает, это простое задание:
y = x;
И последнее: если вы раньше работали с ассемблером в стиле Intel: вы должны прочитать аргументы в обратном направлении. Для всех инструкций исходным операндом является тот, который следует за самой инструкцией, а целевой операнд - справа от запятой. По сравнению с синтаксисом Intel это совсем наоборот.