C 使用ARM组件快速排序-分段错误

C 使用ARM组件快速排序-分段错误,c,assembly,arm,C,Assembly,Arm,我正在尝试使用ARM assembly(Raspberry pi)实现快速排序功能 但它显示了分割错误 我认为递归过程会在使用堆栈存储或加载时出错 你能告诉我怎么修吗? 我在中使用了ARM汇编代码 这里, 我只是打了一模一样的。只需更改寄存器,如'r3'->'r2','r2'->'r1','r1'->'r0' #include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 32 i

我正在尝试使用ARM assembly(Raspberry pi)实现快速排序功能

但它显示了分割错误

我认为递归过程会在使用堆栈存储或加载时出错

你能告诉我怎么修吗? 我在中使用了ARM汇编代码 这里,

我只是打了一模一样的。只需更改寄存器,如'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;
#包括
#包括
#包括
#定义大小32
int main()
{
int arr[尺寸];
int max,min;
int i;
对于(i=0;i

}

内联asm永远无法到达asm模板的末尾。可能您正在尝试从C函数返回,而不仅仅是内部递归调用。这显然是不安全的,因为对堆栈布局或LR的内容没有任何保证,而这将随优化/不优化而改变

<强>不要在C函数的中间写一个整递归。< /强>

使用调试器单步执行生成的程序,并查看代码在何处中断编译器生成的围绕它的asm


此外,您的内联asm也已中断:您取消引用
arr
,但未将其指定为内存读/写输入或
内存“
缓冲。指针输入并不意味着指向内存的指针也是操作数