Reverse ArrayΒΆ

Reverses an array in place.

 1; Reverse: reverse array [10, 20, 30, 40, 50, 60]
 2; Output: RAM[0x60..0x65] = [60, 50, 40, 30, 20, 10]
 3
 4start:
 5    ; store array at RAM[0x60..0x65]
 6    ldi r20, 0x60
 7    ldi r21, 10
 8    st r20, r21
 9    
10    ldi r20, 0x61
11    ldi r21, 20
12    st r20, r21
13    
14    ldi r20, 0x62
15    ldi r21, 30
16    st r20, r21
17    
18    ldi r20, 0x63
19    ldi r21, 40
20    st r20, r21
21    
22    ldi r20, 0x64
23    ldi r21, 50
24    st r20, r21
25    
26    ldi r20, 0x65
27    ldi r21, 60
28    st r20, r21
29    
30    ; reverse: swap from both ends
31    ldi r16, 0x60     ; left = 0x60
32    ldi r17, 0x65     ; right = 0x65
33
34reverse_loop:
35    ; check if left >= right
36    cp r16, r17
37    brge done
38    
39    ; swap RAM[left] and RAM[right]
40    ld r18, r16       ; temp = RAM[left]
41    ld r19, r17       ; RAM[left] = RAM[right]
42    st r16, r19
43    st r17, r18       ; RAM[right] = temp
44    
45    ; move pointers
46    inc r16           ; left++
47    dec r17           ; right--
48    
49    jmp reverse_loop
50
51done:
52    jmp done

Demonstrates two-pointer technique and array manipulation.