Расширенный asm дает следующее описание относительно модификатора "+"
:
Операнды, использующие модификатор ограничения «+», считаются в качестве двух операндов (то есть оба в качестве входных данныхи вывод) к максимальному значению 30 операндов на оператор asm.
Поэтому я предполагаю, что нет необходимости упоминать выходной операнд с модификатором "+" в разделе ввода снова, но этоне указано, как определить их индекс. Я написал следующий пример Godbolt :
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
void asm_add(uint64_t o1, uint64_t o2, uint64_t o3){
__asm__ volatile (
"addq %2, %3\n\
addq %2, %4":
"+r" (o2), "+r" (o3):
"r" (o1):
"cc"
);
printf("o2 = %" PRIu64 "\n", o2);
printf("o3 = %" PRIu64 "\n", o3);
}
int main(void){
asm_add(20, 30, 40);
}
На котором напечатано
o2 = 50
o3 = 60
Является ли шаблон с использованием +
__asm__ volatile (
"addq %2, %3\n\
addq %2, %4":
"+r" (o2), "+r" (o3):
"r" (o1):
"cc"
);
точнотак же, как
__asm__ volatile (
"addq %2, %3\n\
addq %2, %4":
"+r" (o2), "+r" (o3):
"r" (o1), "0" (o2), "1" (o3):
"cc"
);
, где все входы указаны явно? Таким образом, в первом примере «неявные» входы добавляются.