为什么gcc交叉编译的代码在Keil uVison中不起作用?如何在ARM汇编中进行函数递归?(快速排序)

时间:2018-12-02 13:00:08

标签: gcc assembly arm keil

我正在用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)。我想解决这个问题,但是我不知道这意味着什么。

问题是

  1. quicksort(PLT)是什么意思?
    详细问题:似乎函数递归,但是在Wiki上 https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly 他们不使用“ b foo()”。可以在ARM汇编中使用这种样式的函数调用吗?什么是PLT?

  2. 为什么gcc编译的源代码和Keil uVision的代码风格不同?
    细节:像L16和quicksort(plt)前面的点。 (https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly) 对比鲜明的链接快速排序代码在Keil uVision中效果很好。

  3. 如何修复gcc编译的代码以使其在Keil uVision中工作?

0 个答案:

没有答案