Быстрая сортировка с использованием сборки ARM - ошибка сегментации - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь создать функцию быстрой сортировки, используя сборку ARM (Raspberry pi),

, но она показывает мне ошибку сегментации.

Я думаю, что процесс рекурсии делает эту ошибку при сохранении или загрузка стеками.

Подскажите, как исправить? Я использовал код сборки ARM в https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly здесь,

Я просто набрал его так же. Просто меняя регистры, такие как 'r3' -> 'r2', 'r2' -> 'r1', 'r1' -> 'r0' ...

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 32

int main()
{
int arr[SIZE];
int max, min;
int i;

for (i = 0; i < SIZE; i++) {
    arr[i] = rand() % 100;
}

asm(
    "mov r0, #0\n\t"
    "mov r1, #128\n\t"
    "Loop3:\n\t"
    "stmfd sp!, {r3, r5, lr}\n\t"
    "mov r5, r1\n\t"

    "Loop4:\n\t"
    "sub r6, r5, r0\n\t"
    "cmp r6, #4\n\t"
    "ldmlefd sp!, {r3, r5, pc}\n\t"
    "ldr r6, [%[arr],r0]\n\t"
    "add r1, r0, #4\n\t"
    "mov r3, r5\n\t"

    "Loop5:\n\t"
    "ldr r2, [%[arr],r1]\n\t"
    "cmp r2, r6\n\t"
    "addle r1, r1, #4\n\t"
    "ble Loop6\n\t"
    "sub r3, r3, #4\n\t"
    "ldr r4, [%[arr],r3]\n\t"
    "str r4, [%[arr],r1]\n\t"
    "str r2, [%[arr],r3]\n\t"

    "Loop6:\n\t"
    "cmp r1, r3\n\t"
    "blt Loop5\n\t"

    "Loop7:\n\t"
    "sub r1, r1, #4\n\t"
    "ldr r2, [%[arr],r1]\n\t"
    "str r2, [%[arr],r0]\n\t"
    "str r6, [%[arr],r1]\n\t"
    "bl Loop3\n\t"
    "mov r0, r3\n\t"
    "b Loop4\n\t"

    :
:
    [arr] "r"(arr)
    :
    "r0", "r1", "r2", "r3", "r4", "r5", "r6"
    );
return 0;

}

1 Ответ

1 голос
/ 05 мая 2020

Встроенный asm никогда не может достичь конца шаблона asm. Предположительно, вы пытаетесь вернуться из функции C, а не только из внутренних рекурсивных вызовов. Это явно небезопасно, потому что нет никакой гарантии относительно макета стека или содержимого LR, и это будет меняться с / без оптимизации. .

Используйте отладчик для пошагового выполнения результирующей программы и посмотрите, где ваш код нарушает сгенерированный компилятором asm, который его окружает.


Также ваш встроенный asm сломан : вы разыменовываете arr, не указывая его как ввод для чтения / записи в память или "memory" clobber. Ввод указателя не подразумевает, что указанная память также является операндом.

...