; div_shift.s
; dijeljenje 32 bitnih brojeva ostvareno posmakom
; R5 - dijeljenik
; R6 - dijelitelj
; R7 - rezultat

        AREA div_shift, CODE, READWRITE
        ENTRY

ADDR    EQU 0x8100      ; adresa podataka
        MOV R4, #ADDR
        LDR R5, [R4], #4        ; dijeljenik
        LDR R6, [R4], #4        ; dijelitelj
        MOV R7, #0              ; rezultat      
        MOV R8, #0              ; brojac pomaka
        CMP R6, R5              ; ako dijeljenik > dijelitelj
        BHI KRAJ                ; zavrsi

PORAVNAJ        ; poravnavanje dijelitelja sa dijeljenikom
        MOVS R3, R6, LSR #31    ; ukoliko MSB = 1
        BNE DIV                 ; ne treba poravnavati
        CMP R5, R6, LSL #1      ; je li dijeljenik > 2 * dijelitelj
        MOVHS R6, R6, LSL #1    ; ako je pomakni dijelitelj
        ADDHS R8, R8, #1        ; i uvecaj brojac pomaka
        BHI PORAVNAJ            ; ponavljaj dok je ispunjen gornji
                                ; uvjet

        ; dijeljenje
DIV
        CMP R5, R6              ; dijeli dok ostatak > dijelitelja
        SUBHS R5, R5, R6        ; oduzmi dijelitelj od ostatka
        ADDHS R7, R7, #1        ; inkrementiraj rezultat
        CMP R8, #0              ; ako je brojac pomaka > 0
        MOVHI R6, R6, LSR #1    ; pomakni dijelitelj u desno
        MOVHI R7, R7, LSL #1    ; a rezultat u lijevo
        SUBHI R8, R8, #1        ; umanji brojac pomaka
        BHI DIV                 ; i ukoliko brojac > 0 ponovi petlju

KRAJ
        STR R5, [R4], #4        ; ostatak
        STR R7, [R4]            ; kvocijent

        MOV R0, #0x18           ; angel_SWIreason_ReportException
        LDR R1, =0x20026        ; ADP_Stopped_ApplicationExit
        SWI 0x123456            ; semihosting SWI
        END