; 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