Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 汇编中的递归插入排序_C_Assembly_Armv8 - Fatal编程技术网

C 汇编中的递归插入排序

C 汇编中的递归插入排序,c,assembly,armv8,C,Assembly,Armv8,我正在尝试在汇编ARMV-8A中实现插入排序。更具体地说,我尝试用C语言翻译以下代码: void insertionSortRecursive(int arr[], int n) {         if (n <= 1)         return;       insertionSortRecursive( arr, n-1 );     int last = arr[n-1];     int j = n-2;       while (j >= 0 &&

我正在尝试在汇编ARMV-8A中实现插入排序。更具体地说,我尝试用C语言翻译以下代码:

  void insertionSortRecursive(int arr[], int n)
{
   
    if (n <= 1)
        return;
 
    insertionSortRecursive( arr, n-1 );
    int last = arr[n-1];
    int j = n-2;
 
    while (j >= 0 && arr[j] > last)
    {
        arr[j+1] = arr[j];
        j--;
    }
    arr[j+1] = last;
}
 

我做了一些修改,比如在insertion_循环函数中加载和存储n-2的值,但这没有做任何更改

您需要更好地注释您的代码,特别是如果您希望其他人帮助的话

我猜您不是将
j
保存在
w12
中,而是使用它进行计算,然后尝试恢复原始值,但失败了。既然你已经做了
addw12,w12,w19
来得到
arr[j+1]
,那么
udiv w12,w12,w19
之后的
w12
值将是
j+1
当你从中减去一个值时,你又会得到
j
,因此无限循环。您有很多寄存器,只需为
j+1
使用不同的寄存器即可


您应该能够在调试器中看到这一点。

“好的,但为什么?”递归插入排序?那太可怕了。即使使用
-O3
,gcc6.3也无法将递归优化为迭代循环:。不过,我想这和递归斐波那契一样疯狂。
.data
my_Table:       .space 16
size:           .word  4
FileOpenMode:   .string "r"
FileName:       .string "test1.txt"
fscanf_str:     .string "%d"
printf_str:     .string "%d "
out_message_str: .string "%d "


.text
.global main

main:

        stp     x29,x30,[sp,-32]!
        add     x29,sp,0

        adr     x1,FileOpenMode
        adr     x0,FileName
        bl      fopen

        mov     x20,x0

        adr     x0,my_Table
        mov     x22,x0          //x22 adr of table
        mov     x21,4
        mov     x23,0
//**************** READ FROM FILE ******************
loop:
        add     x2,x29,28
        adr     x1,fscanf_str

        mov     x0,x20
        bl      fscanf

        ldr     w1,[x29,28]
        mov     x0,x22
        str     w1,[x0,x23]
        add     x23,x23,4

        add     w21,w21,-1
        cbnz    w21,loop
//********************************************

        mov     x0,x22 //adr of table
        mov     x1,4
        bl      insertion_sort

//**************** PRINT TO SCREEN FROM TABLE *****************
        mov     x21,0
        mov     x23,4

loop_print:
        adr     x0, out_message_str
        ldr     w1,[x22,x21]
        bl      printf
        add     x21,x21,4
        sub     x23,x23,1
        cbnz    x23,loop_print

//***********************************************************

        ldp     x29, x30, [sp], 32
        ret

insertion_sort:
        stp     x29,x30,[sp,-64]!
        add     x29,sp,0

        str     x19,[x29,32]    //str the save register
        str     x0,[x29,16]     //str the address of table
        str     w1,[x29,24]     //str the n

        mov     x19,4

        cmp     w1,1
        b.le    exit_ins

        sub     w1,w1,1

        bl      insertion_sort

        ldr     w9,[x29,24]     //load the n for the suitable function
        sub     w9,w9,1         //n-1
        mul     w9,w9,w19
        ldr     x10,[x29,16]    //adr table
        ldr     w11,[x10,x9]    //last
        udiv    w9,w9,w19
        sub     w12,w9,1        //j=n-2

loop_insertion:
        ldr     w12,[x29,24]
        cmp     w12,0
        b.lt    label1
        mul     w12,w12,w19
        ldr     w13,[x10,x12] // w13=arr[j]
        cmp     w13,w11
        b.le    label1
        add     w12,w12,w19
        str     w13,[x10,x12] //arr[j+1]=w13
        udiv    w12,w12,w19
        sub     w12,w12,1
        str     w12,[x29,24]
        b       loop_insertion

label1:
        add     w12,w12,1
        mul     w12,w12,w19
        str     w11,[x10,x12]

exit_ins:
        ldr     x19,[x29,32]    //ldr the value of x19 back to the x19
        ldp     x29, x30, [sp], 64
        ret