Мне пришлось написать алгоритм быстрой сортировки на C ++ со встроенной сборкой и сравнить его с кодом без встроенной сборки. Он правильно собирается и работает на чистом C ++, но кажется, что он бесконечно зацикливается, когда находится на сборке.
Пожалуйста, помогите мне выяснить, что не так с встроенным. ПОЖАЛУЙСТА, ОЧЕНЬ ПОЖАЛУЙСТА !!!!!
Это синтаксис GAS на Mac, XCode.
Вот код на C ++ без встроенной сборки и с на pastebin. И это сопровождается тем же кодом ниже:
void swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp; }
C ++ без встроенной сборки
void quicksort(int numbers[], int left, size_t right) {
if (left<right) {
int i = left;
int pivot=numbers[right];
for (int j=left; j<right; j++) {
if(numbers[j]<=pivot) {
swap(numbers[i], numbers[j]);
i++;
}
}
swap(numbers[i], numbers[right]);
quicksort(numbers, left, i-1);//, left);
quicksort(numbers, i+1, right);//, i+1);
} }
C ++ со встроенной сборкой
void quicksort(int numbers[], int left, size_t right) {
if (left<right){
int i = left;
asm volatile (
"movl (%[numbers], %%rdx, 4), %%esi \n\t"
"movl %%ebx, %%ecx \n\t""for: \n\t""cmp %%edx, %%ecx \n\t""jge endfor \n\t"
"if: \n\t""movl (%[numbers], %%rcx, 4), %%edi \n\t""cmp %%esi, %%edi \n\t""jg endif \n\t"
"movl (%[numbers], %%rax, 4), %%edi \n\t""movl (%[numbers], %%rcx, 4), %%esp \n\t""movl %%edi, (%[numbers], %%rcx, 4) \n\t""movl %%esp, (%[numbers], %%rax, 4) \n\t"
"incl %%eax \n\t"
"endif: \n\t"
"incl %%ecx \n\t""jmp for \n\t""endfor: \n\t"
: "=b" (left), "=d" (right), "=a" (i)
: [numbers] "r" (numbers), "b" (left), "d" (right), "a" (i)
: "memory", "ecx", "esi", "esp", "edi");
swap(numbers[i], numbers[right]);
quicksort(numbers, left, i-1);//, left);
quicksort(numbers, i+1, right);//, i+1);
} }
Задача ещё не решена.
Других решений пока нет …