; program za mnozenje posmakom
 ; R1 - 32 bitni multiplikand
 ; R2 - 32 bitni multiplikator
 ; R3 - nizih 32 bita rezultata
 ; R4 - visih 32 bita rezultata

        AREA mult_shift, CODE, READONLY

        ENTRY

main
        ADR R0, MULTS           ; R0 -> MULTS
        LDR R1, [R0], #4        ; R1 = multiplikand
        LDR R2, [R0], #4        ; R2 = multiplikator

        MOV R3, #0
        MOV R4, #0
        MOV R5, #0      ; multiplikand je sa R5 prosiren na 64 bita
multloop
        MOVS R2, R2, LSR #1     ; izdvoji u C LSB od multiplikatora
        BCC dalje
        ADDCSS R3, R3, R1       ; zbrajanje u rezultat (nizih 32 bita)
        ADC R4, R4, R5          ; zbrajanje (visih 32 bita)
dalje
        MOVS R1, R1, LSL #1 ; pomak ulijevo multiplikanda 
        MOV R5, R5, LSL #1      ; koji je sa R5 prosiren na 64 bita
        ADC R5, R5, #0          ; ono sto izlazi iz R1 ulazi u LSB od R5
        CMP R2, #0                      ; ako je multiplikator = 0
        BNE multloop            ; izadji iz petlje 

kraj
        STR R3, [R0], #4        ; rezultat nizih 32 bita
        STR R4, [R0]            ; rezultat visih 32 bita

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

MULTS DCD 0x12356ABC, 0x3423BCA, 0x0, 0x0

        END