Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Bubble sort in ARM assembly
- r0 data vector
- r1 size of data
- r3 pointer
- r5 inner counter
- r6 outer counter
- r7 first element
- r8 second element
- r9 leds on
- r10 leds off
- r11 LEDs address
- */
- .section .data
- DataNum: .word 10
- SortData: .word 0x7FFFFFF1, 0x7FFFFFFF, 0x00000000, 0x80000000, 0x80000001, 0xA1234332, 0x20141020, 0x6FFFFFFF, 0xA1234320, 0x20141F20
- .text
- .equ LEDs, 0xFF200000
- .equ leds_on, 0xFFFFFFFF
- .equ leds_off, 0x00000000
- .equ element_size, 4 @ 4 byte words
- .global _start
- _start:
- loadData:
- ldr r0, =SortData @ start of vector
- ldr r9, =DataNum
- ldr r1, [r9] @ r1 holds DataNum value
- leds:
- ldr r9, =leds_on
- ldr r10, =leds_off
- ldr r11, =LEDs
- str r10, [r11] @ turn off leds
- bubble:
- ldr r5,=1 @ inner counter
- ldr r6,=1 @ outer counter
- mov r3, r0 @ initialize current pointer
- OuterLoop:
- cmp r6, r1
- beq EndOuterLoop
- InnerLoop:
- ldr r7, [r3], #element_size @ load one element
- ldr r8, [r3] @ load next one
- cmp r7, r8 @ compare them
- bge Swap @ branch if the first one is greater
- sub r3, r3, #element_size @ reset pointer to the first element
- b CheckInnerLoopDone
- Swap:
- swp r8, r8, [r3] @ swap value in r8 with address in r4
- str r8, [r3, #element_size]! @ store new second element to incremented address
- CheckInnerLoopDone:
- add r5, r5, #1 @ increment inner counter
- cmp r5, r1 @ check index variable
- bne InnerLoop
- EndInnerLoop:
- cmp r6, r1 @ check index variable
- beq EndOuterLoop
- ldr r5,=1 @ reset inner counter
- mov r3, r0 @ reset pointer
- add r6, r6, #1 @ increment outer counter
- b OuterLoop @ start another iteration
- EndOuterLoop: str r9, [r11] @ turn on leds
- STOP: B STOP /*Branch unconditionally to STOP*/
- .end
Add Comment
Please, Sign In to add comment