aboutsummaryrefslogtreecommitdiffstats
path: root/06-Sum-Square-Difference/asm/sumsq.asm
diff options
context:
space:
mode:
authormjfernez <mjfernez@gmail.com>2021-10-12 20:18:28 -0400
committermjfernez <mjfernez@gmail.com>2021-10-12 20:18:28 -0400
commit3cf128d6da667d00bb5bb659413ea55a98a02aff (patch)
tree12eb90997dfa63d65fe6da714626271272342320 /06-Sum-Square-Difference/asm/sumsq.asm
parent009ce017d99a8deb2089438381c273e8f3ea3b67 (diff)
downloadProject_Euler_Solutions-3cf128d6da667d00bb5bb659413ea55a98a02aff.tar.gz
Added description. x86 solutions for some problemsHEADmaster
Diffstat (limited to '06-Sum-Square-Difference/asm/sumsq.asm')
-rw-r--r--06-Sum-Square-Difference/asm/sumsq.asm49
1 files changed, 49 insertions, 0 deletions
diff --git a/06-Sum-Square-Difference/asm/sumsq.asm b/06-Sum-Square-Difference/asm/sumsq.asm
new file mode 100644
index 0000000..cc9295a
--- /dev/null
+++ b/06-Sum-Square-Difference/asm/sumsq.asm
@@ -0,0 +1,49 @@
+; Find the difference between (1+2+3+...+100)^2 and (1^2+2^2+3^2+...+100^2)
+; I used another math trick here:
+; The sum up to a number can be found using Gauss' Trick:
+; 1 + 2 + 3 + ... + 10 -> (1+9) + (2+8) + (3+7) + (4+6) + 10 + 5 -> 5*10 +5
+; In general : (n/2)(n+1)
+
+extern printf
+SECTION .data
+flag: db "%d",10,0 ; "%d\n\0"
+
+SECTION .text
+ global main
+ global is_divisible
+
+main:
+ push rbp ; set up stack
+ mov rbp, rsp
+
+ ; first square of sum (1+2+...100)^2
+ mov rax, 50 ; sum = n/2
+ mov rcx, 101 ; * (n + 1)
+ mul rcx
+ mul rax ; square it
+ push rax ; save it
+
+ ; now sum the squares (1^2+2^2 ...) no short cut this time
+ xor r11, r11 ; This will store the sum, rcx will b n,
+ ; rax is just used to multiply
+ mov rcx, 0 ; n = 0, we add one first
+
+.loop inc rcx ; see? told you :)
+ mov rax, rcx ; move into multiply register
+ mul rax ; multiply by itself
+ add r11, rax ; add to the sum
+ cmp rcx, 100
+ jne .loop
+
+ pop rax ; sum of the squares is on the stack
+ sub rax, r11 ; take the difference, rax - r11
+ ; square of the sum is bigger
+.print mov rdi, flag ; arg 1 (format)
+ mov rsi, rax ; arg 2 (value)
+ mov rax, 0 ; no xmm registers
+ call printf wrt ..plt
+ pop rbp
+
+ mov rax, 0
+ ret
+