アセンブラでクイックソート

職業訓練の中でアセンブラのプログラミングをやった。課題で作ったプログラムをさらす。
プログラムの内容はアルゴリズムの定番、ソートのプログラム。
バブルソートと選択ソート、クイックソートの3パターンを作成し、今回のはクイックソート


プロセッサはルネサステクノロジ社の SH-3 を使った。


クイックソートは自分自身を再帰呼出しをする。
そのときに、元の引数をメモリに退避し、帰ってきたときに復帰させる必要がある。
その退避と復帰のタイミングで結構悩んだ。

;******************************************************************
;	課題3:並び替えプログラム1      FILE NAME:Kadai3.src
;	H'8C00-1200番地に、39,62,55,24,76,17,43,97,6,83の数字がセットしてある。
;	この数字郡を小さい順に並び換えるプログラムを考えなさい。
;	
;******************************************************************
STACK_SIZE	.EQU	H'400

        .export _MAIN,_STACK_BOTTOM
;
       .section MAIN,CODE,ALIGN=4		
_MAIN: ;プログラムを考えなさい。

    MOVA   DATA, R0
    
    MOV    R0, R1
    MOV    R0, R2
    ADD    #(10 * 4), R2

    BSR    QSORT
    NOP

    BRA PEND
    NOP


;;**************************************************
;; quick sort
;;       R0 = pivot = mem[left + right / 2]; save PR
;;   arg.R1 = left
;;   arg.R2 = right
;;       R3 = i (init: left ), R13 = mem[i]
;;       R4 = j (init: right), R14 = mem[j]
;;       R5 = temporary
;; URL: http://www1.cts.ne.jp/~clab/hsample/Sort/Sort9.html
;;**************************************************
QSORT:
 
    MOV.L  R1 , @-R15
    MOV.L  R2 , @-R15
    STS    PR , R0
    MOV.L  R0 , @-R15
        
    MOV    R1, R3
    MOV    R2, R4

    MOV    R4, R0
    SUB    R3, R0
    SHLR   R0
    ADD    R3, R0
    MOV  #H'FC, R10
    AND   R10, R0
    MOV   @R0, R0

LOOP_A:
    LOOP_1:
        MOV   @R3, R13
        CMP/GT R13, R0
        BF LOOP_1_BREAK
        NOP

        ADD   #04, R3
        BRA LOOP_1
        NOP
    LOOP_1_BREAK:

    LOOP_2:
        MOV   @R4, R14
        CMP/GT R0, R14
        BF LOOP_2_BREAK
        NOP

        ADD   #-4, R4
        BRA LOOP_2
        NOP
    LOOP_2_BREAK:

        CMP/HS R4, R3
        BT LOOP_A_BREAK
        NOP

        MOV    R14, @R3
        MOV    R13, @R4

        ADD   #+4, R3
        ADD   #-4, R4

        BRA LOOP_A
        NOP
LOOP_A_BREAK:

    MOV    R3, R5
    ADD   #-4, R5

    ;; left(R1) < i-1(R5) = i-1(R5) > left(R1)
    CMP/HI R1, R5
    BF  SKIP_1
    NOP

    ;; BT
    MOV.L   R2  , @-R15
    MOV R5, R2
    BSR QSORT
    NOP
    MOV.L  @R15+,   R2        

SKIP_1:
    MOV R4, R5
    ADD #4, R5

    ;; j+1(R5) < right(R2) = right(R2) > j+1(R5)
    CMP/HI R5, R2
    BF SKIP_2
    NOP

    ;; BT
    MOV.L   R1  , @-R15
    MOV R5, R1
    BSR QSORT
    NOP
    MOV.L  @R15+,   R1

SKIP_2:

RETURN:
        
    MOV.L  @R15+, R0
    LDS    R0, PR
    MOV.L  @R15+, R2
    MOV.L  @R15+, R1
        
    RTS
    NOP

PEND:
	
;
LOOP:	BRA	LOOP
	NOP


	.ALIGN	4
STACK_BOTTOM_A:
	.DATA.L	_STACK_BOTTOM
	;
	.ORG	H'200
        
;並び替えられるデータ
DATA:	.DATA.L 39,62,55,24,76,17,43,97,6,83

;***********************************************************

;		STACK	AREA

;***********************************************************

	.SECTION STACK,STACK,ALIGN=4		
	.RES.B	STACK_SIZE
_STACK_BOTTOM:

 	.END