;***************************************
;*  Glavni program za sazimanje bloka  *
;***************************************
        `ORG    0
        MOV     R13, #5<12      ;0x5000 - stog
        MOV     R0, #2<12       ;0x2000 - pocetak bloka
        MOV     R1, #5<8        ;0x500 - rezultantni niz
        MOV     R2, #%D 40      ;40 poziva potprograma

LOOP    BL      SAZMI           ;pozovi potprogram
        ADD     R0, R0, #%D 100 ;pomakni izvorni niz za 100 bajtova
        ADD     R1, R1, #%D 28  ;pomakni odredisni niz za 28 bajtova
        SUBs    R2, R2, #1      ;smanji brojac
        Bne     LOOP

        HALT


;****************************************
;* Potprogram za sazimanje niza brojeva *
;****************************************
        `ORG    100
SAZMI   STMfd   R13!, {R0, R1, R2, R3, R4}      ;push

        LDR     R2, [R0], #4    ;ucitaj prvi podatak (bazni)
        STR     R2, [R1], #4    ; i pohrani ga u ciljni niz

        MOV     R4, #%D 24      ;brojac preostalih podataka

AGAIN   LDR     R3, [R0], #4    ;ucitaj podatak
        SUB     R3, R3, R2      ;nadi razliku izmedu podatka i baze
        STRb    R3, [R1], #1    ;spremi razliku

        SUBs    R4, R4, #1      ;R4--
        Bne     AGAIN

        LDMfd   R13!, {R0, R1, R2, R3, R4}      ;pop
        MOV     PC, LR          ;ret

        `ORG    2000
        DW      50, 52, 5A, 52, 48, 3C, 30, 21, 20, 25, 2F, 34, 40, 43, 4A
        DW      50, 52, 5D, 63, 70, 8E, 0A0, 0B0, 0B5, 0A0, 65, 0E2, 78
        `END