Не удается найти ошибку сегментации в коде сортировки вставки для сборки arm-v8 - PullRequest
0 голосов
/ 03 июня 2019

Я сгенерировал массив случайных целых чисел от 0 до 256, и я попытался отсортировать их, используя сортировку вставкой, однако в какой-то момент я испортил строку и получил ошибку "Ошибка сегментации (сброшено ядро)

Я не знаю точно, почему я получаю это, но я думаю, что проблема как-то связана с макросом j, представляющим счетчик циклов. Я работал над этим несколько часов, и я застрял на этомwhile.

EDIT: после использования отладчика я выделил проблему в виде строки:

bl printf

прямо в самом конце, когда он пытается напечатать второйотсортированное значение.

Я попытался выделить больше оперативной памяти до 416 байт, я попытался переместить метку цикла top2 (это цикл, который использует j в качестве счетчика), и самое дальнее, что я получил, предназначено дляпрограмма для печати первого элемента отсортированного массива и выдачи затем ошибки

ALLOC   =-(16+400*1)&-16
        .equ    DEALLOC, -ALLOC
size    = 50
define(arraybase, x19)
i       .req    x20
define(j, x21)
define(temp, w22)
define(sort1, w23)

print1: .asciz "Array[%d]: %d\n"
print2: .string "\nSorted Array: \n"
print3: .asciz "top value equals %d \n"

...

        mov     i, 0

top1:   add     i, i, 1
        ldrb    temp, [arraybase, i ]

        mov     j, i
top2:   mov     x25, j
        sub     x25, x25, 1

        ldrb    sort1, [arraybase, x25 ]
        cmp     temp, sort1
        b.ge    skip1
        strb    sort1, [arraybase, j]
skip1:  sub     j, j, 1

        cmp     j, 0
        b.gt    top2

        strb    temp, [arraybase, j]
        cmp     i, size-1
        b.lt    top1

printing:

        ldr     x0, =print2
        bl      printf

        mov     i, 0
        ldr     x0, =print1

tprint: mov     x1, i
        ldrb    w2, [arraybase, i]
        bl      printf
        add     i, i, 1
        cmp     i, size-1
        b.le    tprint


        mov     x0, 0
        ldp     x29, x30, [sp], DEALLOC
        ret

Массив должен быть напечатанв случайном порядке, в котором он был инициализирован, затем он должен напечатать значение в верхней части массива, затем он должен распечатать отсортированный массив в порядке возрастания.

Точное сообщение об ошибке, которое я получил, было:

Ошибка сегментации (ядро сброшено)

Появляется после того, как печатается первое значение отсортированного массива

...