Почему кросс-скомпилированный код gcc не работает в Keil uVison?Как сделать рекурсию функции в сборке ARM? (Быстрая сортировка) - PullRequest
0 голосов
/ 02 декабря 2018

Я изучаю сборку руки с помощью keil uVision и хочу преобразовать код быстрой сортировки (код C) в сборку ARM.Я пробовал несколько полных дней, но это не удавалось.Итак, я попробовал кросс-компилятор gcc arm, чтобы увидеть, как они конвертируют коды.Но есть некоторые проблемы, которые я не могу понять.

Это код C, который я хочу преобразовать.

void quicksort(int array[8],int first,int last)
{
int i, j, pivot, temp;

if(first < last)//outer_if
{
    pivot = first;
    i = first;
    j = last;

    while(i < j)//outer_while
    {
        while(array[i] <= array[pivot] && i < last)//inner_while_1
        {
            i++;
        }
        while(array[j] > array[pivot])//inner_while_2
        {
            j++;
        }
        if(i < j)//inner_if
        {
            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }

    //
    temp = array[pivot];
    array[pivot] = array[j];
    array[j] = temp;
    quicksort(array, first, j-1);
    quicksort(array, j+1, last);
}
}

И это код, который я получил от компилятора gcc.

quicksort:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
cmp r1, r2
blt .L16
bx  lr
.L16:
push    {r4, r5, r6, r7, r8, r9, r10, lr}
mov r10, r1
add ip, r0, r1, lsl #2
mov r5, r2
mov r4, r1
.L3:
lsls    r3, r4, #2
add lr, r0, r3
ldr r7, [r0, r4, lsl #2]
ldr r6, [ip]
cmp r2, r4
ite le
movle   r8, #0
movgt   r8, #1
cmp r7, r6
it  gt
movgt   r8, #0
adds    r3, r3, #4
add r3, r3, r0
cmp r8, #0
beq .L9
.L4:
adds    r4, r4, #1
mov lr, r3
ldr r7, [r3], #4
cmp r2, r4
ite le
movle   r1, #0
movgt   r1, #1
cmp r7, r6
it  gt
movgt   r1, #0
cmp r1, #0
bne .L4
.L9:
lsls    r3, r5, #2
add r9, r0, r3
ldr r1, [r0, r5, lsl #2]
cmp r1, r6
ble .L5
adds    r3, r3, #4
add r3, r3, r0
.L6:
adds    r5, r5, #1
mov r9, r3
ldr r1, [r3], #4
cmp r1, r6
bgt .L6
.L5:
cmp r4, r5
bge .L7
str r1, [lr]
str r7, [r9]
b   .L3
.L7:
mov r7, r2
mov r1, r10
mov r4, r0
ldr r3, [r0, r5, lsl #2]
str r3, [r0, r10, lsl #2]
str r6, [r0, r5, lsl #2]
subs    r2, r5, #1
bl  quicksort(PLT)
mov r2, r7
adds    r1, r5, #1
mov r0, r4
bl  quicksort(PLT)
pop {r4, r5, r6, r7, r8, r9, r10, pc}

И я скопировал и вставил этот код в программу Keil uVision.Чтобы увидеть, как это работает.Но это показало мне несколько грамматических ошибок.Поэтому я стер точку (".") Перед каждым L16, L3 ... вещами.но все равно он показывает мне грамматические ошибки.

(quicksort_linux.s (75): ошибка: A1586E: Неверные типы операндов (UnDefOT, UnDefOT) для оператора LAND)

, которые находятся на bl quicksort (PLT).Я хочу это исправить, но я не знаю, что это значит.

Итак, вопрос

  1. Что означает быстрая сортировка (PLT)?
    подробный вопрос:похоже на рекурсию функции, но в вики https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly они не используют "b foo ()".Можно ли использовать этот стиль вызова функции в сборке ARM?А что такое PLT?

  2. Почему скомпилированный исходный код gcc и Keil uVision имеют другой стиль кода?
    деталь: как точки перед L16 и быстрая сортировка (plt).(https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly) Контрастный код быстрой сортировки по ссылке хорошо работает в Keil uVision.

  3. Как исправить скомпилированный код gcc, чтобы он работал в Keil uVision?

...