If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
.syntax unified
.equ max3start,999
.equ max5start,995
number .req r4
matched .req r5
sum .req r6
max3 .req r7
max5 .req r8
.section .rodata
.align 2
string:
.asciz "%d\n"
.text
.align 2
.global main
.type main, %function
main:
stmfd sp!, {r4-r8, lr}
ldr max5, =max5start
ldr max3, =max3start
ldr number, =max3start @ start at 1000 - 1 ; numbers < 1000
mov matched, 0
mov sum, 0
loop:
cmp number, max3
bne test5
# matched a multiple of 3 - decrement max3
# add to sum and set matched to 1
mov matched, 1
add sum, sum, number
subs max3, max3, 3
test5:
cmp number, max5
bne last
# matched a multiple of 5 - decrement max5
# add to sum and set matched to 1
subs max5, max5, 5
cmp matched, 1 @ have we already added it?
addne sum, sum, number @ if not add it to the total
last:
# decrement number and reset matched and loop
mov matched, 0
subs number, number, 1
bne loop
mov r1, sum
ldr r0, =string @ store address of start of string to r0
bl printf
mov r0, 0
ldmfd sp!, {r4-r8, pc}
mov r7, 1 @ set r7 to 1 - the syscall for exit
swi 0 @ then invoke the syscall from linux
No comments:
Post a Comment