AREA        Sort, CODE, READONLY
SWI_WriteC EQU &0
SWI_Exit EQU &11
        ENTRY
arr        DCD        0x00000003, 0x00000005, 0x00000009, 0x00000001, 0x00000007, 0x00000000, 0x00000008, 0x00000006, 0x00000004, 0x00000002
num        DCD        0x0000000a
        ADR r0, arr
        ADR r1, num
        LDR r1, [r1, #0]
        BL print
        ADR r0, arr
        ADR r1, num
        LDR r1, [r1, #0]
        BL sort
        ADR r0, arr
        ADR r1, num
        LDR r1, [r1, #0]
        BL print
        SWI SWI_Exit

a        RN        0        ; 1st argument address of a
i        RN        1        ; 2nd argument index i(iPos)
j        RN        2        ; 3rd argument index j(iMin)
temp        RN        3        ; temporary variable of a[i]
temp2        RN        12        ; temporary variable of a[j]
swap         LDR        temp, [a, i, LSL#2]                ; temp = a[i]
        LDR        temp2, [a, j, LSL#2]                ; temp2 = a[j]
        STR        temp2, [a, i, LSL#2]                ; a[i] = temp2
        STR        temp, [a, j, LSL#2]                ; a[j] = temp
        MOV        r3, r8        ; restore iPos for the caller
        MOV        pc, lr                                

a        RN        0   ; 1st argument address of a
n        RN        1   ; 2nd argument index n
iMin        RN        2   ; local variable iMin 
iPos        RN        3   ; local variable iPos
iso        RN        12  ; local variable i
acopy        RN        4   ; to hold a copy of v
ncopy        RN        5   ; to hold a copy of n
aiso        RN        6   ; local variable of a[i]
aiMin        RN        7   ; local variable of a[iMin]
sort        SUB sp, sp, #20                        ; make room on stack for 5 registers
        STR lr, [sp, #16]                ; save lr on stack
        STR aiMin, [sp, #12]                ; save aiMin on stack
        STR aiso, [sp, #8]                ; save aiso on stack
        STR ncopy, [sp, #4]                ; save ncopy on stack
        STR acopy, [sp, #0]                ; save acopy on stack
        MOV acopy, a                        ; acopy = (address)a
        MOV ncopy, n                        ; ncopy = n
        MOV iPos, #0                        ; iPos = 0
for1tst        CMP iPos, ncopy                        
        BGE exit1                         
        MOV iMin, iPos
        ADD iso, iPos, #1
for2tst        CMP iso, ncopy
        BGE exit2
        LDR aiso, [acopy, iso, LSL#2]        ; aiso = a[iso]
        LDR aiMin, [acopy, iMin, LSL#2]        ; aiMin = a[iMin]
        ;ADD iso, iso, #1                ; iso += 1
        ;CMP aiso, aiMin                        ; if
        ;BGE for2tst        
        ;SUB iMin,iso,#1                        ; iMin = iso - 1 (becuase of 59th line, i++)
        CMP aiso, aiMin                        ; if
        MOVLT iMin,iso                        ; iMin = iso
        ADD iso, iso, #1                ; iso += 1
        B for2tst
exit2        CMP iMin, iPos
        MOVNE r1, iPos
        MOVNE r8, iPos
        BLNE swap
        ADD iPos, iPos, #1
        B for1tst
exit1        LDR acopy, [sp, #0]                ; restore acopy from stack
        LDR ncopy, [sp, #4]                ; restore ncopy from stack
        LDR aiso, [sp, #8]                ; restore aiso from stack
        LDR aiMin, [sp, #12]                ; restore aiMin from stack
        LDR lr, [sp, #16]                ; restore lr from stack
        ADD sp, sp, #20                        ; restore stack pointer
        MOV pc, lr

print        MOV r2, r0
        MOV r3, #0
loop        CMP r3, r1
        BGE exit
        LDR r0, [r2, r3, LSL #2]
        ADD r0, r0, #"0"                ; convert the value in r0 into the ascii code
        SWI SWI_WriteC
        ADD r3, r3, #1
        B loop
exit        MOV r0, #10                        ; print the newline character
        SWI SWI_WriteC        
        MOV pc, lr
        END


이코드 문제점이 뭘까?