我正在用keil uVision研究手臂装配,我想将快速排序代码(C代码)转换为ARM装配。 我尝试了整整几天,但效果不理想。因此,然后我尝试使用gcc arm cross编译器来查看它们如何转换代码。但是有些问题我无法理解。
这是我要转换的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 ...事物前面的dot(“。”)。 但仍然显示出语法错误。
(quicksort_linux.s(75):错误:A1586E:运算符LAND的操作数类型错误(UnDefOT,UnDefOT))
其中 bl quicksort(PLT)。我想解决这个问题,但是我不知道这意味着什么。
问题是
quicksort(PLT)是什么意思?
详细问题:似乎函数递归,但是在Wiki上
https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly
他们不使用“ b foo()”。可以在ARM汇编中使用这种样式的函数调用吗?什么是PLT?
为什么gcc编译的源代码和Keil uVision的代码风格不同?
细节:像L16和quicksort(plt)前面的点。
(https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly)
对比鲜明的链接快速排序代码在Keil uVision中效果很好。
如何修复gcc编译的代码以使其在Keil uVision中工作?