【问题标题】:Quick sort using ARM assembly - segmentation error使用 ARM 程序集进行快速排序 - 分段错误
【发布时间】:2020-05-05 17:20:58
【问题描述】:

我正在尝试使用 ARM 程序集 (Raspberry pi) 制作快速排序功能,

但它显示了分段错误。

我认为递归过程在存储或加载堆栈时会产生该错误。

你能告诉我如何解决它吗? 我在https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly 中使用了 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;

}

【问题讨论】:

    标签: c assembly arm


    【解决方案1】:

    内联 asm 永远无法到达 asm 模板的末尾。大概您正试图从 C 函数中返回,而不仅仅是内部递归调用。这显然是不安全的,因为堆栈布局或 LR 内容的保证为零,并且无论是否优化都会改变。

    不要在 C 函数的中间写一个完整的递归。

    使用调试器单步执行生成的程序,并查看您的代码在哪里破坏了编译器生成的围绕它的 asm。


    您的内联 asm 也已损坏:您取消引用 arr 而不将其指定为内存读/写输入或 "memory" clobber。指针输入确实暗示指向的内存也是一个操作数。

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多