0

OK、ARM7アセンブリに選択ソートアルゴリズムを実装しようとしています。配列の最後の要素から始まり、最初の要素まで進みます。最初のスワップでは機能しますが、続行する前に終了します。私は教授と話をしましたが、彼はlrが上書きされないようにスタック変数を使用するように言っていましたが、それでもその方法を正確に理解していません。これを行う方法を探しましたが、コードに実装する方法を理解しているものが見つからないようです。

私のコードは次のとおりです:(a1は長さa2のchar配列へのポインターです。どちらもC経由で渡されます)

sort2:
    stmdb    sp!, {v1-v8, lr}          @ Copy registers to stack
    mov      v1, a2                    @store number of elements in v1,v2 (a2 is passed in via C)
    mov      v2, a2
    sub      v1, v1,#1                 @subtract 1 from a2 to get number last element in array
    sub      v2, v1,#1                 @subtract 1 from v1 to get element just below last element
    bl       loop2
    ldmia    sp!, {v1-v8, pc}

loop2:
    ldrb     v4, [a1,v1]               @store value of last element in array a1(passed in via C) into r4 
    ldrb     v5, [a1,v2]               @store value of next to last element in array a1(passed in via C) into r4 
    cmp      v4, v5
    blt      swap2                     @if last element is less than current element a[v2], swap them
    cmp      v2, #0                    @if v2 = 0, we cycled through one iteration
    subeq    v1, v1,#1                 @so now move on to a[v1-1] element in array                   
    moveq    v2, v1                    @if v2 = 0, move the value of v1 into v2
    sub      v2, v2,#1                 @subtract 1 from v2 to get element below a[v1]
    cmp      v1, #0                    @if v1 = 0, were done
    bne      loop2
    mov      pc, lr                    @return to sort2

swap2:
    mov      v8, lr                    @store return address in v8
    ldrb     v6, [a1,v2]               @store value of a[v2] into v6
    strb     v4, [a1,v2]               @store v4 into a[v2]
    strb     v6, [a1,v1]               @store value of v6 into a[v1]
    mov      lr, v8                    @falls through and exits here instead of returning to loop2
4

1 に答える 1

1

サブルーチンから戻る場所がすでにいくつかあります。

を入力するsort2と、いくつかのレジスタがスタックに保存されます。

stmdb    sp!, {v1-v8, lr}          @ Copy registers to stack

を終了するとsort2、スタックからいくつかのレジスタが復元されます。

ldmia    sp!, {v1-v8, pc}

を離れるときはloop2、次のようなことを行います。

mov      pc, lr                    @return to sort2

それをよく見てください。そこにあるパターンに気づきましたか?去るswap2ことは似たようなものを持つべきです。

現在、loop2別の関数を呼び出していると思われます: swap2. 他の関数の呼び出しをサポートするために、呼び出し関数はいくつかのレジスタを保存する必要sort2があります。リーフ関数 (他の関数を呼び出さない関数) は、呼び出し元保存レジスタを保存する必要はありません。また、 @ bltPeteFordham削除された回答が指摘しているように: bllt=未満で分岐およびリンクします。

于 2012-11-16T02:12:19.267 に答える