Ваш встроенный ассемблерный код сломан. Вы не можете напрямую использовать EAX и EBX, не добавляя их в список clobber. В противном случае компилятор теперь не изменит, какие регистры были изменены.
Весьма вероятно, что один из зарегистрированных вами регистров содержит что-то важное, что впоследствии вызвало ошибку сегментации.
Этот код будет копировать один элемент из array1 в массив2:
asm (
"movl (%0), %%eax \n\t" /* read first dword from array1 into eax */
"movl %%eax, (%1) \n\t" /* write dword into array2
: /* outputs */
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "eax", "memory"
);
лучшую версию с надлежащими ограничениями регистра сбросят трудно закодированный EAX, как это:
int dummy;
asm (
"movl (%1), %0 \n\t"
"movl %0, (%2) \n\t"
: /* outputs, temps.. */ "=r" (dummy)
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "memory"
);
Btw - В общем, у меня такое ощущение, что вы еще не знакомы с ассемблером. Написание inline-ассемблера немного сложнее получить из-за всей магии компилятора. Я предлагаю вам начать писать некоторые простые функции в ассемблере и сначала поместить их в отдельный файл .S. Это намного проще.
Дайте парсеру работать, прекратите добавлять HTML-тег - вы отбрасываете выделение, которое делает SO. –
Вы просто копируете один элемент из массива в другой массив? Это не похоже на то, что поможет оптимизация сборки узлов. –
Вы должны добавить немного более подробную информацию о том, почему вы хотите сделать это в сборке, или вы просто получите много «зачем беспокоиться»? ответы. –