# ProjectEuler.net Problem 4 – ARM Assembly

I am starting to play around with ARM Assembly, and to practice I decided to solve some problems on Project Euler with it. Below you’ll find problem 4 and its solution. Keep in mind that the code is not that efficient right now, as it’s taking about 2 minutes to run, but it does solve the problem correctly.

The problem:

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 99.

Find the largest palindrome made from the product of two 3-digit numbers.

The solution:

``````.extern printf
.global main

main:
push {ip,lr}

mov r4, #100
mov r9, #0
loop1:
mov r5, #100
loop2:
mul r1, r4, r5
bl isPalindrome
cmp r0, #1
bne continue
cmp r1, r9
blt continue
mov r9, r1
continue:
cmp r5, #1000
blt loop2
cmp r4, #1000
blt loop1

ldr r0, =printf1
mov r1, r9
bl printf

mov r0, #0
pop {ip,pc}

isPalindrome:
push {lr}
mov r6, #0
mov r7, #10
mov r2, r1
process:
bl findModulus

mov r12, r6
mul r6, r12, r7

bl divR2

cmp r2, #0
bgt process

pop {lr}

cmp r1, r6
beq equal
mov r0, #0
b finish
equal:
mov r0, #1
finish:
bx lr

findModulus:
mov r3, r2
start:
subs r3, r3, #10
bpl start
bx lr

divR2:
mov r8, #0

division:
cmp r2, #10
blt finishDiv
sub r2, r2, #10