ak3-labs-asm/lab1_v2.S

83 lines
1.3 KiB
ArmAsm

.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