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
이코드 문제점이 뭘까?
전 기계어 쪽이라 잘 모르겠네요
전 소립자 딸딸이 공학이라 ... . 죄송해요 [핡]