.syntax unified .cpu cortex-m4 .thumb .macro BKPT_WRITE addr_src mov r1, \addr_src mov r0, 0x4 bkpt 0xAB .endm #define A 0x0321 #define B 0x7005 #define C 0x0050 .section .text lab1_v2: push.n {lr} bl calculate_formula_v2 bl int_to_str pop.n {pc} calculate_formula_v2: ldr r0, =A ldr r1, =B ldr r2, =C cmp r0, r1 bgt gret blt less same: @ default add r2, r0, r2, lsr #3 add r0, r2, r1 b finish gret: rsb r0, r0, #192 sub r0, r0, r1 add r0, r2, r0, lsl #2 b finish less: orr r1, r1, r2 mul r0, r0, r1 finish: mov r10, r0 mov pc, lr int_to_str: mov r3, sp @ write newline + NULL terminator mov r5, #0x000A strh r5, [r3, #-2]! @ --- handmade modulo --- mov r4, #10 iterate: mov r1, r0 @ save orig to r1 udiv r0, r0, r4 @ orig/10 and overwrite old orig value mul r2, r0, r4 @ orig/10*10, place separately subs r5, r1, r2 @ orig - orig/10*10 => modulo (and update flags) beq check_if_pending_digits_exist proceed_with_conversion: add r5, #48 @ int -> char (only digits, so it's fine) strb r5, [r3, #-1]! @ write next char to RAM b iterate check_if_pending_digits_exist: cmp r0, #0 bne proceed_with_conversion BKPT_WRITE r3 mov pc, lr