Created
July 31, 2013 03:00
-
-
Save dtak1114/6118969 to your computer and use it in GitHub Desktop.
Revisions
-
dtak1114 revised this gist
Jul 31, 2013 . 1 changed file with 0 additions and 1 deletion.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,4 +1,3 @@ @ homework2.s @ r0 : 所与の配列領域 @ r1 : 結果を格納するための配列領域 -
dtak1114 created this gist
Jul 31, 2013 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,41 @@ .text .global _start .code 16 .syntax unified .type _start, function _start: @ clear registers mov r0, #0 mov r1, #0 mov r2, #0 mov r3, #0 mov r4, #0 mov r5, #0 mov r6, #0 mov r7, #0 mov r8, #0 @ set args ldr r0, =Data1 ldr r1, =Dest add r2, #16 @結局使わなかったけど、配列の要素数を表すためのオフセット bl main @ jump to main function _deadloop: b _deadloop .section .rodata @ rodata section Data1: @配列に格納する値 = { 4,8,5,2,6 } .word 4 .word 8 .word 5 .word 2 .word 6 .word 0 .align .data @ data section Dest: .space 0x100 @ preserve 0x100 bytes .end This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,108 @@ @ homework2.s @ r0 : 所与の配列領域 @ r1 : 結果を格納するための配列領域 @ r3 : ピボット値 @ r4 : l pointer @ r5 : r pointer @ r6 : left most 配列の最も左のポインタ @ r7 : right most 配列の最も右のポインタ @ r8 : general purpose 汎用レジスタ @ r10: freezing point 再帰処理脱出用のスタックポインタ値 @ .text .global main .code 16 .syntax unified .type main, function main: push {r0, r1, lr} mov r10,sp @この時点でのSP値をr10に格納しておく push {r0, r1} copy: @r0上では書き換えが出来ないので、配列をr1へいったん全部コピー。r3はダミー ldr r3, [r0] cbz r3, init str r3, [r1] add r0, #4 add r1, #4 b copy init: @始めて関数を呼び出す時の条件を整備 pop {r0, r1} mov r6, r1 @r6:left most = r1の0番目 add r7, r1, #16 @r7:right most=r1の4番目 b recursion @再帰処理の呼び出し(なくてもいいけど明示しとく。) recursion: ldr r3,[r6] @pivot <- [left] :pivot値の決定 mov r4,r6 @l <- left :l を配列の最も左の値に mov r5,r7 @r <- right :r を配列の最も右の値に b search_left search_left: @配列の左から、ピボット以上の値を探し出す cmp r4,r7 @ l <=> right bge search_right @next ldr r8,[r4] @ r8 <- [l] cmp r8,r3 @ [l] <=> [p] bge search_right @ exitloop if [l] > [p] add r4, #4 @ loop l++ b search_left search_right: @配列の右から、ピボット以上の値を探し出す cmp r6,r5 @left <=> r bge mainloop @exit ldr r8,[r5] @ r8 <- [r] cmp r8,r3 @ [r] <=> [r3] ble mainloop @exit loop if [r] < [p] sub r5, #4 @loop r-- b search_right @ mainloop: @上記で見つかった点swap、パーティショニング完了したら再帰呼び出し。 cmp r4, r5 @ cmp l,r bge l_rec_call @ if[l]>=[r] exit loop ldr r8,[r4] ldr r9,[r5] @swap [r4] <-> [r5] str r8,[r5] str r9,[r4] add r4, #4 @l++ sub r5, #4 @r-- b search_left @loop l_rec_call: @左側の部分配列に対して再帰呼び出し @ r6(leftmost:need) : left @ r7(rightmost:need): l-1 mov r8,#0 sub r8, r4, #4 @ r8 = l-1 cmp r6, r8 @ left <=> l-1 bge r_rec_call @if left >= l-1 : cond unfulfill. go next push {r5,r7,lr} mov r7, r8 @else: call recursively and come back bl recursion pop {r5,r7,lr} r_rec_call: @右側の部分配列に対して再帰呼び出し @ r6(leftmost:need) : r+1 @ r7(rightmost:need): right mov r8, #0 add r8, r5, #4 @r8 : r+1 cmp r6, r7 @r+1 <=> right bge finish @else finish mov r6,r8 push {lr} bl recursion pop {lr} finish: @終わり処理 cmp sp,r10 beq exit mov pc,lr exit: pop {r0, r1, pc} .end