Я изучаю сборку руки с помощью 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).Я хочу это исправить, но я не знаю, что это значит.
Итак, вопрос
Что означает быстрая сортировка (PLT)?
подробный вопрос:похоже на рекурсию функции, но в вики https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly они не используют "b foo ()".Можно ли использовать этот стиль вызова функции в сборке ARM?А что такое PLT?
Почему скомпилированный исходный код gcc и Keil uVision имеют другой стиль кода?
деталь: как точки перед L16 и быстрая сортировка (plt).(https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly) Контрастный код быстрой сортировки по ссылке хорошо работает в Keil uVision.
Как исправить скомпилированный код gcc, чтобы он работал в Keil uVision?