题目:代码区有十个数字,存放在DATA1,现在需要将这个十个数从小到大排序并存放在数据区的DATA2中。
先直接上一个冗杂一点的代码,不过应该比较好理解。因为KEIL的注释复制过来会乱码,所以复制过来的时候把注释都删了。但是代码后面有截图,截图里有注释,基本每一步都注释过,绝对看得懂。
AREA RESET,CODE;
EXPORT __Vectors
EXPORT Reset_Handler
__Vectors
DCD __initial_sp
DCD Reset_Handler
Reset_Handler PROC
NOP
NOP
DATA1
DCD 10,-1,3,7,16,5,15,2,6,3;
ENTER
LDR R1 , =DATA1
LDR R2 , =DATA2
MOV R0 , #0
FILL_DATA2_WITH_DATA1
LDR R3 , [R1,R0]
STR R3 , [R2,R0]
ADD R0 , #4
CMP R0 , #36
BLE FILL_UNFINISH
BGT FILL_FINISH
FILL_UNFINISH
B FILL_DATA2_WITH_DATA1
FILL_FINISH
MOV R5 , #0
OUT_LOOP
MOV R4 , #0
ADD R5 , #1
MOV R9 , #10
CMP R5 , R9
BLE INNER_LOOP
BGT SORT_FINISH
INNER_LOOP
LDR R6 , [R2,R4]
ADD R4 , #4
MOV R10 , #36
CMP R4 , R10
BGT OUT_LOOP
LDR R7 , [R2,R4]
CMP R6 , R7
BLE LESS_THAN
BGT GREATER_THAN
LESS_THAN
B INNER_LOOP
GREATER_THAN
STR R6 , [R2,R4]
ADD R8 , R2 , R4
SUB R8 , R8 , #4
STR R7 , [R8]
B INNER_LOOP
SORT_FINISH
B .
ENDP
AREA STACK,DATA
DATA2
DCD 1,2,3,4,5,6,7,8,9,10
SPACE 0x100
__initial_sp
END
截图,包含注释:
这是Debug的截图
再给一个精炼的代码:
AREA RESET,CODE
EXPORT __Vectors
EXPORT Reset_Handler
__Vectors
DCD __initial_sp
DCD Reset_Handler
Reset_Handler PROC
NOP
NOP
DATA1
DCD 10,-1,3,7,16,5,15,2,6,3;
main
MOV R0,#0
MOV R7,#0
LDR R6,=DATA1
LDR R2,=DATA2
LOOP5
LDR R8,[R6,R7]
STR R8,[R2,R7]
ADD R7,#4
CMP R7,#40
BLT LOOP5
BGE LOOP1
LOOP1
ADD R1,R0,#4
B LOOP2
LOOP2
LDR R3,[R2,R0]
LDR R4,[R2,R1]
CMP R3,R4
BGT EXCHANGE
B LOOP3
EXCHANGE
STR R3,[R2,R1]
STR R4,[R2,R0]
B LOOP3
LOOP3
ADD R1,R1,#4
MOV R5,#40
CMP R1,R5
BLT LOOP2
BGE LOOP4
LOOP4
ADD R0,R0,#4
CMP R0,#36
BLT LOOP1
BGE STOP
STOP
B STOP
B main
B .
ENDP
AREA STACK,DATA
DATA2
DCD 0,0,0,0,0,0,0,0,0,0 ;
SPACE 0x100
__initial_sp
END