ОК, поэтому я не могу оставить комментарий выше, но я уверен, что правильный синтаксис (отличный от показанного выше):
asm ( "your assembly instructions"
: "=a"(output1),
"=r"(output2),
"=q"(output3),
"=A"(output4)
: /* inputs */
: /* clobbered registers */
);
Хотя вы можете оставить распределение входных и выходных регистров компилятору, нет очевидного способа оставить выделение чистых / временных регистров (т. Е. Используемых для промежуточных значений, но не для ввода или вывода) для компилятора. Исторически, я просто перечислял их явно в списке clobber (например, "% xmm1", "% rcx"), но теперь я думаю, что было бы лучше перечислить их как выходные данные, чтобы компилятор мог их выбрать. Я не знаю ни одного источника, который бы решал эту проблему окончательно.