; 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