Необходимо указать, что hi
является одновременно входом и выходом.Примерно так:
asm volatile (
"shld $0x3, %1, %0;\n"
: "=r"(hi)
: "r"(lo)
, "0"(hi)
:
);
, который производит следующий код сборки:
mov -0x10(%rbp),%rdx
mov -0x8(%rbp),%rax
shld $0x3,%rdx,%rax
mov %rax,-0x8(%rbp)
«0» говорит, что этот операнд (номер 2) должен совпадать с операндом номер 0,который кажется бесполезным, за исключением того, что он делает этот регистр и входом, и выходом.